人気npmパッケージ「Keyv」を起点とするワームが拡散、数百件のパッケージが汚染され認証情報が標的に
要点
-
人気のnpmパッケージ「Keyv」のバージョン6.0.0において、認証情報を標的とするワームの混入が確認された。
-
汚染はKeyvやCacheableなどの関連パッケージを超えて拡大しており、数百件以上のパッケージに影響が及んでいる。
-
マルウェアは開発環境やCI環境で動作し、GitHubやnpm、クラウドサービスなどの認証情報を窃取して自身をさらにパブリッシュする仕組みを持つ。
-
感染環境でトークンを再生成すると攻撃者のローカルハンドラーが実行される危険性があり、事前に監視ウォッチャーの削除が必要とされる。
-
汚染されたリポジトリには、VS CodeやClaude Codeの自動実行機能を悪用してペイロードを実行する第2の経路も埋め込まれていた。
-
2026年8月4日、オープンソースのパッケージ管理システム「npm」において、人気ライブラリ「Keyv」のバージョン6.0.0を起点とする大規模なサプライチェーン攻撃が発生していることが明らかになった。セキュリティ企業のSafeDepやAikido、Socketらの報告により判明した。この攻撃は、開発環境や継続的インテグレーション(CI)環境から各種の認証情報を盗み出し、さらに汚染パッケージを自己増殖的に拡散させるワームとして機能しているという。
被害規模の報告とレジストリの混乱
今回の攻撃について、セキュリティ企業の間で確認されている被害規模にはばらつきがある。SafeDepは、npmレジストリ上の79個のパッケージ名にわたる353個の汚染されたバージョンを検証したと発表した。同社のモニタリングでは、全体で353個のパッケージ名、442バージョンに影響が広がっていると推定している。一方で、別のセキュリティ企業Aikidoは、少なくとも868個のパッケージ、1,381バージョンが汚染されたと報告している。レジストリの変化が非常に速いため、報告の締め切り時点において、公開されている完全なリストから広範な被害総数を独立して再現することは困難であったという。
npmレジストリ上では状況が急変しており、8月4日のインド標準時(IST)午後5時40分時点で、SafeDepが初期に確認したパッケージのうち、「keyv@5.6.0」「flat-cache@6.1.23」「cache-manager@7.2.9」など少なくとも9つのパッケージについて、問題のない以前のリリースバージョンが最新(latest)タグとして再設定されている。そのため、特定のパッケージ名やキャッシュされたリストに依存するのではなく、プロジェクト内で実際に解決された詳細なバージョンやロックファイルを個別に確認することが推奨されている。
認証情報の窃取と自己増殖の仕組み
最初に確認された悪意あるリリースは「keyv@6.0.0」だった。このバージョンでは、ライブラリのコンパイル済みコード自体は変更されていないものの、パッケージ内に「setup.mjs」と「Math_Symbol.js」というファイルが追加され、インストール時に自動実行される「preinstall」コマンドとして「node setup.mjs」が設定されていた。
この第1段階のスクリプトが実行されると、システム内にJavaScript実行環境の「Bun」が存在するかを確認し、存在しない場合はBunの公式GitHubリリースからバージョン1.3.13をダウンロードする。その後、727,680バイトのコンパイル済みバンドルファイルへと処理を引き渡す。
SafeDepの解析によると、このバンドルファイルは、GitHub、npm、各種クラウドサービス、シークレット管理ツールのVault、Kubernetes、データベース、秘密鍵のデータを収集する。さらに、GitHub Actionsランナーのメモリを読み取り、トークンの失効を検知する「トークン失効監視ウォッチャー」をインストールする機能や、npmへパッケージをパブリッシュする仕組みを備えているという。Socketも同様に、盗み出したnpmの認証情報を悪用してパッケージを変更・バージョンアップし、再パブリッシュするためのコードがデコードされたと報告している。
セキュリティ対策上の警告
Socketは、影響を受けるバージョンを実行したすべての開発用端末やCI環境のランナーについて、認証情報が外部に漏洩したものとして扱うべきだと警告している。
また、漏洩したトークンや鍵をローテーション(再生成して無効化)する際には手順に注意が必要である。SafeDepの指摘によると、今回インストールされるマルウェアは、トークンの失効処理をトリガーとして機能する監視ウォッチャーを内蔵している。そのため、マルウェアの監視ウォッチャーを削除する前にトークンをローテーションすると、攻撃者が提供したローカルハンドラーが実行されてしまう可能性がある。安全に対処するためには、まずウォッチャーを取り除いてからトークンの更新を行う必要があると説明している。
なお、最新の「npm 12」では、デフォルトで未承認の依存関係ライフサイクルスクリプト(パッケージインストール時に実行されるスクリプト)の実行をブロックする仕様となっているが、古いバージョンのnpmクライアントや、ライフサイクルスクリプトの実行を明示的に許可している環境では依然としてこの脅威に対して無防備な状態となっている。
VS CodeやClaude Codeを悪用した第2の経路
今回の攻撃では、パッケージのインストールを伴わないもう一つの実行経路も確認されている。Keyvのリポジトリの「main」ブランチには、AI支援ツール「Claude Code」やコードエディタ「VS Code」の自動実行機能を悪用した設定が残されていた。
具体的には、リポジトリ内の設定ファイル「.claude/settings.json」に、プロジェクト開始時に「.vscode/setup.mjs」を呼び出す「SessionStart」フックが設定されていた。同時に「.vscode/tasks.json」には、フォルダーを開いた際に「.claude/setup.mjs」を呼び出す「Environment Setup」タスクが記述されていた。これらにより、チェックアウトしたリポジトリのフォルダーを開くだけで、悪意あるペイロードが実行される経路が形成されていたという。
ただし、これらの自動フックは無条件に実行されるわけではない。VS Codeはデフォルトで、信頼されていないワークスペースでのタスクの自動実行を制限し、ユーザーに確認を促す仕様となっている。また、Claude Codeもリポジトリが提供するプロジェクト設定に対してワークスペースの信頼レベルを適用するため、ユーザーが明示的にワークスペースを信頼しない限り、自動実行は防止されるとしている。
(補足:npmとは、JavaScriptで書かれたソフトウェアの共有や管理を行うための標準的なパッケージ管理システムであり、世界中の開発者やCI環境で広く利用されている。)