メモリフォレンジックの真実:なぜ「ディスク」だけでは攻撃者は止まらないのか
現場でインシデント対応をしていると、よく「ログを全部消された」「ウイルス対策ソフトが検知しなかった」という悲痛な報告を受ける。だが、プロの攻撃者はそんな初歩的なミスはしない。彼らは、ディスクに痕跡を残さない「ファイルレス攻撃」を駆使し、悪意あるコードをメモリ空間で直接実行する。
ディスクだけを見ていても、彼らが仕掛けた「亡霊」は決して見つからない。ここで我々が武器にするのが、メモリフォレンジックのデファクトスタンダード、Volatility 3だ。
Volatility 3で「亡霊」を可視化する
メモリダンプ(RAMの全データ)には、攻撃者が実行したプロセス、通信先のIPアドレス、そして暗号化されたはずのパスワードさえもが「生」の状態で残っている。
まずは、侵害された疑いのあるサーバーからメモリダンプを取得し、Volatility 3で基本的な調査を行う。以下のコマンドは、現場で最初に行う「トリアージ」の基本だ。
# プロセスリストを表示し、不審な親プロセスや名前の偽装がないか確認
python3 vol.py -f memory.dmp windows.pslist
# ネットワーク接続状況を確認し、C2サーバーへの通信がないか調査
python3 vol.py -f memory.dmp windows.netscan
ここで重要なのは、pslistで出てきたプロセスの中に、svchost.exeのようなシステムプロセスが、本来あるべき場所(C:\Windows\System32\)以外から起動していないかを確認することだ。攻撃者は頻繁にプロセス名を偽装して潜伏する。
—
攻撃者の盲点:メモリへの悪意あるコード挿入を防ぐには
攻撃者がなぜメモリで暴れ回れるのか。それは、Webアプリの脆弱性を突き、メモリ上に直接ペイロードをロードさせる「プロセスインジェクション」が容易だからだ。特に、権限昇格を伴う攻撃や、Webシェルによるコマンド実行は、システムの深層に入り込む。
これらを「実行させない」ためには、入り口となるアプリケーション側の防御を鉄壁にする必要がある。
1. Webサーバー(Nginx)での不正実行阻止
まずは、不審なスクリプトが実行されるのを防ぐため、Nginxで特定のディレクトリの実行権限を厳格に制限する。
# /var/www/html/uploads など、ユーザーがファイルをアップロードする場所の設定
location /uploads/ {
# PHPなどのスクリプト実行を禁止する
location ~ \.php$ {
deny all;
}
# 静的ファイルのみ許可
autoindex off;
}
2. アプリケーションコードでの防御(PHPの例)
ファイルアップロード機能がある場合、MIMEタイプを信じてはいけない。攻撃者はヘッダーを偽装する。必ず拡張子と内容をダブルチェックし、かつ実行権限を与えない場所に保存する。
<?php
// 安全なファイルアップロードのためのチェック
$allowed_types = ['image/jpeg', 'image/png'];
$file_info = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $_FILES['upload']['tmp_name']);
if (!in_array($file_info, $allowed_types)) {
// 許可されていないファイルタイプは即座に破棄
die("不正なファイルです。");
}
// ファイル名をランダム生成し、実行不可能なディレクトリに保存
$new_name = bin2hex(random_bytes(16)) . '.jpg';
move_uploaded_file($_FILES['upload']['tmp_name'], '/var/www/uploads/protected/' . $new_name);
?>
—
「守り」のエンジニアが持つべき視点
メモリフォレンジックは、単なる事後処理ではない。攻撃者が「どのパスを通って、どうメモリに定着したか」というプロセスを知ることで、次なる攻撃に対する「予防の解像度」が劇的に上がる。
現場のエンジニア諸君に伝えたいのは、「ログは嘘をつくことがあるが、メモリは真実しか語らない」ということだ。
- 定期的なメモリダンプの取得: 本番環境において、少なくとも月次でメモリをダンプし、
Volatilityで異常がないかベースラインを確認する習慣をつけよう。 - EDRの導入: メモリ操作をリアルタイムに検知する製品(CrowdStrikeやSentinelOneなど)は、今の時代、インフラエンジニアの必須装備だ。
攻撃者は日々進化する。だが、彼らがメモリ空間で動く以上、そこには必ず「足跡」が残る。その足跡を読み解くスキルこそが、君たちを「単なるエンジニア」から「信頼されるセキュリティエンジニア」へと押し上げるはずだ。
もしサーバーが攻撃を受けた際、ログだけを見て途方に暮れることのないように。メモリダンプという「最後の砦」を、常に手元に置く準備をしておいてほしい。
コメント