- 悪意のある npm パッケージ colortoolsv2 および mimelib2 は、検出を回避するために Ethereum スマート コントラクトから C2 URL を取得しました。
- オンチェーン間接化により、オペレーターはパッケージを再公開せずにエンドポイントをローテーションできます。colortoolsv2 は、mimelib7 へのピボット前に 2 月 XNUMX 日に削除されました。
- 協調的な GitHub プッシュでは、偽のトレーディング ボット リポジトリ、水増しされたスター、スクリプト化されたコミットを使用して、悪意のある依存関係を隠しました。
- IoC には、パッケージ バージョン、SHA1 ハッシュ、コントラクト 0x1f171a1b07c108eae05a5bccbe86922d66227e2b、および防御者向けのガイダンスが含まれます。
攻撃者は、 npmパッケージで使用されるコマンド&コントロール(C2)ポインタを隠蔽するために、イーサリアムのスマートコントラクトを経由して悪意のあるインフラストラクチャをルーティングするという、新たな手口に頼っている。ReversingLabsによると、colortoolsv2とmimelib2という2つのパッケージは、ハードコードされたドメインを探す通常のチェックを回避し、密かにブロックチェーンにアクセスして第2段階のペイロードのURLを取得していたという。
このスキームは、イーサリアム自体のバグを悪用するのではなく、ネットワークを公開された堅牢な間接レイヤーとして活用しています。7月7日にnpmでcolortoolsv2がブロックされた後、運営者はほぼ同じロジックを持つmimelib2に迅速に移行し、次のステップでも同じオンチェーンコントラクトを参照し続けました。
npm インストールからオンチェーン検索へ: 迂回路の仕組み

colortoolsv2 の内部では、最小限のローダー (index.js) がディスパッチャーとして機能し、外部コマンドを呼び出し、ローカルスクリプトや静的設定ではなくスマートコントラクトからターゲットを取得していました。Etherscan では、このコントラクトが 0x1f171a1b07c108eae05a5bccbe86922d66227e2b にあり、その読み取り関数が C2 サービスにアクセスするために使用される URL を返していたことが示されています。
このオンチェーンポインタはブロッキングを複雑化させた。アクティブなエンドポイントはオペレーターが制御するコントラクトの背後に存在していたため、防御側はパッケージ内のハードコードされたドメインを見つけたりブラックリストに登録したりするだけでは済まなかった。宛先をローテーションするには、コントラクトストレージを更新するだけでよく、npmアーティファクトを再公開する必要はなく、結果として発生するブロックチェーントラフィックは正当なものとして取り込まれる。
インストール時または実行時に一度実行されると、ローダーは第2段階のコンポーネント(SHA1 021d0eef8f457eb2a9f9fb2260dd2e39ff009a21)を取得し、これが後続の処理を担当しました。colortoolsv2 の動作を模倣し、mimelib2 はほぼ同じコードパスで同じコントラクトを同じ目的で再利用しました。
ReversingLabsは、この手法はnpmエコシステムでは異例だと述べている。悪意のあるURLは、過去のサプライチェーン攻撃でよく見られた従来のWebサービス(クラウドストレージやgistなど)ではなく、スマートコントラクトの状態を介してホストされていた。
GitHubの煙幕と鏡:偽のトレーディングボットリポジトリを隠れ蓑に

npmパッケージは単独で出現したわけではない。攻撃者は、暗号通貨取引ユーティリティを装ったGitHubプロジェクトのネットワーク(solana-trading-bot-v2などのリポジトリ)を構築し、それらを悪意のある依存関係に接続した。一般の人には、これらのリポジトリは数千件のコミット、複数のメンテナー、スター、ウォッチャーを誇り、「活発」に見えた。
詳しく調べてみると、活動の多くは計画的で表面的なものであり、ライセンスファイルの繰り返し更新や、内容の乏しい新規アカウント(中には7月10日頃に作成され、「Hello」というだけのREADMEファイルしか含まれていないものもあった)などが含まれていた。コミット履歴に現れたユーザー名(slunfuedrac、cnaovalles、pasttimerlesなど)は、ステージングされたプロジェクト全体で繰り返し出現していた。
コミット履歴には、パッケージがコードベースのどこに組み込まれたかが正確に示されていた。具体的には、bot.tsにcolortoolsv2、そして後にmimelib2を依存関係として追加し、src/index.tsに対応するインポートを記述していた。しかし、こうした人為的に作られた社会的証明によって、表面的なレビューでは依存関係の挿入がはるかに分かりにくくなっていた。
事実上、GitHubの偽装は信頼感を高める役割を果たしたが、マルウェアの次の行動を決定する真のポイントはイーサリアム上に存在していた。ソーシャルエンジニアリング(GitHub)と制御(スマートコントラクト)を分離することで、攻撃者はキャンペーンの発見と阻止をより困難にした。
IoCと防御者のための具体的な手順

ReversingLabsは、この活動に関連するアーティファクトの詳細な一覧と、第2段階の調査を主導したオンチェーン上のキー参照を公開しました。ビルドパイプラインや開発者ワークステーションにおける脆弱性の発見、ブロック、検証には、以下の項目が利用できます。
- npm packages: colortoolsv2 1.0.0 (SHA1 678c20775ff86b014ae8d9869ce5c41ee06b6215), 1.0.1 (1bb7b23f45ed80bce33a6b6e6bc4f99750d5a34b), 1.0.2 (db86351f938a55756061e9b1f4469ff2699e9e27)
- npm packages: mimelib2 1.0.0 (bda31e9022f5994385c26bd8a451acf0cd0b36da), 1.0.1 (c5488b605cf3e9e9ef35da407ea848cf0326fdea)
- Second stage: SHA1 021d0eef8f457eb2a9f9fb2260dd2e39ff009a21
- C2 間接参照に使用されるスマート コントラクト: 0x1f171a1b07c108eae05a5bccbe86922d66227e2b
削除段階における追加情報:colortoolsv2は7月7日にnpmから削除され、その後、運営者は同じオンチェーン参照とほぼ同じローダー動作を持つmimelib2に切り替えた。
エンジニアリングチームとセキュリティチームに推奨される対策には、インストールスクリプトによって実行されるオンチェーンルックアップにフラグを立てる、パッケージライフサイクルフックで子プロセス実行をブロックまたは警告する、CI での npm install 中にネットワーク出力を拒否する、レジストリとメンテナーの許可リストを適用する、推移的バージョンをロックする、上記のコントラクトアドレスに関連付けられたリクエストを監視する、などが含まれます。
より広義には、リポジトリの人気度指標はセキュリティ上のシグナルとはみなすべきではありません。信頼性は、スター数、コミット数、あるいは多数の「メンテナー」の存在ではなく、コード、成果物、ネットワーク指標に基づいて判断されるべきです。静的解析、サンドボックス実行、SBOMに基づく来歴チェックといった独立した検証は、依然として不可欠です。
今回のキャンペーンで際立っているのは、イーサリアム、npm、GitHubといった個々のプラットフォームの欠陥ではなく、パブリックインフラが巧妙な配信チェーンに組み込まれる手法である。攻撃者はC2レベルの検出をスマートコントラクト上で行い、GitHubを通じて信頼性を偽装することで、従来の検出手法を無効化した。慎重な依存関係管理と多層的な制御こそが、こうした脅威に対する対抗策となる。
