【テクニカル・上級編】 メモリ上のファイルレスマルウェアの実行コード抽出と静的解析 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

メモリの深淵を覗く:ファイルレスマルウェアの残響を捕らえ、解析する

「ディスクを探しても無駄だ」。インシデントレスポンスの現場で、私が若手に最初に叩き込む教訓だ。現代の高度な脅威アクターは、もはやバイナリをHDDの片隅に隠すような初歩的なミスは犯さない。彼らの戦場は、揮発性メモリ(RAM)という名の、刻一刻と崩れ去る砂上の楼閣だ。

今回は、ディスクレスで活動するマルウェアの核心部、すなわちメモリ上に展開されたペイロードをいかにして「捕獲」し、IDA Proの解析台に引きずり出すか。その泥臭くも精緻なプロセスを紐解いていく。

—

1. VADツリーの解読:攻撃者の隠れ家を特定する

ファイルレスマルウェアがメモリ上で実行される際、Windowsのメモリ管理機構であるVAD(Virtual Address Descriptor)ツリーには必ず痕跡が残る。攻撃者はVirtualAllocExやNtMapViewOfSectionを駆使し、自身の実行権限を持つ領域を確保するが、これが標準的なDLLのロードプロセスと異なる「歪み」を生む。

解析の第一歩は、このVADツリーを走査し、不審なフラグを見つけることだ。特に重要なのは、PAGE_EXECUTE_READWRITE(RWX)権限を持ち、かつファイルパスが紐付いていないメモリ領域だ。

Volatility 3によるターゲットの特定

まずはwindows.vadinfoプラグインで、怪しい領域を炙り出す。

# VADツリーを走査し、保護属性がRWXの領域を抽出する
python3 vol.py -f memory.dmp windows.vadinfo --pid 1234 | grep -E "PAGE_EXECUTE_READWRITE"

ここで重要なのは、VADツリーのStartとEndアドレスだ。このメモリ範囲こそが、敵の本体が眠る「コンテナ」である。

—

2. メモリダンプから「生」のバイナリを救出する

VADの特定が終われば、次は物理メモリからその領域を切り出す作業だ。単にダンプしただけでは、ヘッダー情報が欠落していたり、セクションの配置がずれていたりして、IDA Proにロードしても関数名すら解決できないゴミ屑になることが多い。

Pythonによるメモリ抽出の自動化

単純な抽出ではなく、PEヘッダーを再構築する意識が必要だ。以下は、メモリダンプから特定のオフセットを抽出するためのスクリプトの断片である。

import struct

def extract_payload(dump_file, start_addr, size, output_path):
    """
    メモリダンプから特定のVAD領域を抽出し、ファイルとして保存する
    """
    with open(dump_file, "rb") as f:
        f.seek(start_addr)
        payload = f.read(size)
        
    with open(output_path, "wb") as out:
        # メモリ上の配置とファイル上のオフセットが異なるため、
        # ここでPEヘッダーの修正(セクションアライメントの調整)が必要になる場合がある
        out.write(payload)
    
    print(f"[+] 抽出完了: {output_path}")

# 使用例: vadsinfoで取得した開始アドレスとサイズを指定
extract_payload("memory.dmp", 0x0000021a4f000000, 0x4000, "extracted_malware.bin")

—

3. IDA Proでの静的解析:再構築の技術

抽出したバイナリをIDA Proに投げるだけでは、大抵の場合、エントリポイントが正しく認識されず、解析不能な断片が並ぶ。ここからが「防衛の職人技」の見せ所だ。

鍵となる解析ステップ

1. ベースアドレスの修正: Edit -> Segments -> Rebase program を使い、メモリ上で実際にロードされていたベースアドレスをIDAに教え込む。これがズレていると、文字列参照やAPI呼び出しの解決がすべて崩壊する。
2. APIインポートの再構築: 多くの場合、IAT(Import Address Table)はメモリ上で動的に解決されているため、IDAはライブラリ関数を認識できない。FLIRTシグネチャを適用するか、IDAPythonを使って動的にインポート情報を書き込む必要がある。
3. ガードレイルの視点: 解析中に、マルウェアが通信プロトコルのどの部分を狙っているかを確認する。例えば、暗号化通信の復号ルーチンが見つかった場合、そこが通信の「ガードレイル」を突破するための鍵となる。

—

終わりに:技術の背後にある「守り」の哲学

インシデントレスポンスにおいて、メモリダンプを解析する行為は、単なる技術的な作業ではない。それは、攻撃者がシステムという巨大な迷宮の中で、どのような経路を辿り、どの扉をこじ開けたのかを追体験する「考古学」に近い。

AIがプロンプトインジェクションでガードレイルを突破しようとする昨今、我々防衛側のアーキテクトに求められるのは、単なるパッチ当てではない。メモリの保護状態、APIのフック検知、そして通信の構造的異常を、OSの深いレイヤーから可視化する「監視の目」を設計することだ。

ファイルレスマルウェアは、確かにディスクには残らない。しかし、システムのメモリという雄弁な証言者は、彼らが何を語り、何を壊そうとしたのかを、今も正確に記録し続けている。その声を拾い上げられるか否か。それが、プロとアマを分かつ境界線だ。

コメント

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