SOC Prime Bias: 中程度

08 5月 2026 18:33

NWHStealerがBun JavaScriptランタイムを通じて拡散

Author Photo
SOC Prime Team linkedin icon フォローする
NWHStealerがBun JavaScriptランタイムを通じて拡散
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

この記事では、脅威アクターがBun JavaScriptランタイムを使用してRustベースのインフォスティーラーNWHStealerを配信する方法を解説しています。悪意のあるZIPアーカイブには、BunでパッケージされたJavaScriptローダーを起動するプライマリインストーラーと dw.exeという名前のセカンダリローダーが含まれています。JavaScriptコンポーネントはアンチ仮想マシンチェックを実行し、コマンド&コントロールインフラに接続し、フォローオンペイロードを復号し、ネイティブWindows APIを悪用してメモリにスティーラーを注入します。疑惑を減らすために、キャンペーンはGitHub、MediaFire、SourceForgeなどの正当なホスティングプラットフォームの背後に悪意のあるファイルを隠しています。

調査

研究者たちは、Bunが .bun セクション内に悪意のあるJavaScriptをパッケージ化するために使われていることを発見しました。2つのスクリプト、 sysreq.js and memload.jsは、環境チェックと攻撃者インフラストラクチャとの通信を担当しました。ローダーは silent-harvester.ccなどのドメインから設定データと暗号化されたペイロードを取得し、AES-256-CBCで復号し、Win32 APIコールを通じてそれらを注入しました。最終的なペイロードはNWHStealerであり、認証情報、ブラウザデータ、暗号通貨ウォレット情報を盗み、追加のマイニング活動も開始することができます。

軽減策

ユーザーは信用されていないウェブサイトから実行ファイルをダウンロードせず、実行前にインストーラーの署名を確認する必要があります。セキュリティチームは不審なBunランタイム活動、仮想化チェックに使用されるPowerShell CIMクエリ、 VirtualAlloc and LoadLibraryAなどの疑わしいAPIコールを監視するべきです。また、組織は既知の悪意のあるドメインをブロックし、不正利用を制限するために最小特権実行ポリシーを実施するべきです。

対応

この活動が検出された場合、影響を受けたエンドポイントを隔離し、メモリとディスクイメージを収集し、 Installer.exe, dw.exe、および疑わしい .bun セクションを検索します。ネットワークの周辺で識別されたコマンド&コントロールドメインとURLをブロックします。観測されたPowerShellコマンドおよびWin32 APIパターンに対するエンドポイント検出を展開します。露出した認証情報をローテーションし、未承認の暗号通貨マイニングの兆候がないか影響を受けたシステムを監視します。

graph TB %% クラス定義 classDef technique fill:#ffcc99 classDef action fill:#99ccff %% ノード node_initial_access[“<b>初期アクセス</b><br/><b>T1036.008 迷彩: ファイルタイプ</b>: 正規に見せかけた悪意あるZIPファイル。<br/><b>T1204.002 ユーザー実行: 悪意あるファイル</b>: ユーザーがダウンロードしたファイルを実行する。”] class node_initial_access technique node_obfuscated_loader[“<b>難読化ローダー</b><br/><b>T1027.016 ジャンクコード挿入</b>: 無関係なJavaScriptを挿入し悪意あるロジックを隠蔽。<br/><b>T1027.008 ペイロード削除</b>: 不要なコードを削除し解析回避とサイズ削減を実施。”] class node_obfuscated_loader technique node_discovery[“<b>調査</b><br/><b>T1082 システム情報の取得</b>: OS・ハードウェア・ソフトウェア情報を収集。<br/><b>T1016 ネットワーク構成情報の取得</b>: ネットワークアダプタ・IP・ルーティング情報を列挙。”] class node_discovery technique node_credential_access[“<b>認証情報アクセス</b><br/><b>T1555.003 ブラウザ認証情報</b>: 保存パスワードと自動入力データを抽出。<br/><b>T1550.004 代替認証素材の使用</b>: セッションCookieを取得して不正ログインに利用。”] class node_credential_access technique node_c2[“<b>コマンド&コントロール</b>: リモートサーバーからAES復号シードと暗号化ペイロードを取得。”] class node_c2 action node_execution[“<b>実行</b><br/><b>T1620 リフレクティブコードロード</b>: ディスクに書き込まずメモリ上でペイロードを実行。<br/><b>T1055.009 プロセスメモリインジェクション</b>: 実行中プロセスへコードを注入。”] class node_execution technique node_persistence[“<b>永続化</b><br/><b>T1053 スケジュールタスク</b>: 定期実行のためのタスクを作成し維持。”] class node_persistence technique %% 接続 node_initial_access –>|次へ| node_obfuscated_loader node_obfuscated_loader –>|次へ| node_discovery node_discovery –>|次へ| node_credential_access node_credential_access –>|次へ| node_c2 node_c2 –>|次へ| node_execution node_execution –>|次へ| node_persistence

攻撃フロー

シミュレーション実行

前提条件:テレメトリー&ベースラインプレフライトチェックが通過している必要があります。

理由:このセクションは、検出ルールを引き起こすように設計された対戦相手のテクニック(TTP)の正確な実行を詳細に述べています。コマンドと説明は、識別されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリを生成することを目指しています。抽象的または無関連な例は誤診を招きます。

  • 攻撃のナラティブとコマンド:

    1. 初期アクセス: 攻撃者はターゲットシステム上に悪意のあるJavaScriptファイル(loader.js)を配布し、 bun ランタイムを使用して実行します(bun loader.js).
    2. 自己注入ルーチン: JavaScriptコードは、 Add-Type を用いてP/Invokeシグネチャを定義するPowerShellヘルパーを介してネイティブのWin32 APIに呼びかけます。 VirtualAlloc, VirtualProtect、および LoadLibraryA.
    3. メモリアロケーション: VirtualAlloc 埋め込まれたシェルコード用にサイズを調整したRWX領域を予約。
    4. シェルコード注入: PowerShellスクリプトはbase64でデコードされたシェルコードを Marshal.Copy.
    5. を使用して割り当てられたメモリにコピーします。 VirtualProtect ページ保護の変更: ページ保護を.
    6. ページ保護を LoadLibraryA に切り替えます。 LoadLibraryA).
    7. ペイロードの実行: 新しいスレッドなし: 攻撃者は攻撃者は
  • を意図的に呼び出しません;DLLのDllMainが現在のプロセスのコンテキストで実行され、ルールの除外条項を満たします。

    回帰テストスクリプト:
  • クリーンアップコマンド:

    # インジェクションを実行したPowerShellインスタンスを終了
    Stop-Process -Id $PID -Force
    
    # (オプション)テストのためにディスクに書き込まれたカスタムDLLが存在する場合、削除
    Remove-Item -Path "$env:TEMPmalicious.dll" -ErrorAction SilentlyContinue

実行後の検証

  1. アラート生成の確認: ルールが発動したことを確認するために、以下のKQLクエリを実行します:

     // 検出ルール:CreateThreadなしのVirtualAlloc/VirtualProtect/LoadLibraryA
     Sysmon
     | where EventID == 1
     | where CallTrace contains "VirtualAlloc" or CallTrace contains "VirtualProtect" or CallTrace contains "LoadLibraryA"
     | where not(CallTrace contains "CreateThread")
     | project TimeGenerated, Process, CallTrace, EventID
  2. 誤検知なしの確認: 無害なNotepadコマンドを再実行し、その実行に対して ゼロ の結果が返されることを確認します。


レポート終了