npmサプライチェーン攻撃、検出回避のため通常のパッケージコード内にマルウェアを隠蔽

新たなnpmサプライチェーン攻撃キャンペーンが確認されました。従来のようなpreinstallpostinstallスクリプトを使わず、通常のJavaScriptパッケージコードの中にマルウェアを隠す手口です。

この手法により、悪意あるパッケージはインストール時には無害に見え、開発者がその機能を実際に使用したときにのみ起動するようになっています。

今回のキャンペーンでは、正規のライブラリsorted-btreeになりすました悪意あるパッケージindexed-btreeが使われています。

研究者によると、攻撃者はこれまでに約109ETH(報告時点で約23万933ユーロ相当)を稼いでいたということです。このキャンペーンは現在も活動を続けており、今後さらに詳細が判明する可能性があります。

多くのnpmの脅威とは異なり、このパッケージのpackage.jsonファイルには不審なライフサイクルスクリプトが存在しません。そのため、主にインストール時の挙動に注目する開発者やセキュリティツールには、正規のパッケージのように見えてしまいます。

その代わりに、マルウェアはパッケージの通常のアプリケーションロジックの中に埋め込まれています。悪意あるコードは、ライブラリの通常利用時に実行される可能性が高い中核的な関数であるBTree.prototype.setの中に配置されています。

特定の条件が満たされると、この関数はsharedLoad.min.jsという名前の難読化されたJavaScriptローダーを起動します。

このローダーは、感染したシステムからオペレーティングシステム、デバイスのアーキテクチャ、ホスト名、CPU情報、メモリデータ、稼働時間などの情報を収集します。

その後、この情報は攻撃者が管理するSlackおよびTelegramのインフラに送信されます。またこのマルウェアは、Ethereum Sepoliaテストネット上のスマートコントラクトをコマンド&コントロール(C2)チャネルとしても利用しています。

固定の悪意あるドメインやIPアドレスに直接接続するのではなく、このマルウェアはスマートコントラクトに問い合わせて指示とインフラの詳細情報を取得します。

この手法により、テイクダウン(摘発・停止措置)がより困難になっています。既存のC2サーバーがブロックされた場合でも、攻撃者はコントラクトに保存された情報を更新し、感染デバイスを新たなサーバーへ誘導できるためです。

第1段階のローダーはX25519暗号鍵ペアを生成し、スマートコントラクトから攻撃者の公開鍵を取得します。

その後、楕円曲線ディフィー・ヘルマン(ECDH)鍵交換を実行してAES復号鍵を導出します。この鍵によって、オンチェーンに保存された2つの暗号化ペイロードの断片が復号され、第2段階のマルウェアペイロードが生成される仕組みです。

このマルウェアにはクリーンアップ機能も備わっています。自身のファイルを削除したり、パッケージのプロトタイプ関数から悪意あるトリガーを取り除いたりすることができ、感染後の調査を困難にしています。

攻撃者は、このパッケージ向けにGitHubリポジトリ、コミット履歴、開発者アカウントを作成することで、キャンペーンに信頼性を持たせようとしていました。

しかし、そのリポジトリには、公開されているnpmパッケージに含まれるマルウェアは含まれていないと報告されています。こうした工作によって、このキャンペーンは大きな注目を集めることに成功しました。

checkmarxによると、悪意あるindexed-btreeパッケージおよび関連パッケージは数十万件のダウンロードを記録しており、btree-coreは削除される前に週間ダウンロード数がほぼ200万件に達していたということです。(checkmarxより)

注: 本記事に記載のIPアドレスおよびドメインは、誤ってアクセス・リンクされることを防ぐため、意図的に無害化表記([.]など)としています。再度有効な表記に戻す作業は、MISP、VirusTotal、あるいは自組織のSIEMなど、管理された脅威インテリジェンス基盤上でのみ行ってください。

16,000以上のSOCチームがANY.RUNを利用し、脅威調査の効率化と手作業の削減を実現しています。貴チーム向けの詳細はこちら

翻訳元: https://cyberpress.org/npm-malware-evades-detection/

本記事は cyberpress.org の記事を翻訳・要約したものです。