同じ日・同じレジストリ、でも全く別の問題
3月31日、Claude Codeに関連して2つのセキュリティインシデントが報告された。SNSでは「Claude Codeがハッキングされた」と混同されて拡散したが、原因・影響・対応策は全く異なる。
| 事件① ソースマップ漏洩 | 事件② axiosマルウェア | |
|---|---|---|
| 原因 | Anthropicのビルド設定ミス | axiosメンテナのアカウント乗っ取り |
| 影響範囲 | Claude Codeの開発コードが閲覧可能 | npm installした全プロジェクト |
| 緊急度 | 中(直接被害なし) | 高(RAT感染の可能性) |
| 対応 | Anthropic側で対応済み | ユーザー自身で感染チェックが必要 |
| Claude Code固有か | Yes(Anthropicのパッケージ) | No(axios依存の全パッケージが対象) |
事件①:ソースマップが「設計図ごと出荷」してしまった
Claude Code v2.1.88のnpmパッケージに、Source Mapファイル(.map)が誤って同梱された。
Source Mapとは、圧縮・難読化されたコードと元のソースコードの「対応表」だ。開発時のデバッグには便利だが、本番に含めると元のコードが丸見えになる。
■ リーク前のnpmパッケージ(12MB単一ファイル)
var X6=function(K8){return K8.split("").reverse().join("")};
var Q3=X6("edoCresu")+"."+K8("noitcennoc");
→ 変数名が無意味な記号。解読には専用ツールと膨大な労力が必要
■ ソースマップ適用後(元のTypeScript)
const reverseString = (input: string): string => {
return input.split("").reverse().join("");
};
const endpoint = reverseString("userCode") + "." + "connection";
→ 変数名・コメント・構造がすべて復元。1,900ファイル・51万行が読める状態
なぜ起きたのか:ブラックリスト vs ホワイトリスト
Anthropicは .npmignore(ブラックリスト方式)でパッケージから除外するファイルを管理していた。Bunバンドラーがデフォルトで .map を生成する仕様と噛み合わず、漏れた。
// ❌ ブラックリスト方式(Anthropicが使っていた方法)
// .npmignore に書かれていないファイルタイプは全部入る
// → 新しいファイルタイプ(.map等)が漏れるリスク
// ✅ ホワイトリスト方式(推奨)
// package.json
{
"files": [
"dist/index.js", // ← これだけ入る
"README.md",
"LICENSE"
]
// ↑ ここに書いていないファイルは絶対に含まれない
}
漏洩の影響:攻撃者の「研究コスト」が下がった
漏洩したのはCLIツールの開発コードのみ。AIモデル本体やユーザーデータは含まれていない。
ただし、セキュリティモデル・権限制御の実装・内部API構造・107個のフィーチャーフラグが可視化されたことで、攻撃者が脆弱性を探すコストは劇的に低下した。詳細はClaude Codeソースコード流出の全貌で解説している。
事件②:axiosサプライチェーン攻撃 — こちらが本当に危険
週1億ダウンロードのHTTPライブラリ「axios」のメンテナアカウントが乗っ取られ、RAT(Remote Access Trojan)入りの偽バージョンがnpmに公開された。
このマルウェアの特徴
plain-crypto-js/
├── package.json # postinstall でスクリプト自動実行
└── scripts/
├── install.js # OS判定 + RAT配置
├── macos_payload # → /Library/Caches/com.apple.act.mond
├── windows_payload # → %PROGRAMDATA%\wt.exe
└── linux_payload # → /tmp/ld.py
- 全OS対応:macOS、Windows、Linuxそれぞれに専用ペイロード
- 自己削除:実行後に
plain-crypto-jsディレクトリを削除して痕跡を消す - Claude Code固有ではない:axiosに依存するすべてのnpmパッケージが対象
事件①の対応:ソースマップ漏洩はユーザー側の対応不要
ソースマップ漏洩はAnthropic側のビルド設定ミスであり、ユーザー環境への直接的な被害はない。Anthropicはソースマップを除去したアップデートを即座にプッシュし、以前のバージョンをレジストリから削除済み。
ユーザー側で必要な対応はない。ただし、Claude Codeのセキュリティモデルや内部実装が公開されたことで、今後新たな脆弱性が発見される可能性はある。通常通りアップデートを適用しておけば問題ない。
# Claude Codeを最新版に更新(念のため)
claude update
事件②の対応:axiosマルウェアの感染チェック手順
こちらはユーザー自身での確認が必要。axiosに依存するnpmパッケージすべてが対象で、Claude Code固有の問題ではない。
Step 1:axiosのバージョンを確認する
# npm の場合
npm list axios
# pnpm の場合
pnpm list axios
# yarn の場合
yarn list --pattern axios
# → [email protected] または [email protected] が出たら汚染バージョン
# → [email protected] や [email protected] 以前なら安全
Step 2:マルウェア本体の存在確認
# plain-crypto-js(RAT本体)が存在するか
ls node_modules/plain-crypto-js 2>/dev/null \
&& echo "🔴 感染の可能性あり" || echo "✅ 見つからない"
# 複数プロジェクトを一括チェック
find ~/projects -name "package-lock.json" -exec grep -l "plain-crypto-js" {} \;
Step 3:RAT痕跡の確認
# macOS
ls -la /Library/Caches/com.apple.act.mond 2>/dev/null \
&& echo "🔴 RAT検出" || echo "✅ 見つからない"
# Windows(PowerShell)
# Test-Path "$env:PROGRAMDATA\wt.exe"
# Linux
ls -la /tmp/ld.py 2>/dev/null \
&& echo "🔴 RAT検出" || echo "✅ 見つからない"
Step 4:感染確定時の対応
# 1. マルウェアの除去
rm -f /Library/Caches/com.apple.act.mond # macOS
rm -rf node_modules/plain-crypto-js
# 2. クリーンインストール
rm -rf node_modules package-lock.json
npm install
# 3. 認証情報のローテーション(最重要)
# RATがアクセスした可能性があるもの全て:
| ローテーション対象 | 確認場所 | 操作 |
|---|---|---|
| APIキー | .env, 環境変数 |
各サービスのダッシュボードで再発行 |
| SSHキー | ~/.ssh/ |
ssh-keygen で新規作成 → GitHubに登録し直し |
| AWSクレデンシャル | ~/.aws/credentials |
IAMコンソールでキーローテーション |
| CI/CDシークレット | GitHub Actions, etc. | リポジトリ設定から再設定 |
| npmトークン | ~/.npmrc |
npm token revoke → npm login |
注意:これはClaude Code固有の問題ではない
axiosの汚染はnpmエコシステム全体に影響するサプライチェーン攻撃だ。Claude Codeに限らず、axiosを依存関係に持つすべてのNode.jsプロジェクトが確認対象になる。自分のプロジェクトの package-lock.json をチェックしよう。
再発を防ぐ:npmパッケージ公開の3つのガード
今回の事件①(ソースマップ漏洩)を他人事にしないために。npmパッケージを公開するなら、この3つを入れておく。
ガード1:パブリッシュ前の中身確認
# パッケージに何が含まれるか事前確認
npm pack --dry-run
# ソースマップが混入していないかチェック
npm pack --dry-run 2>&1 | grep -i "\.map"
# → 何も出なければOK。出たら除外が必要
ガード2:package.jsonでホワイトリスト管理
{
"name": "my-package",
"files": [
"dist/",
"README.md",
"LICENSE"
]
}
.npmignore のブラックリスト方式は「書き忘れ」が起きる。files フィールドなら「書いたものだけ入る」。
ガード3:CIにソースマップ検証を追加
# .github/workflows/publish.yml
- name: ソースマップ混入チェック
run: |
if npm pack --dry-run 2>&1 | grep -q "\.map"; then
echo "::error::ソースマップがパッケージに含まれています"
exit 1
fi
- name: パッケージサイズ異常検知
run: |
SIZE=$(npm pack --dry-run 2>&1 | tail -1 | awk '{print $NF}')
echo "パッケージサイズ: $SIZE"
# ソースマップ混入時はサイズが異常に大きくなる
教訓:パニックではなく切り分けが大事
- 事件①(ソースマップ)は「攻撃の準備がしやすくなった」段階。直接被害はなく、Anthropic側で対応済み
- 事件②(axios)は「すでに実害の可能性がある」ステージ。npm版ユーザーは上記の感染チェックを実行すべき
- curl版(ネイティブ版)ユーザーはaxiosの影響を受けないと考えられる。公式はnpm非推奨でネイティブ版への移行を案内済み
パニックではなく、事実の切り分けと段階的な対応。それが、この手のインシデントを乗り切る最善策だ。