npmワーム、正規の署名付きで868パッケージに拡散
詳細を読む
npm のライブラリ keyv を管理する開発者の GitHub アカウントが8月4日に乗っ取られ、認証情報を盗むワーム「Shai-Hulud」が npm 上に広がりました。Aikido の集計で被害は868パッケージ・1381バージョンに及び、月20億回以上インストールされる規模です。深刻なのは、汚染された最初のリリースが偽造ではない正規の来歴証明(provenance)を伴っていた点です。
攻撃者は管理者が持つ各リポジトリの main ブランチへ悪意あるファイルを直接送り込み、そのままリリースを切りました。ビルドが管理者自身の GitHub Actions ワークフローを通ったため、npm は本物と区別できない署名を自動で発行したのです。JFrog が確認した経路では、ワークフロー内で OIDC トークンを公開用トークンに交換し、Sigstore の証明書まで生成していました。
一件の乗っ取りがレジストリ全体の事故に変わったのは、ワームが自己増殖したからです。侵入先で見つけた npm の公開トークンを使って被害者が管理する別のパッケージにも裏口を仕込むため、汚染された開発者が次々と配布元になっていきました。keyv は多くのツールの間接依存に潜むため、Deliveroo や Qlik、Picsart など企業スコープのパッケージにも被害が及んでいます。
盗まれていたのはキャッシュ用ライブラリではなく、クラウドの認証鍵と CI のシークレットでした。Wiz によると、ワームは Visual Studio Code と Anthropic の Claude Code が使う .claude ディレクトリにも常駐用ファイルを置き、エディタや AI コーディングを起動した時点で動くようにしていました。開発者が最も信頼し、最も点検しない場所が狙われた形です。
では何をすべきでしょうか。CrowdStrike の Adam Meyers 氏は、公開直後のバージョンを取り込まない「冷却期間」を勧めます。npm は2026年2月の CLI 11.10.0 で min-release-age、pnpm はさらに早く minimumReleaseAge を実装しており、取り込みを一週間遅らせるだけで汚染を検知する猶予が生まれます。
GitHub は公開時の二要素認証の必須化や trusted publishing で防御を固め、npm 12 では preinstall などのスクリプトを既定で無効にしました。JFrog は npm 12 以降なら今回のワームがインストール時に動かないと確認していますが、旧版のまま運用する企業は露出したままです。手薄なのは誰が公開できるかという ID の管理で、Meyers 氏の言う「彼らは侵入せず、ログインする」が今回の核心でした。