巧妙なnpmサプライチェーン攻撃キャンペーンが、悪意あるJavaScriptパッケージ10種と関連していることが判明しました。これらのパッケージは合計で数百万件のダウンロードを記録しながら、npmのライフサイクルスクリプト保護機能を回避していました。
この攻撃の中心となっているのは、正規ライブラリであるsorted-btreeになりすました偽パッケージindexed-btreeです。このパッケージは、アプリケーションが実行時にこのパッケージを使用した場合にのみマルウェアを実行します。
preinstall、install、postinstallといったフックに依存する従来型のnpmマルウェアキャンペーンとは異なり、攻撃者は通常のアプリケーション実行中に呼び出される可能性が高いコアライブラリメソッド、BTree.prototype.set()内にローダーを埋め込みました。
このパッケージのpackage.jsonには不審なライフサイクルフックが含まれていないため、インストール自体は無害に見え、依存関係スクリプトに明示的な承認を要求するnpm v12で導入された保護機能も回避できます。
ランタイムトリガーは、キー値100を使ったset()関数の呼び出しという特定の条件を確認した上で、難読化されたローダーsharedLoad.min.jsを分離したNode.jsプロセス内で起動します。
この実行経路により、悪意ある活動はインストール段階から通常のプログラム動作へと移動します。その結果、主にライフサイクルスクリプトに着目したインストール時の制御や静的パッケージレビューの効果が薄れることになります。
攻撃者は、コミット履歴が充実したGitHubリポジトリを運用し、一見本物らしい開発者プロフィールを用意することで、パッケージの信頼性を補強する一方、悪意あるコード自体は公開リポジトリから外していました。
第一段階のローダーは、文字列配列エンコーディングと自己防衛コードを用いて、徹底的に難読化されています。
実行されると、感染したホストの情報を収集します。具体的には、OSアーキテクチャ、ホスト名、CPU情報、メモリ、稼働時間などが対象です。
悪意あるnpmパッケージ10種
収集されたデータは、ハードコードされたSlackおよびTelegramのインフラを通じて外部に送信されます。
GBhackersと共有されたレポートの中でCheckmarxが述べたところによると、このパッケージは週間ダウンロード数が約200万件に達しており、実行時挙動に着目した欺瞞的なパッケージがどれほどの規模に達しうるかを示しています。

さらに注目すべき点として、このマルウェアはEthereum Sepoliaテストネット上のスマートコントラクトをコマンド&コントロール(C2)の仕組みとして使用しています。
従来型のC2ドメインやIPアドレスに直接接続するのではなく、このインプラントはスマートコントラクトのgetter・setter関数をポーリングし、インフラの更新情報やペイロードデータを取得します。
この手法により、テイクダウンはより困難になります。攻撃者はマルウェア内にハードコードされたドメインを差し替える代わりに、オンチェーンの更新を通じて被害者を新しいインフラへとリダイレクトできるためです。
このローダーは、X25519楕円曲線Diffie-Hellman鍵交換も実装しています。ローカルでX25519の鍵ペアを生成し、スマートコントラクトから攻撃者側の公開鍵を取得して共有シークレットを導出、それを使ってAES鍵を生成します。
この鍵によって、オンチェーンに保存された暗号化ペイロードの断片が復号され、第二段階のマルウェアが動的に再構築される仕組みです。
このマルウェアには、自身のファイルを削除し悪意あるプロトタイプトリガーを除去するクリーンアップ機能も組み込まれており、実行後のフォレンジック証拠を限定的なものにしています。
Checkmarxはindexed-btreeを主要な悪意あるパッケージとして特定し、同じ攻撃に関連するパッケージとしてさらに9種を確認しました。ordered-kv-index、btree-leaderboard、priority-slot-queue、btree-range-store、btree-core、btree-time-index、btree-lru-cache、neighbor-key-map、sliding-score-windowです。

btree-coreだけで1,951,274件のダウンロードを記録しており、その他のパッケージもそれぞれ数十万件規模のダウンロードを積み重ねていました。これら関連パッケージはすでにnpmから削除されています。
研究者らはまた、今回のキャンペーンで使われたスマートコントラクトのインフラを、以前確認されていたmutex-forgeパッケージとも結び付けています。
Checkmarxの分析時点で、攻撃者は109 ETH(約230,933.57ユーロ相当)を管理下に置いていたとみられます。ただし、このウォレットの残高すべてが今回のキャンペーンに由来するものであると特定されたわけではありません。
indexed-btreeパッケージはSnykによって悪意あるものと分類されており、深刻度9.3(クリティカル)のスコアが付与されているほか、このパッケージのすべてのインスタンスを避けるよう組織に呼びかけています。
今回の10種のパッケージのいずれかをインストールしていた組織は、影響を受けた開発環境やビルド環境が侵害された可能性があるものとして扱う必要があります。
各チームは、認証情報、APIトークン、SSHキー、クラウドのシークレット、npmトークン、それらの環境からアクセス可能なCI/CD変数をローテーションし、既知の安全なソースからシステムを再構築すべきです。
Ethereum Sepoliaネットワーク、Slack、Telegramへの送信通信を確認するとともに、依存関係のロックファイルやソフトウェア部品表(SBOM)を対象パッケージ名について監査してください。
ランタイムの挙動監視は今や不可欠です。ライフサイクルスクリプトが存在しないことをもって、npmの依存パッケージが安全であるとみなすことはできません。
侵害指標(IOC)
| パッケージ | ダウンロード数 |
|---|---|
| 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 |
| 合計 | 4,189,407 |
注: IPアドレスおよびドメインは、誤って名前解決やハイパーリンク化されることを防ぐため、意図的に無害化表記(例: [.])にしています。再度有効な形式に戻す作業は、MISP、VirusTotal、SIEMなど管理された脅威インテリジェンス基盤内でのみ行ってください。
SOCのアラート調査を1件あたり21分短縮。即座に対応できるIOCコンテキストでSOCを強化: TI Lookupを自社のSOCに統合する
翻訳元: https://gbhackers.com/10-malicious-npm-packages/