【テクニカル・上級編】 メモリダンプからのインメモリ実行型マルウェア(Fileless Malware)の抽出 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

亡霊を捕らえる:インメモリ実行型マルウェアの深層解析

ディスクを漁る時代は終わった。現代の高度な脅威アクターは、ntdll.dllの深淵で踊り、VirtualAllocExの隙間に隠れ、再起動とともに消え去る。ファイルレスマルウェアの調査において、ディスクイメージの解析は単なる儀式に過ぎない。真の戦場は、揮発性メモリという名の混沌とした海の中にある。

本稿では、Reflective DLL InjectionやProcess Hollowingによって「存在しないはずのコード」をメモリから抽出し、再構築するプロセスの核心を突く。

—

1. 痕跡のプロファイリング:なぜ「見えない」のか

ファイルレスマルウェアの本質は、正当なプロセス(svchost.exeやexplorer.exeなど)のメモリ空間を乗っ取り、そのコンテキストでコードを実行することにある。攻撃者は、ディスクへの書き込みを避け、OSのAPIを悪用してプロセスを「書き換える」。

調査において最も注意すべきは、Memory Protection属性の不自然な変化だ。通常、実行可能コードはPAGE_EXECUTE_READ(R-X)であるべきだが、インジェクションされた領域は多くの場合、PAGE_EXECUTE_READWRITE(RWX)として割り当てられる。この「RWX」という記号こそが、我々が追うべき最初のシグナルだ。

2. メモリダンプからのコード抽出:Volatility 3 の限界と突破

標準的なツールでmalfindを実行するだけでは、熟練した攻撃者の足元にも及ばない。彼らはAPI Hookingを検知させないために、自ら作成したシェルコードから動的にAPIを解決する手法を多用するからだ。

ここで、Volatility 3を用いた抽出の一例を示す。

# Volatility 3を利用したRWX領域の特定と抽出の自動化ロジック
# 対象のPIDを指定し、VAD(Virtual Address Descriptor)をスキャンする
import volatility3.framework.interfaces as interfaces

def extract_suspicious_memory(context, layer_name, pid):
    # VADツリーを走査し、PAGE_EXECUTE_READWRITEのフラグを持つ領域を特定
    # 実際にはプロトタイプに基づき、プロテクション属性をフィルタリングする
    vad_tree = get_vad_tree(context, layer_name, pid)
    for vad in vad_tree:
        if vad.protection == "PAGE_EXECUTE_READWRITE":
            # 抽出されたバッファをファイルとして書き出す
            dump_memory_segment(vad.start, vad.end, f"dump_{pid}_{vad.start}.bin")
            print(f"[!] 疑わしいメモリセグメントをダンプしました: {hex(vad.start)}")

このコードの肝は、単なる抽出ではなく、「PEヘッダーの再構築」にある。インジェクションされたDLLは、多くの場合MZヘッダーが改ざん、あるいは削除されている。メモリからダンプしたバイナリに対し、適切なエントリポイントを修正し、インポートテーブルを再構築しなければ、静的解析ツールは沈黙を貫く。

3. プロセス・ハロウィニングの解読:親子の相関関係

Process Hollowingを検知するには、PEB(Process Environment Block)の解析が不可欠だ。攻撃者は、サスペンド状態でプロセスを生成し、そのメモリを自らの悪意あるコードで置き換える。

調査の勘所は、PEB内のImageBaseAddressと、実際のVADに割り当てられた実行可能領域の不一致にある。WinDbg等のデバッガを併用し、peb構造体のBeingDebuggedフラグや、Ldr(Loader Data)モジュールリストの不整合を突く。もしLdrリストに存在しないDLLが実行されているなら、それは間違いなくインメモリで展開された亡霊だ。

4. 防御アーキテクチャへの昇華:ガードレイルの構築

我々が目指すべきは、事後のフォレンジックではなく、「実行時の異常検知」によるインジェクションの無効化だ。

  • ETW-Ti (Event Tracing for Windows Threat Intelligence) の活用: カーネルレベルでNtMapViewOfSectionやNtWriteVirtualMemoryを監視し、プロセスの保護属性変更(VirtualProtect)をスタックトレースと共に記録する。
  • Control Flow Guard (CFG) の強制: 攻撃者がROP(Return Oriented Programming)チェーンを組むことを防ぐため、間接呼び出しの妥当性をハードウェアレベルで検証する。
  • メモリ・エントロピー解析: 暗号化されたシェルコードがメモリ上に展開される際、その領域のエントロピーは急激に上昇する。この変動を機械学習モデルで監視し、閾値を超えた場合に即座にプロセスを強制終了(Kill)させるガードレイルを構築せよ。

結び:エンジニアとしての矜持

ファイルレス攻撃は、現代のWindowsアーキテクチャが持つ「利便性」という名の脆弱性を突いている。メモリという砂上の楼閣にコードを書き込む行為を完全に防ぐことは難しい。しかし、メモリ内の不可解なRWX領域を可視化し、その実行挙動をプロトコルレベルで追跡する我々の技術があれば、攻撃者がどれほど巧妙に姿を隠そうとも、その「影」を捉えることは可能だ。

セキュリティとは、ツールを回すことではない。OSが内部で何を考え、メモリ上でどのような計算を行っているのか。その「呼吸」を感じ取ることこそが、真のインシデントレスポンスの第一歩である。

コメント

タイトルとURLをコピーしました