メモリは嘘をつかない: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の中に眠っている。
コメント