この記事ではセキュリティに特化して解説します。AIセキュリティ全般は サプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリスト をご覧ください。

axiosサプライチェーン攻撃の全容 ── 何が起きたか

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

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

axios攻撃の時系列 ── 公開から検知まで6分

時刻(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フックの実行。

axiosマルウェアの技術詳細 ── 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では侵害を検出できない。

axiosマルウェア感染の確認方法

最も確実な方法:

# 強制的に確認する方法
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ページで露出状況を確認

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

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

Claude Codeユーザーへの影響 — 「Claude Code axios」検索が急増した本当の理由

この攻撃はaxiosに依存するすべてのnpmパッケージに影響するが、Claude Codeユーザーの間で特に話題になった理由がある。同日にClaude Codeのソースコード流出事件が発生し、SNSで2つの事件が混同されたためだ。Google検索で「claude code axios」のクエリが事件直後に急増した背景はこの混同にある。

切り分けのポイント: axiosマルウェアはClaude Code固有の問題ではなく、npmエコシステム全体の問題。Claude Codeをcurl版(ネイティブ版)でインストールしている場合はnpmの依存解決を経由しないため、影響を受けないと考えられる。

Claude Code × axios 影響有無の自己診断スクリプト

Claude Codeを使う環境でaxios侵害バージョンが混入していないか、1コマンドで切り分けるためのスニペット。Claude Code 公式の.claude/skillsやMCPサーバーがnpm経由でaxiosを引き込んでいる場合のみ影響対象となる。

# 1. グローバルnpmにClaude Code関連パッケージが入っているか確認
npm ls -g --depth=0 2>/dev/null | grep -iE "claude|anthropic"

# 2. ホームディレクトリ配下で侵害バージョンのaxiosをスキャン
find "$HOME" -name "package-lock.json" -not -path "*/node_modules/*" 2>/dev/null \
  | xargs grep -l "axios" 2>/dev/null \
  | while read f; do
      grep -E '"axios": "(1\.12\.[0-9]+|1\.13\.0)"' "$f" && echo "  ⚠ Affected: $f"
    done

# 3. Claude Codeのcurl版(ネイティブ)かnpm版かを確認
which claude
# /Users/.../.claude/local/claude → curl版(影響なし)
# /usr/local/bin/claude → npm版(要確認)

curl版でインストールしているユーザーは追加対応不要。npm版の場合のみ、npm audit実行と@anthropic-ai/claude-codeのクリーン再インストールを推奨する。

2つの事件の違いと感染チェック手順の詳細は、感染チェックコマンド付きの詳細解説記事で整理している。

関連記事: サプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリスト

参考リンク


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