【実務・中級編】 ファイルレスマルウェアの実行コード抽出:PEヘッダーの再構築とアンパック – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

痕跡を消す亡霊たち:ファイルレスマルウェアのメモリ解析と「死体蘇生」の技術

現場でインシデント対応をしていると、時折「何も見つからない」という絶望的な報告を受けることがあります。ディスクを丸ごとイメージ化し、ツールでスキャンしてもマルウェアの本体はどこにもいない。しかし、メモリ上では確実に攻撃者のプロセスが動き、C2サーバーと通信している。

これがファイルレスマルウェア(Fileless Malware)の恐ろしさです。彼らはディスクという「墓場」に足跡を残さず、メモリという「思考回路」の中だけで完結します。今日は、そんな亡霊を捕まえ、解剖するための「メモリフォレンジック」の核心について話しましょう。

なぜ奴らはメモリに潜むのか

攻撃者は、ディスクへの書き込みがEDRやアンチウイルスソフトによって容易に検知されることを知っています。だからこそ、PowerShellやWMI、あるいは脆弱なWebアプリケーションを通じてシェルコードを直接メモリ上にロードし、実行させます。

メモリ上に展開された実行コードは、多くの場合、PE(Portable Executable)ヘッダーが意図的に破壊されていたり、読み取り専用属性が書き換えられていたりと、そのままではダンプしても解析不能な状態になっています。ここで我々フォレンジック担当者が行うべきは、「PEヘッダーの再構築」という名の死体蘇生です。

現場で使う「死体蘇生」のステップ

1. プロセスの特定: Volatility 3 を使い、疑わしいプロセスの PID を特定します。
2. メモリダンプ: procdump 等で対象メモリ領域を吸い上げます。
3. PEヘッダーの修復: ダンプファイルは先頭が破損していることが多い。PE-bear などのツールを用い、セクションヘッダーの仮想アドレス(RVA)と物理オフセットを突き合わせ、正当な MZ ヘッダーと PE 署名を埋め込みます。

この作業を終えて初めて、Ghidra や IDA Pro で静的解析が可能になります。

防御の要:ファイルレス攻撃を「封じ込める」実装

ファイルレス攻撃の多くは、Webアプリの脆弱性(特にRCEやデシリアライゼーション攻撃)を起点にします。これを防ぐには、OSレベルの制御とアプリケーション側の防御をレイヤー化することが不可欠です。

1. WAFによる「難読化コード」の阻止 (Nginx + ModSecurity)

攻撃者は難読化した悪意あるペイロードをPOSTしてきます。これらを正規表現ベースで遮断する設定が有効です。

# Nginx設定ファイル: 悪意あるペイロードの簡易遮断
# Base64でエンコードされたPowerShellコマンドの実行をブロック
location / {
    # PowerShellの呼び出しや、IEX (Invoke-Expression) を含むリクエストを拒否
    if ($request_body ~* "powershell|IEX|Invoke-Expression|Net.WebClient") {
        return 403;
    }
}

2. PHPでのセキュアなコマンド実行制御

Webアプリケーション内で system() や exec() を使うことは、現代の設計では「自殺行為」に近い。どうしても必要な場合でも、入力を厳格にホワイトリスト化してください。

<?php
/**
 * ファイルレス攻撃を防ぐための安全なコマンド実行関数
 */
function secure_exec($command, $args) {
    // 許可されたコマンド以外は絶対に通さない
    $allowed_commands = ['/usr/bin/convert', '/usr/bin/zip'];
    
    if (!in_array($command, $allowed_commands)) {
        throw new Exception("許可されていないコマンドです。");
    }

    // 引数には必ずエスケープ処理を施す
    $escaped_args = array_map('escapeshellarg', $args);
    $cmd = $command . ' ' . implode(' ', $escaped_args);
    
    // shell_execなどは避け、proc_openで環境を隔離して実行することを推奨
    return shell_exec($cmd);
}
?>

インシデントレスポンスの鉄則

もし皆さんのシステムで「原因不明のプロセスがメモリに居座っている」という異常を検知したら、即座にプロセスのメモリダンプを取ってください。 電源を切ってはいけません。メモリの内容は揮発性であり、再起動した瞬間に攻撃の証拠は消滅します。

我々DFIRの仕事は、単に「何が起きたか」を報告書にまとめることではありません。「攻撃者が二度と同じ手を使えないように、システムを強固に作り変えること」です。

メモリの中を覗く勇気を持ってください。そこには、教科書には載っていない、攻撃者の「生身の指紋」が必ず残っています。何かあればいつでも相談してください。共にこのデジタル空間の治安を守り抜きましょう。

コメント

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