🏠 ホーム ニュース 📚 トピック解説 🏷️ タグ一覧 ℹ️ About
🔍 記事を検索
カテゴリ
📡 RSSフィード
Follow
X (Twitter) Threads
Quick Links
ニュース一覧 🏷️ タグから探す
🧠 Claude 🤖 Agent 💬 LLM 🔌 MCP 🛠️ Tool
Subscribe
📡 RSSフィード
Breaking News
2026.03.31 15:52 security devops

【速報】JavaScript主流ライブラリAxios、NPM供給チェーン攻撃でRAT配布

🚨 ニュース
🚨 AI Heartland News
TL;DR
JavaScriptの週間1億DL HTTPクライアント「Axios」がNPM供給チェーン攻撃の被害に。[email protected]と0.30.4に悪意あるパッケージplain-crypto-jsが注入され、クロスプラットフォーム対応RATが配布。証拠自動削除機能を備えた高度な攻撃。

何が起きたか

週間1億ダウンロードを記録するJavaScript HTTPクライアント「Axios」が供給チェーン攻撃の被害に遭った。影響を受けたバージョンは[email protected](1.x系)と[email protected](0.x系)の2つ。攻撃者はメンテナのNPMアカウントを侵害し、悪意あるパッケージ[email protected]を依存関係として注入。リモートアクセストロイの木馬(RAT)が配布された。

StepSecurityとSocketの両社がそれぞれ独立に検出・分析し、「業界最高水準のサプライチェーン攻撃」と評価している。

攻撃の時系列

時刻(UTC) 事象
3月30日 23:59:12 [email protected]がnpmに公開
3月31日 00:05:41 Socketのスキャナーがマルウェアを検知(公開からわずか6分
3月31日 前後39分間 侵害済みAxios 2バージョンがnpmに公開
侵害期間中 両バージョンがライブ状態で配布

メンテナアカウントの侵害

攻撃者はAxios主要メンテナのNPMアカウントを奪取し、登録メールを匿名のProtonMailアドレスに変更。長期有効なNPMアクセストークンを利用して手動公開を実行し、通常のOIDC Trusted Publisher機構をバイパスした。

正規リリースと侵害リリースのnpm registryメタデータ比較:

// axios@1.14.0  正規
"_npmUser": {
  "name": "GitHub Actions",
  "email": "[email protected]",
  "trustedPublisher": {
    "id": "github",
    "oidcConfigId": "oidc:9061ef30-3132-49f4-b28c-9338d192a1a9"
  }
}

// axios@1.14.1  侵害
"_npmUser": {
  "name": "jasonsaayman",
  "email": "[email protected]"
  // trustedPublisher なし、gitHead なし、GitHub コミット/タグ なし
}

侵害版にはOIDC認証情報もGitHub上の対応コミットも存在しない。axios GitHubリポジトリに1.14.1のコミットやタグは存在せず、このバージョンはnpmにのみ存在する。

依存注入の手口

攻撃者はaxiosのpackage.jsonにplain-crypto-js: "^4.2.1"を1行だけ追加した。他の依存は一切変更しない「手術的」な修正。

正規版と侵害版のdependencies比較:

// axios@1.14.0  正規
"dependencies": {
  "follow-redirects": "^1.15.6",
  "form-data": "^4.0.0",
  "proxy-from-env": "^1.1.0"
}

// axios@1.14.1  侵害
"dependencies": {
  "follow-redirects": "^1.15.6",
  "form-data": "^4.0.0",
  "proxy-from-env": "^1.1.0",
  "plain-crypto-js": "^4.2.1"  //  追加されただけ
}

npm install [email protected]を実行すると、npmが依存ツリーを解決してplain-crypto-jsを自動インストールし、直後にpostinstallスクリプトを無条件実行する。

axios本体のソースコードにplain-crypto-jsのimport/requireは一度もない。 package.jsonに追加された唯一の目的はpostinstallフックの実行。

RATドロッパーの技術詳細

難読化テクニック

setup.js(4,209バイト)は2層の難読化スキームを採用。すべての機密文字列が符号化配列に格納されている。

// 難読化層1: XOR暗号
_trans_1(x, r) {
  // キー処理を伴うXOR変換
  return charCode XOR key[(7 × r × r) % 10] XOR 333
}

// 難読化層2: 外層
_trans_2(x, r) {
  // 文字列反転 → 記号置換 → base64-decode → _trans_1に渡す
}

デコード後の配列要素(抜粋):

用途 デコード値
シェル実行 child_process
プラットフォーム判定 os
ファイルシステム操作 fs
C2ベースURL http://sfrclak.com:8000/
Windows識別子 win32
macOS識別子 darwin
削除対象ファイル package.json
clean版スタブ package.md

プラットフォーム別ペイロード

ドロッパーはos.platform()をチェックし、3つの攻撃パスに分岐する。

OS ペイロード配置先 偽装方法 実行方法
macOS /Library/Caches/com.apple.act.mond Appleシステムデーモンに偽装 AppleScript → osascript
Windows %PROGRAMDATA%\wt.exe PowerShellコピー+隠しVBScript 3段階攻撃チェーン
Linux /tmp/ld.py Pythonスクリプト curl → nohup python3

3プラットフォーム全てが同じC2エンドポイント(sfrclak[.]com:8000)に接続し、IE8/Windows XPを模したUser-Agentで通信する。macOS RATバイナリにはコマンド実行(peinject、runscript)、ファイルシステム列挙(rundir)、プロセス終了(kill)の機能が含まれる。

sequenceDiagram participant dev as 開発者 participant npm as npm install participant setup as setup.js participant c2 as C2 Server participant payload as Platform RAT dev->>npm: npm install [email protected] npm->>npm: 依存ツリー解決 → plain-crypto-js インストール npm->>setup: postinstall: node setup.js setup->>setup: 2層難読化を解除 setup->>setup: os.platform() で分岐 setup->>c2: C2に接続(sfrclak.com:8000) c2->>payload: プラットフォーム別RAT配布 payload->>payload: バックグラウンドで常駐 setup->>setup: setup.js 自己削除 setup->>setup: package.json → clean版で上書き

法医学的証拠の自動削除

ペイロード起動後、setup.jsは3つのクリーンアップを実行:

// 1. 自分自身を削除
fs.unlink(__filename)  // setup.js を削除

// 2. postinstall フックを削除
fs.unlinkSync('package.json')  // 証拠となるスクリプト行を削除

// 3. clean スタブで上書き
fs.renameSync('package.md', 'package.json')  // 正常版に置き換え

感染後のnode_modules/plain-crypto-js/package.jsonを検査しても、postinstallスクリプトもsetup.jsファイルも存在しない。npm auditでは侵害を検出できない。

侵害の確認方法

最も確実な方法:

# 強制的に確認する方法
ls -la node_modules/ | grep plain-crypto-js

# 存在するなら侵害確定
# 理由: plain-crypto-js はどの正規 axios バージョンにも依存していない

node_modules/plain-crypto-js/ ディレクトリ自体の存在が侵害の確証。このパッケージは正規axiosのいずれのバージョンにも依存していないため、このディレクトリが見つかればドロッパーは既に実行されている。

開発者が取るべき対応

  1. ロックファイルを確認[email protected]または[email protected]、plain-crypto-jsの存在をチェック
  2. 該当バージョンを検出したら即座にロールバック — 既知の安全なバージョンへ戻す
  3. 認証情報をローテーション — 環境内のAPIキー、トークン、シークレットを全て更新
  4. 機能ブランチとOpen PRも確認対象 — CI/CDで侵害バージョンが使われていないか
  5. SocketのDependenciesページで露出状況を確認

なぜ「業界最高水準」と評価されたか

特徴 詳細
綿密な準備 18時間かけてパッケージ事前準備、タイミング同期
3プラットフォーム対応 macOS/Windows/Linux 個別ペイロード
ビルドパイプラインバイパス OIDC Trusted Publisherを回避して手動公開
証拠自動削除 痕跡が消え、事後調査を無効化
検出困難性 npm audit不可、ソースコードレビュー不可

参考リンク


この記事はAI業界の最新動向を速報でお届けする「AI Heartland ニュース」です。

よくある質問
Q. Axiosのどのバージョンが影響を受けたか
[email protected](1.x系)と[email protected](0.x系)の2バージョン。両方ともnpmにのみ存在し、GitHubリポジトリに対応するコミットやタグはない。
Q. 悪意あるパッケージの正体は何か
[email protected]。正規のcrypto-jsに偽装されたパッケージで、postinstallフックでRATドロッパー(setup.js)を実行する。任意コマンド実行、データ流出、永続化が可能。
Q. 侵害されたことをどう確認できるか
node_modules/plain-crypto-js/ ディレクトリの存在が侵害の確証。このパッケージは正規axiosのいずれのバージョンにも依存していない。setup.jsやpackage.jsonは自動削除されるためnpm auditでは検出不可。
Q. 開発者が今すぐ実施すべきアクションは何か
依存関係とロックファイルを確認し、[email protected]または[email protected]を検出したら即座にロールバック。環境内の認証情報もローテーションする。機能ブランチとOpenプルリクエストも確認対象。
Q. なぜnpm auditで検出できないのか
RATドロッパーは実行後にsetup.jsを自己削除し、package.jsonのpostinstallフックも削除してclean版で上書きする。事後の静的検査では痕跡が残らない設計。
← AIコーディングエージェント「Superpowers」公開—TDD・仕様管理を自動注入 Ollama、Apple SiliconでMLX搭載へ。M5チップで最大3倍高速化を実現 →