8月4日、The Hacker Newsが「Keyv-Linked npm Worm Poisons Hundreds of Packages, Plants Claude Code and VS Code Hooks」と題した記事を公開した。npmパッケージ「keyv」を起点に広がったワーム型マルウェアが数百のパッケージを汚染したこの攻撃では、正規のGitHub ActionsワークフローでビルドされたためSLSA・OIDCのプロベナンス検証をそのまま通過しており、さらにClaude CodeとVS Codeのフックを実行経路として悪用するという多層的な手口が確認されている。対応においても「認証情報失効ウォッチャーをローテーション前に除去しなければならない」という見落としやすい順序があり、開発者が知っておくべき内容が多い。
npmワームの起点は keyv@6.0.0
2026年8月4日、npmレジストリで大規模なサプライチェーン攻撃が確認された。最初の悪意あるリリースは keyv@6.0.0 だ。このバージョンには preinstall スクリプトとして node setup.mjs が追加されており、ライブラリ本体のコードは変更されていないため、一見すると正常なリリースに見える。
セキュリティ企業各社の調査による被害規模は以下の通りだ:
- SafeDep:79パッケージ名・353バージョンに汚染を確認(その後の継続監視で353パッケージ名・442バージョンまで拡大)
- Aikido:少なくとも868パッケージ・1,381バージョンと報告(ただし記事はこの数字の独立した検証ができていないとも指摘している)
ペイロードの動作:認証情報を根こそぎ奪う
preinstall 時に実行されるステージ1は、まずBun(Node.jsの代替として注目されるJavaScriptランタイム)の存在を確認し、なければGitHub公式リリースからBun 1.3.13をダウンロードする。その後、727,680バイトのコンパイル済みバンドルに処理を引き渡す。
SafeDepのペイロード解析によると、このバンドルは以下の情報を収集する:
- GitHub・npmの認証トークン
- クラウド認証情報(AWS等)
- HashiCorp Vault(シークレット管理ツール)・Kubernetesのシークレット
- データベース認証情報
- 秘密鍵(SSH等)
- GitHub Actionsのランナーメモリ
さらに収集した認証情報を使って、アクセス可能な他のnpmパッケージに自己増殖的に再感染させる機能も持つ。これがワームと呼ばれる所以だ。
AI開発者を直撃:Claude CodeとVS Codeのフック
特に見逃せないのが、Keyvリポジトリ自体に仕込まれた第2の実行経路だ。
- **
.claude/settings.json**:SessionStartフックとして.vscode/setup.mjsを呼び出す - **
.vscode/tasks.json**:runOn: folderOpen設定のEnvironment Setupタスクとして.claude/setup.mjsを実行する
つまり、汚染されたリポジトリをクローンして「ワークスペースを信頼」するか、VS Codeのタスク自動実行を許可しただけでペイロードが走る経路が存在する。
VS Codeは未信頼ワークスペースではタスクを自動実行せずプロンプトを出す設定がデフォルトであり、Claude Codeもプロジェクト設定にワークスペーストラストを適用する。記事の締め切りとなった8月4日午後5時40分(インド標準時)時点で、両フックファイルは main ブランチに残ったままだった。
SLSA・OIDCプロベナンスが「通過」していた
この攻撃でとりわけ厄介な点がある。汚染された keyv@6.0.0 は、プロジェクト正規のGitHub Actionsリリースワークフローを経由してビルドされたため、有効なOIDCおよびSLSAプロベナンス(来歴情報)が付与されていた。
SLSA(Supply-chain Levels for Software Artifacts)はGoogleが主導するサプライチェーンセキュリティフレームワークで、ビルドの来歴を証明する仕組みだ。しかし今回の攻撃は「ビルドプロセス自体は正規」だった——問題はそこに入力されたソースが安全でなかった点にある。来歴情報はビルドパスを正しく証明するが、ソースの安全性は保証しないという限界が露わになった形だ。
Claude CodeとVS Codeのフックを仕込んだコミットにも GitHubの「verified」バッジが付いており、著者は github-actions[bot] となっていた。署名の有効性は証明されているが、そのクレデンシャルを誰が操作したかは特定されていない。
マルウェアファミリーとの繋がり
Semgrepは2026年4月のPyPIパッケージ「lightning」への侵害で、同じ setup.mjs というファイル名・Bun 1.3.13のダウンロード・Claude CodeとVS Codeフックという構成を記録している。Aikidoは今回の活動を 「Shai-Hulud」ファミリーと関連付けている。ただし、8月の活動を誰が操作したかは現時点で不明だ。
対応時の注意点:ローテーション前にウォッチャーを除去せよ
SafeDepとSocketは、影響を受けたバージョンを実行したマシンはすべて認証情報漏洩済みとして扱うべきと述べている。
対応において見落としやすい重要な手順がある。トークンや鍵のローテーション前に、マルウェアが仕込んだ「認証情報失効ウォッチャー」を先に除去しなければならない。失効(revocation)操作がトリガーとなってローカルの攻撃者ハンドラが走る仕組みになっているためだ。順序を誤ると対応行為そのものが攻撃者側のコードを起動させてしまう。
なお、npm 12 はデフォルトで未承認の依存ライフサイクルスクリプトをブロックするが、それ以前のnpmクライアントやライフサイクルスクリプトを許可する他のインストール経路は依然として危険にさらされている。
タグが頻繁に変わっており、名前空間単位でのブロックリストは「汚染されたバージョンを見逃す」か「正常なリリースを誤検知する」リスクがある。正確なパッケージ名・解決済みバージョン・ロックファイルを使った個別確認が推奨される。
記事の締め切り時点で、メンテナ・npm・GitHubからの公式インシデント声明は確認されていない。
詳細はKeyv-Linked npm Worm Poisons Hundreds of Packages, Plants Claude Code and VS Code Hooksを参照していただきたい。