週1億回以上ダウンロードされる人気ライブラリ「keyv」の保守担当者のGitHubアカウントが侵害された。これをきっかけにnpmエコシステム全体に感染を拡大させる自己増殖型マルウェアが出現している。開発者が今すぐ確認すべきポイントとは。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Aikido Securityは2026年8月4日(現地時間、以下同)、キーバリュー型ストレージライブラリ「keyv」の保守担当者の「GitHub」アカウントが侵害され、認証情報を盗むマルウェアが関連のnpmパッケージに混入したと報告した。
keyvは週約1億2700万回ダウンロードされる人気ライブラリ。同保守担当者が管理する「cacheable」「flat-cache」「file-entry-cache」なども被害に遭ったことが分かっている。
攻撃者は悪意のあるファイルをmainブランチに直接追加し、その直後に新版を公開した。パッケージは「GitHub Actions」による正規のビルドとして署名された状態でnpmに配布されたため、利用者からは通常の正規アップデートと見分けが付きにくかったという。
悪意あるコードを含む版には「keyv 6.0.0」「flat-cache 6.1.24」「file-entry-cache 11.1.6」「cacheable-request 13.0.20」「cacheable 2.5.1」「cache-manager 7.2.10」などが含まれる。
被害は同管理者のパッケージだけでなく「@deliveroo/reevent」「@picsart/ai-sdk」「@qlik/embed-runtime」「picasso.js」などにも波及した。keyv単体では週約1億2700万回ダウンロードされているが、2026年8月5日午後1時15分の時点では、少なくとも444パッケージ、1381バージョンが侵害され、影響を受けたパッケージ全体の月間導入数は20億回を超えたという。
各パッケージには「setup.mjs」と「Math_Symbol.js」が追加され、「package.json」には「preinstall: node setup.mjs」が書き込まれていた。影響を受けた版で「npm install」を実行すると、インストール完了前にsetup.mjsが自動実行される。setup.mjsは難読化されたドロッパーで、実行環境としてBun JavaScriptランタイムを取得し、その後728KBの難読化ファイル「Math_Symbol.js」を起動する。
Math_Symbol.jsは、npmトークンやGitHubトークンをはじめ、「Amazon Web Services」(AWS)認証情報、「Kubernetes」のサービスアカウント、「HashiCorp Vault」のトークン、「Stripe」のAPIキー、「Slack」のトークンなど、開発環境で利用されるさまざまな認証情報を収集する。
GitHub Actions環境では、ランナープロセスのメモリからシークレットやnpm公開用OIDC(OpenID Connect)トークンの取得を試みる。AWSでは設定ファイルや環境変数、「Amazon EC2」「Amazon Elastic Container Service」(Amazon ECS)のメタデータ、「AWS Secrets Manager」を調査し、KubernetesではAPI経由でシークレットを取得する。Vaultでも複数の認証方式を試し、KVストア内の秘密情報を列挙する。
開発者端末に保存された約200種類のファイルも探索対象となる。.envファイルや秘密鍵、SSH設定、「Terraform」の状態ファイル、「Docker」の認証情報、「KeePass」データベース、VPN設定、「Visual Studio Code」(VS Code)や「Claude Code」の設定ファイルなどを収集対象とし、5MBを超えるファイルは除外した上で最大64件を並列処理する。正規表現も利用し、秘密鍵や「Microsoft Azure」ストレージキー、認証情報を含むデータベース接続文字列なども検出する。
収集したデータはRSA方式で暗号化され、「Shai-Hulud: Here We Go Again」という説明文を持つ公開GitHubリポジトリに送信されていた。確認時点では約1300件のリポジトリが被害者ごとのデータ保存先として利用されており、攻撃者はGitHubをコマンド&コントロール(C2)インフラの一部として悪用していた。
GitHubへの送信に失敗した場合は、「npm-cache[.]com」に転送する。この接続先はEthereumのスマートコントラクトから動的に取得される仕組みとなっており、攻撃者はマルウェア本体を更新することなく接続先だけを変更でき、インフラ停止への耐性を高めていた。
今回の攻撃で特徴的なのは、マルウェアが自己増殖する点だ。盗み出したnpmトークンを利用して公開権限を持つパッケージを調べ、最新版のtarballを展開した後、パッチ番号を1つ増やして悪意あるコードを埋め込み、再公開する。この自己拡散機能によって、初期侵害から400超のパッケージに感染が広がった。二次感染では「Math_Symbol.js」と同じ機能を持つ「math_init.js」が利用されていた。
また、GitHubの「ghs_」形式トークンを取得すると、各リポジトリで最大50ブランチにコミットを作成し、「.claude/settings.json」や「.vscode/tasks.json」へフックを追加する。これにより、開発者がVS Codeでリポジトリを開いたり、Claude Codeのセッションを開始したりするだけで、npm installを実行しなくてもマルウェアが動作する仕組みとなっていた。コミットの作成者名は「claude」、メッセージは「chore: update config」とされ、通常の更新に紛れ込むよう工夫されていた。
Aikido Securityは利用者に対し、中央フィードでマルウェア関連の重大アラートを確認し、必要に応じて手動で再スキャンするよう呼び掛けている。また、無料のマルウェア検査や、端末上のソフトウェアを可視化する「Device Protection」、npmやyarnの実行時にパッケージを照合するオープンソースツール「Safe Chain」の利用も案内した。
開発者は、影響を受けたバージョンを利用していないかどうかを確認するとともに、該当パッケージを導入していた場合はnpmやGitHubのアクセストークン、CI/CD(継続的インテグレーション/継続的デリバリー)環境のシークレット、クラウド認証情報などを速やかに失効・再発行することが望ましい。CI/CDの実行ログやGitHub Actionsの履歴に不審な公開処理がないかを確認し、サプライチェーン攻撃を検知する仕組みの導入も検討したい。
Claude暴走、企業に侵入 AnthropicとOpenAIの事例から学ぶ3つの教訓
日立はMythosをどこまで使いこなしたのか? 実証で見えたリアルな性能
AI時代に「守る」はもう古い Gartnerが『五輪書』で説いた新たなセキュリティ論
Linuxカーネルで432件のCVEが一斉公開 「重要な脆弱性だけ直す」運用は限界か
悪用成功率99%、Linuxカーネルに新ゼロデイ「Bad Epoll」が見つかる
低温物流大混乱 ニチレイを襲ったサイバー攻撃、OSINTから見えた“明確な弱点”Copyright © ITmedia, Inc. All Rights Reserved.