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

メモリは嘘をつかない:Volatilityで暴く「見えない侵入者」の足跡

現場でインシデント対応をしていると、「ログが消されている」という絶望的な報告を耳にすることがよくある。攻撃者は侵入後、まず最初に auditd や syslog を無効化し、自身の活動を隠蔽しようとするからだ。

しかし、攻撃者がどれほど巧妙にログを削除・改ざんしても、「メモリ(RAM)」の中に刻まれた情報の断片までは消し去れない。 今日は、Volatilityの timeliner プラグインを使って、攻撃者の「犯行時刻」を完全に可視化するテクニックを伝授する。

—

なぜ「タイムライン分析」なのか?

攻撃者はシェルを叩き、バックドアを仕込み、一時ファイルを展開する。これら全てのプロセスは、メモリ上の構造体(EPROCESSやETHREADなど)にタイムスタンプを書き込む。

timeliner を使うと、これらのバラバラな構造体の作成・終了時刻を一つの時系列に並べることができる。これにより、「どのプロセスがいつ起動し、どのユーザー権限で何を実行したか」という因果関係が、まるで映画のフィルムのように浮かび上がるのだ。

Volatility 3によるタイムライン抽出コマンド

まずはメモリイメージ(mem.raw)から全イベントをCSVとして書き出す。

# Volatility 3を使用したタイムライン抽出
# --output-file で出力先を指定し、後でExcelやgrepで解析しやすくする
python3 vol.py -f mem.raw windows.timeliner > timeline_raw.csv

ここで重要なのは、出力された数万行のデータから「異常」を見つける嗅覚だ。特に cmd.exe や powershell.exe が、親プロセスが不審な(例えば w3wp.exe や httpd.exe)状態で起動している箇所を探せ。それが攻撃の起点だ。

—

攻撃者の「盲点」を突く防御策

メモリフォレンジックで攻撃の痕跡を見つけるのは重要だが、究極の理想は「メモリに痕跡を残させる前に止めること」だ。多くのWebアプリ開発者が陥る「ファイルアップロード脆弱性」を例に、メモリに残るような攻撃を防ぐセキュアな実装を共有する。

1. セキュアなファイルアップロード(PHP実装)

攻撃者は webshell をアップロードし、そこからメモリ上でプロセスを展開する。これを防ぐには、拡張子のチェックだけでは不十分だ。MIMEタイプを確認し、保存パスを非公開にせよ。

<?php
// ファイルアップロードのセキュアな実装例
$uploadDir = '/var/www/uploads_private/'; // 公開ディレクトリ外に保存
$allowedTypes = ['image/jpeg', 'image/png'];

if ($_FILES['upload']['error'] === UPLOAD_ERR_OK) {
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime = $finfo->file($_FILES['upload']['tmp_name']);

    // MIMEタイプ検証
    if (!in_array($mime, $allowedTypes)) {
        die("不正なファイル形式です。");
    }

    // ファイル名をランダムなハッシュ値に変更して保存
    $ext = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);
    $newName = bin2hex(random_bytes(16)) . '.' . $ext;
    
    move_uploaded_file($_FILES['upload']['tmp_name'], $uploadDir . $newName);
}
?>

2. Nginxでの攻撃遮断(設定ファイル)

攻撃者は curl や wget を使って悪意のあるバイナリをダウンロードする。こうした不審なUser-Agentや、意図しないパスへのアクセスはNginxレベルで即座に拒否する。

# /etc/nginx/conf.d/security.conf
# 不審なツールからのアクセスを拒否
if ($http_user_agent ~* (curl|wget|python-requests|sqlmap)) {
    return 403;
}

# ディレクトリトラバーサル等の攻撃パターンをブロック
location ~* (\.\.|\.\.\/|\.php\.swp) {
    return 403;
}

—

現場の知見:フォレンジックから得られる「ガードレール」

私が過去に調査した案件の多くは、攻撃者が「一時ファイル」を /tmp や C:\Windows\Temp に書き込み、そこから実行権限を付与して実行するという手口だった。

防御のための鉄則:
1. マウントオプションの活用: Webアプリが書き込む領域は noexec(実行権限なし)でマウントせよ。これで webshell を配置されても実行できない。
2. クラウドIAMの最小権限: メモリ上に侵入されたとしても、EC2インスタンスがS3へのフルアクセス権を持っていれば、データは全て盗まれる。インスタンスプロファイルには、必要なバケットへのアクセス権のみを付与すること。

最後に:フォレンジックを「日常」に組み込む

メモリフォレンジックは、事件が起きてから行う特別な作業ではない。日頃から timeliner の出力をベースラインとして収集し、「普段と違うタイムスタンプの動き」を検知できる体制を作っておくこと。それが、真の意味で「侵入を許さない」強固な組織の姿だ。

何か異常を感じたら、まずはそのメモリをダンプせれ。機械は嘘をつかない。真実は常に、RAMの中に眠っている。

コメント

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