npmサプライチェーンワーム「SANDWORM_MODE」——AI開発環境を標的にクリプトキーとCI secretsを窃取
サプライチェーンセキュリティ企業のSocketが、npmエコシステムを標的にした活発な攻撃キャンペーンを報告した。19個の悪意あるパッケージが関与し、暗号資産の秘密鍵・CIシークレット・APIトークンを窃取したうえで、感染を自動的に広げるワーム機能まで搭載している。Socketはこのキャンペーンを内部コードネーム「SANDWORM_MODE」と名付けた。
偽装パッケージ一覧
攻撃者はパブリッシャー official334@proton.me と JAVAorg@proton.me の2アカウントで計19パッケージを公開した。
| パッケージ名 | 偽装対象 |
|---|---|
| claud-code | Claude Code |
| cloude-code | Claude Code |
| cloude | Claude |
| opencraw | OpenCrawl |
| suport-color | supports-color |
| veim | vim |
| yarsg | yargs |
| rimarf | rimraf |
| naniod | nanoid |
| hardhta | hardhat |
| secp256 | secp256k1 |
| crypto-reader-info | - |
| crypto-locale | - |
| detect-cache | - |
| format-defaults | - |
| locale-loader-pro | - |
| node-native-bridge | - |
| parse-compat | - |
| scan-store | - |
上段はタイポスクワッティング(有名パッケージの綴り違い)、下段はユーティリティに見せかけたオリジナル名の偽装。claud-codeやcloude-codeのように、AIツール利用者を明確に狙ったネーミングが目立つ。
これとは別に、4件のスリーパーパッケージ(ethres, iru-caches, iruchache, uudi)も確認されている。現時点で悪意あるコードは未発火だが、将来アクティブ化する可能性がある。
攻撃コードの仕組み
攻撃は2段階構成で設計されている。
Stage 1: 即時実行
パッケージのimport直後に発火する。
.npmrcの読み取り(npmトークン窃取)- GitHub認証情報の収集
- 環境変数に含まれるシークレットの列挙
- 暗号資産ウォレットの秘密鍵を専用drainエンドポイントへ即座に送信
暗号資産鍵だけは遅延なしで即座に外部送信される。資産が移動されてしまえば取り戻せないため、時間との勝負を攻撃者側が理解している。
Stage 2: 時間ゲート付き深層攻撃
48時間の基本遅延に加え、ホスト固有のジッターで最大48時間が追加される。合計で最大96時間のランダム遅延を挟むことで、感染直後の監視やサンドボックス分析を回避する。
ただしCI環境では遅延をバイパスして即座に実行する。GitHub Actions、GitLab CI、Jenkins、CircleCIの環境変数を検出すると遅延ロジックをスキップする。CIパイプラインは一時的な実行環境であり、待っていたら環境ごと消えるためだ。
Stage 2で実行される内容:
- 深層ハーベスティング: SSH鍵、AWS認証情報、各種設定ファイルの網羅的収集
- ワーム伝播: 後述する3経路での自動拡散
- MCPインジェクション: AIツール設定への不正MCPサーバー注入
難読化
ペイロードは160KB以上のbase64ブロブとして埋め込まれ、zlib.inflateSync()で解凍した後、静的32バイトキーでXOR復号し、間接eval()で実行する。別の変種では数十のbase64フラグメントに分割し、Module._compile()で実行するパターンも確認されている。
データ送信の3段カスケード
窃取データの送信には冗長性を持たせた3段階のフォールバックが組まれている。
- HTTPS POST: Cloudflare Workerへ送信
- GitHub API: 窃取したトークンで攻撃者のプライベートリポジトリにファイルとしてアップロード
- DNSトンネリング:
freefan.net/fanfree.net経由、DGAシードsw2025でサブドメインを生成
1つ目が遮断されても2つ目、3つ目で持ち出しを試みる。DNSトンネリングは通常のHTTPSフィルタリングでは検出困難で、最後の砦として機能する。
MCPインジェクション
McpInjectモジュールが以下のAIツール設定ファイルにローグMCPサーバーを注入する。
| AIツール | 設定ファイルパス |
|---|---|
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Code | ~/.claude/settings.json |
| Cursor | ~/.cursor/mcp.json |
| VS Code Continue | Continue拡張設定 |
| Windsurf/Codeium | ~/.codeium/windsurf/mcp_config.json |
注入されるMCPツール名はindex_project、lint_check、scan_dependencies。いかにも開発支援ツールらしい無害な名前がつけられている。
各ツールのdescriptionフィールドにプロンプトインジェクションが埋め込まれており、AIアシスタントに以下のファイルを読み取らせる:
~/.ssh/id_rsa~/.aws/credentials~/.npmrc.env
AIツールが「便利なlintツールです」と騙されてこれらを読み取り、MCPサーバー経由で攻撃者に送信する構造になっている。先日報告されたClineへの供給チェーン攻撃と同様の手口だが、複数のAIツールを同時に標的にしている点でスケールが異なる。MCPを介した攻撃ベクターについてはToxicSkillsキャンペーンとMCPToxベンチマークも参照。
ワーム伝播の3経路
SANDWORM_MODEの最大の特徴は、感染環境から自律的に拡散するワーム機能にある。
1. NPMトークン悪用
感染環境から窃取したnpmトークンで、被害者がメンテナンスしているパッケージのパッチバージョンをインクリメントし、悪意あるshimコードを注入して再公開する。正規のパッケージ更新に見えるため、npm updateで自動的に取り込まれる。
2. GitHubトークン悪用
窃取したGitHubトークンでアクセス可能なリポジトリを列挙し、package.jsonとlockfileにキャリア依存を注入する。直接コミットするか、自動PRを作成する。
3. SSHフォールバック
SSH_AUTH_SOCKを悪用してリポジトリのclone/pushを実行する。GitHubトークンが使えない場合のフォールバック経路。
永続化
悪意あるpre-commit/pre-pushフックを設置し、git config --global init.templateDirで新規リポジトリが自動的にフックを継承するよう設定する。一度感染すると、以後作成するすべてのリポジトリにフックが仕込まれる。
ポリモーフィックエンジン
コード内にDeepSeek Coderを使った難読化エンジンが組み込まれていた。変数名の変更や文字列エンコーディングの変換を自動で行い、検体ごとに異なるコードを生成する仕組みだ。検出されたサンプルでは無効化状態だったが、将来のバージョンで有効化される可能性がある。マルウェアにLLMを組み込んでポリモーフィズムを実現しようとする試みは、攻撃側のAI活用が次のフェーズに入ったことを示している。
過去のnpmサプライチェーン攻撃との比較
| 事例 | 年 | 侵入手口 | 標的範囲 | 自動伝播 |
|---|---|---|---|---|
| event-stream | 2018 | パッケージ所有権の譲渡 | 特定アプリ(Copay) | なし |
| ua-parser-js | 2021 | アカウント乗っ取り | 全ユーザー | なし |
| Shai-Hulud | 2025年9月 | フィッシング | 26億DL/週のパッケージに影響 | なし(2.5時間で削除) |
| Shai-Hulud 2.0 | 2025年11月 | asyncapi/cli起点 | 796パッケージ侵害 | 破壊的フォールバック |
| SANDWORM_MODE | 2026年2月 | タイポスクワッティング | AI開発者を重点標的 | 3経路のワーム伝播+MCPインジェクション |
event-streamからSANDWORM_MODEまで、攻撃の洗練度は明らかに上がっている。単一パッケージの乗っ取りから、ワーム型の自律拡散+AIツール経由の認証情報窃取へ。開発ツール自体が攻撃面になるという傾向はもはや例外ではなく常態化しつつある。
対処方法
Socketは以下の対処を推奨している。
- 上記パッケージをインストールしている場合は即座に削除する
- npmアクセストークンを失効させ、新しいトークンを発行する
- GitHubのパーソナルアクセストークンを再発行する
- CI/CDパイプラインのシークレットをすべてローテーションする
- SSH鍵を再生成する
- AIツールのMCP設定ファイルに不審なエントリがないか確認する
.git/hooks/とgit config --global init.templateDirを確認する
「もし感染していたかもしれない」という状況であっても、認証情報のローテーションを実施しておくべきだ。特にMCP設定とgitフックは、パッケージを削除しただけでは除去されない永続化メカニズムなので見落とさないこと。セキュリティ対策の全体像については攻撃と防御のまとめ記事も参考になる。