【実務・中級編】 メモリフォレンジックにおけるタイムライン分析:MFTとメモリ情報の統合 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

メモリとディスクの「ズレ」を暴け:MFTとメモリ分析で突き止める攻撃の爪痕

現場でインシデントレスポンスを担当していると、よく耳にする「ログが消された」「時刻が改ざんされた」という報告。攻撃者はログを消す術を知っていますが、「メモリ内の動的な痕跡」と「ディスク上の静的な痕跡」の整合性まで完璧に消し去ることは、ほぼ不可能です。

今日は、攻撃者が足跡を消し去ったつもりでも、我々DFIRのプロがどのようにして「ミリ秒単位の真実」を暴いているのか、その裏側と防御の鉄則を解説します。

—

1. なぜ「突き合わせ」が最強の武器になるのか

攻撃者がWebシェルをアップロードし、touchコマンドでタイムスタンプを偽装(タイムストンプ)したとしましょう。ディスク上のMFT(Master File Table)の更新時刻は完璧に書き換えられます。

しかし、メモリ上には「そのプロセスがいつ実行されたか」「どのDLLをロードしたか」「どのSocketを掴んでいたか」という、OSが嘘をつくことが難しい動的な情報が残っています。

  • MFTの限界: 静的。書き換えが可能。
  • メモリの真実: 実行時のコンテキスト。攻撃者が隠蔽プロセスを終了させても、メモリダンプには「かつて存在した接続」や「スレッドの残滓」が刻まれます。

これらを突き合わせることで、「ファイルが作成された時刻」と「プロセスが実際に活動を開始した時刻」の微小なラグを見つけ出し、攻撃者がタイムスタンプを偽装したその瞬間の矛盾を突くのです。

—

2. 攻撃者が狙う盲点:Webシェルによる不正操作のPoC

攻撃者は往々にして、以下のようなコードを使い、Webアプリを経由してシステムコマンドを実行します。

// 攻撃者がアップロードする悪意あるWebシェルの例
// 実行時刻を偽装してMFTの目をくらませる(touchコマンド)
<?php
$cmd = $_GET['cmd'];
system($cmd);
// 実行後にタイムスタンプを遡及的に書き換える
touch('shell.php', strtotime('2023-01-01 00:00:00'));
?>

彼らは「タイムスタンプを戻したからバレない」と高を括ります。しかし、我々はメモリ上の parent_process_id や、PHP-FPMのワーカーが生成した子プロセスの実行履歴から、実際のコマンド発行時刻を特定します。

—

3. 実践:攻撃を許さない「堅牢な設計」の答え

Webシェルによるコマンド実行を防ぐには、アプリケーションの権限分離と、system()のような危険な関数の禁止が絶対条件です。以下に、現代的なインフラで採用すべき防御設定を示します。

Nginx + PHP-FPM での権限分離設定

Webサーバーのユーザーが勝手にファイルを書き換えたり、コマンドを実行できないよう、open_basedir と適切なファイルパーミッションを設定します。

# /etc/nginx/conf.d/security.conf
# 特定のディレクトリ以外への書き込みを物理的に拒否する設定
location ~ \.php$ {
    fastcgi_param PHP_VALUE "
        open_basedir=/var/www/html/public:/tmp;
        disable_functions=system,exec,shell_exec,passthru,proc_open;
    ";
    # ... 他の設定
}

AWS IAM ポリシーによるメタデータ保護

攻撃者がWebシェルを足掛かりにクラウド環境の認証情報を盗む(SSRF攻撃)のを防ぐためのIAM制限です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ec2:Metadata",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpc": "vpc-0123456789abcdef0"
                }
            }
        }
    ]
}

—

4. 現場のアナリストからのアドバイス

「ツールを動かせば答えが出る」と考えているなら、それは大きな間違いです。フォレンジックにおいて最も重要なのは、「攻撃者の心理」と「OSの挙動」を理解することです。

1. タイムライン分析の極意: 常に「UTC」で時刻を統一すること。ローカルタイムのズレはインシデントハンドリングの最大の敵です。
2. メモリフォレンジックの心得: Volatility を使う際は、必ず pslist だけでなく pstree や malfind を組み合わせ、親プロセスの連鎖を確認してください。Webシェルは必ず php-fpm や apache の子プロセスとして出現します。
3. 防御の自動化: ログが改ざんされても「SIEM」や「クラウド上の監査ログ」にリアルタイムで転送していれば、攻撃者のタイムストンプは無力化されます。

技術は常に進化しますが、攻撃者が「爪痕」を残さざるを得ないという事実は変わりません。我々エンジニアの仕事は、その微かな爪痕を見つけ出し、彼らのシナリオを崩壊させることです。

何か疑問があれば、いつでも聞いてください。現場の泥臭い話はいくらでも用意していますよ。

コメント

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