npmの「信頼の証明」を逆手に取ったワーム。400超のパッケージが汚染

Shai-Hulud系列の自己増殖型マルウェアChainDropが、npmレジストリで過去最大の被害を出した。正規の出所証明をまとい、月間ダウンロード20億回超のパッケージ群に拡散している。

npmの「信頼の証明」を逆手に取ったワーム。400超のパッケージが汚染

Shai-Hulud系列の自己増殖型マルウェアChainDropが、npmレジストリで過去最大の被害を出した。正規の出所証明をまとい、月間ダウンロード20億回超のパッケージ群に拡散している。


信頼された鍵が開けた扉

npmレジストリで広く使われるキャッシュライブラリKeyvのメンテナーが、現地時間2026年8月4日にGitHubアカウントを乗っ取られた。

Keyvの週間ダウンロードは約1億2,700万にのぼる。攻撃者はこのアカウントを足がかりに、同じメンテナーが管理するCacheable(月間2,900万)、flat-cache(月間5億6,500万)、file-entry-cache(月間5億5,700万)など計11パッケージに悪意あるコードを注入した。

手口はメインブランチへの直接コミットだった。セキュリティ企業Aikidoの分析によると、攻撃者はコードをプッシュした直後に新しいリリースを切り、正規のGitHub Actionsワークフローでnpmに公開させた。

2026年3月のAxios侵害では、攻撃者がnpmの認証トークンを盗んでnpm publishを直接叩いたため、出所証明が付かなかった(npmではこれをプロベナンスと呼ぶ)。今回は違う。ChainDropはメインブランチ経由でビルドを走らせることで、npmの署名付きプロベナンスを正規に取得している。パッケージマネージャーの検証機能をすり抜けるだけでなく、「検証済み」の表示を攻撃の盾にした。

4時間で400超のパッケージへ

汚染パッケージには2つのファイルが追加された。ドロッパーのsetup.mjsと、情報窃取スクリプトMath_Symbol.jsだ。package.jsonには"preinstall": "node setup.mjs"が書き加えられ、npm installを実行した時点でドロッパーが自動的に動く。

setup.mjsはBunのJavaScript実行環境を公式のGitHubリリースからダウンロードし、Math_Symbol.jsを起動する。Node.jsとは別のランタイムで動かすことで既存のセキュリティ監視を避ける狙いとみられる。実行後、ドロッパーはBunのディレクトリごと痕跡を消す。

Math_Symbol.js728KBの難読化されたJavaScriptで、開発環境やCI/CDランナーに保存された認証情報を根こそぎ収集する。対象はnpmトークン、GitHubの個人アクセストークンとワークフロートークン、AWSの認証情報とSecrets Manager、Kubernetesのシークレット、HashiCorp Vaultのトークン、Stripe・Slack・Twilio・Azure・GCPの認証情報にまで及ぶ。GitHub Actionsのセルフホストランナーでは、ランナープロセスのメモリを直接読み取ってisSecretフラグの付いたシークレットを抽出するコードも確認されている。

盗んだトークンはすべて、実際に有効かどうかをregistry.npmjs.org/-/whoamiでリアルタイムに検証してから持ち出す。

収集した認証情報はRSA公開鍵で暗号化され、攻撃者が作成した公開GitHubリポジトリに送信される。リポジトリの説明文には「Shai-Hulud: Here We Go Again」と書かれており、Aikidoの報告時点でこの文字列を含む公開リポジトリが約1,300件確認されている。

ワームが自分で増える仕組み

ChainDropは盗んだ認証情報で、他のメンテナーのパッケージにまで感染を広げる。

npmトークンを盗むと、そのトークンに紐づくすべてのパッケージを列挙し、現在のtarball(パッケージの圧縮ファイル)をダウンロードする。パッチバージョンを1つ上げ、setup.mjsmath_init.jsMath_Symbol.jsと機能的に同一)、そしてpreinstallスクリプトを注入して再公開する。

この仕組みにより、Keyvのメンテナーのパッケージを使っていた別の開発者のパッケージが次々と汚染された。各セキュリティ企業の集計は時点によって異なり、Aikidoは少なくとも868パッケージ(1,381バージョン)、StepSecurityは444パッケージ(2,212バージョン)と報告している。影響を受けたパッケージの月間ダウンロード数は合計20億回を超える。感染はDeliveroo、Ornikar、OneReach、Picsart、Qlik、ServiceTitanといった企業のパッケージにも広がった。

二次感染で生まれたパッケージはMath_Symbol.jsではなくmath_init.jsというファイル名を使う。この違いが、初期感染(メンテナーアカウントの直接侵害)と二次感染(ワームによる自動拡散)を区別する目印になっている。

指揮統制をブロックチェーンに隠す

GitHubリポジトリへの送信が失敗した場合のバックアップとして、npm-cache[.]comというドメインが使われている。Wizの分析によると、このドメインは2026年5月22日に登録された。

このドメインはペイロードにハードコードされていない。イーサリアムのスマートコントラクトから動的に取得される。攻撃者はイーサリアムのメインネット上にコントラクトを展開し、eth_callで指揮統制ドメインを問い合わせる。コントラクトの更新履歴を見ると、当初は3つのドメインが設定されていたが、後にnpm-cache[.]com1つに絞られている。

コントラクトの所有者アドレスは、過去に詐欺行為と関連づけられたアドレスから資金提供を受けていた。この手法により、攻撃者はマルウェア自体を変更することなく指揮統制インフラを切り替えられる。

開発ツールに潜む持続性

ChainDropはghs_トークン(GitHub Appのサーバー間認証トークン)を見つけると、アクセス可能なリポジトリの最大50ブランチにコミットを行う。dependabotcopilotのブランチは避け、直近で活発なブランチから順に処理する。

コミット先は.claude/settings.json.vscode/tasks.jsonだ。そのリポジトリをVS CodeやClaude Codeで開いた開発者の環境で、npm installなしにペイロードが自動実行される。コミットの作者名はclaude、メールアドレスは[email protected]、メッセージはchore: update config。通常のコミットに紛れるよう設計されている。

Wizによると、Shai-Hulud系列の以前の波と比べて認証情報の窃取対象が約70%拡大された。Claude・OpenAI・Codex・Cursor・GeminiのAIエージェント設定ファイル、Foundry・Solana・MoneroのウォレットのKeystoreファイル、Jenkins・Argo CD・HarborなどのCI/CDシステムのシークレット、さらにはLinuxの/etc/shadowまでが新たに加わっている。

Shai-Huludの系譜

Shai-Hulud(シャイ=フルード、SF小説「デューン」に登場する砂虫)の名を冠するnpmワームは、2025年9月に最初に出現した。以来、繰り返し新たな波が押し寄せている。

2026年3月にはAxiosが侵害され、週間約1億ダウンロードのライブラリに約3時間にわたり遠隔操作型のマルウェアが仕込まれた。4月にはTeamPCPと名乗るグループによるMini Shai-Huludキャンペーンが始まり、5月にはTanStackが標的になった。この攻撃ではOpenAIの従業員2名の端末が感染し、限定的ながら社内リポジトリへの不正アクセスが発生したことをOpenAI自身が公表している。6月にはRed Hatの@redhat-cloud-services配下の32パッケージがMiasmaと呼ばれる亜種に侵害された。同月、node-gyp周辺でも57パッケージが被害を受けた。

今回のChainDropは、この系列の中でパッケージ数・ダウンロード規模ともに過去最大だ。Palo Alto NetworksのUnit 42は、Shai-Huludの出現によってnpm攻撃が「迷惑行為」の時代から「高影響度の脅威」の時代に移行したと評価している。

Shai-Hulud系列npmサプライチェーン攻撃の推移
2025年9月
Shai-Hulud初出
tinycolorなど500近いパッケージに感染。npmワーム初の自己増殖型
2026年3月
Axiosが侵害される
週間約1億DLのライブラリに遠隔操作型マルウェア。約3時間で削除
2026年4月
Mini Shai-Hulud開始
TeamPCPと名乗るグループによるキャンペーン
2026年5月
TanStack侵害。OpenAI従業員も感染
OpenAIの社内リポジトリに限定的な不正アクセス
2026年6月
Red Hat、node-gyp周辺で89パッケージ被害
Miasma亜種で32パッケージ、node-gyp周辺で57パッケージ
2026年8月
ChainDrop。過去最大の被害
400超パッケージ、月間DL20億回超。プロベナンス付き
※Shai-Huludは小説「デューン」の砂虫に由来するマルウェア系列名。プロベナンス=npmの署名付き出所証明

影響を受けた環境での対応

汚染バージョンをインストールした環境は、パッケージを削除しても侵害済みとして扱う必要があるpreinstallスクリプトはインストール時に実行されるため、パッケージの削除だけでは認証情報の窃取を取り消せない。

安全なバックアップからシステムを再構築し、影響を受けた環境でアクセス可能だったすべてのトークンとシークレットをローテーションする。ログとリポジトリに不正アクセスや予期しないコミットがないかも確認が要る。

侵害済みパッケージの一覧はWiz、StepSecurity、Aikido、Socket、Ox Securityがそれぞれ公開している。攻撃は進行中で、侵害パッケージの数は増え続けている。

1年足らずの間に、npmの供給網は同じ構造的弱点を繰り返し突かれてきた。一人のメンテナーのアカウントが破られれば、そこからドミノが始まる。プロベナンスの検証は「誰が公開したか」を証明するが、「その人のアカウントが安全か」は証明しない。

関連記事

この記事を共有する