‘indexed-btree’パッケージを悪用した現在進行中のnpmマルウェアキャンペーンは、脅威アクターがインストールスクリプトではなくパッケージの通常のランタイム動作の中に悪意あるコードを隠すことで、サプライチェーン対策を回避する手口を示しています。
このパッケージはCheckmarxの研究者によって発見されたもので、正規ライブラリ「sorted-btree」になりすましており、すでに週間200万ダウンロードを記録しています。
このキャンペーンは攻撃者に多額の利益をもたらしている可能性もあります。Checkmarxによれば、攻撃者は109ETHを保有するウォレットを使用しているとのことです。ただし、これらの資金が暗号資産窃取によるものかどうかについては、レポートでは言及されていません。
最新のセキュリティ対策を回避
2026年6月、GitHubは一連のnpmセキュリティ対策を発表しました。これは、2025年後半以降オープンソースエコシステムを繰り返し揺るがしてきたサプライチェーン攻撃を防ぐことを目的としたものです。
主要な対策の一つは、明示的に承認されない限り、’preinstall’、’install’、’postinstall’といった依存関係のライフサイクルスクリプトをブロックすることです。
その他の対策では、許可なくnpmがGitリポジトリやリモートURLから自動的に依存関係を取得することを防止しています。
悪意あるindexed-btreeパッケージは、インストールスクリプトの使用を避け、代わりにパッケージのBTree.prototype.set()メソッド内にローダーを隠すことで、これらの防御策を回避しています。このメソッドは、アプリケーションが特定のキー値を指定して呼び出した際にランタイムで実行されます。
その結果、インストールは一見クリーンに見え、npm v12の承認メカニズムを一切トリガーしません。
「マルウェアのローダーは、すべてのユーザーが頻繁に呼び出すことになる主要関数である、ライブラリ自体のBTree.prototype.setメソッドの中に隠されています」とCheckmarxは説明しています。
「これによりsharedLoad.min.jsがトリガーされます。このファイルには難読化されたマルウェアの第1段階が含まれています。これは、標準的なテイント解析ツールやほとんどの静的スキャナーをすり抜けるための、よくできた手法です」

マルウェアが実行されると、アーキテクチャ、ホスト名、CPU、メモリ、稼働時間といったシステム情報を収集し、ハードコードされたSlackおよびTelegramのチャンネルを通じて情報を外部に送信します。
このマルウェアはまた、コマンド&コントロール(C2)情報を得るために、Sepoliaテストネットワーク上のEthereumスマートコントラクトをポーリングします。X25519鍵交換を用いてAES鍵を導出し、コントラクト内に保存された第2段階のペイロードを復号する仕組みです。
運用者が攻撃を終了させることを選択した場合、マルウェアは自身のファイルを削除し、パッケージコードから悪意あるトリガーを除去することで痕跡を消すことができます。
研究者らは、脅威アクターがこのプロジェクトを正規のものに見せかけるために、本物らしいGitHubリポジトリを構築し、コミット履歴を作り込み、開発者アカウントを丹念に整えるなど、多大な労力を費やしていたと指摘しています。

Checkmarxは、同一の攻撃キャンペーンに関連する追加のnpmパッケージを9個発見しており、これらはすでにnpmから削除済みです。これらのパッケージも以下の通り、相当なダウンロード数を記録していました。
- ordered-kv-index(448,184ダウンロード)
- btree-leaderboard(493,685ダウンロード)
- priority-slot-queue(402,860ダウンロード)
- btree-range-store(468,092ダウンロード)
- btree-core(1,951,274ダウンロード)
- btree-time-index(425,312ダウンロード)
- btree-lru-cache(372,185ダウンロード)
- neighbor-key-map(366,019ダウンロード)
- sliding-score-window(448,024ダウンロード)
開発者は、インストール時のスキャンのみに頼るのではなく、ランタイムの動作解析も併用することが推奨されます。
indexed-btreeまたは上記いずれかのパッケージをインストールしてしまったユーザーは、すべての認証情報をローテーションし、安全なバックアップから開発環境を復元することが望まれます。