はじめに
サーバーへの不正アクセスが疑われるとき、
何を最初に確認しますか?
ログ、ディスク……それだけでは足りないことがあります。
👉 攻撃者の痕跡はメモリにしか残っていないことがある
この記事では:
- フォレンジックとは何か
- なぜメモリを解析するのか
- OSはメモリをどう管理しているのか(CS基礎)
- どうやってメモリダンプを取得・解析するのか
を解説します。
フォレンジックとは
「フォレンジック(forensics)」はラテン語の forensis(「法廷の」)が語源です。
👉 法的証拠として使えるよう、デジタルデータを収集・保全・解析する技術
デジタルフォレンジックの分野
| 分野 | 対象 | 主な用途 |
|---|---|---|
| メモリフォレンジック | RAM(揮発性メモリ) | マルウェア検出、暗号鍵抽出 |
| ディスクフォレンジック | HDD/SSD | 削除ファイル復元、ログ解析 |
| ネットワークフォレンジック | パケットキャプチャ | 通信記録の解析・追跡 |
| モバイルフォレンジック | スマートフォン | 通話履歴、アプリデータ抽出 |
| クラウドフォレンジック | クラウドサービスのログ | 不正アクセスの追跡 |
メモリフォレンジックが重要な理由
ディスクフォレンジック → 「何が保存されていたか」がわかる
メモリフォレンジック → 「何が動いていたか」がわかる
👉 ディスクに痕跡を残さない攻撃に対して有効
そもそもメモリとは
物理メモリと仮想メモリ
物理メモリ(RAM)
└── 実際にマシンに刺さっているチップ
仮想メモリ
└── OSが各プロセスに「見せる」アドレス空間
👉 各プロセスは自分だけのアドレス空間を持っていると思っている
プロセスのメモリ空間
高アドレス
┌─────────────┐
│ スタック │ ← 関数の戻り先、ローカル変数
├─────────────┤
│ ↓ │
│ (空き) │
│ ↑ │
├─────────────┤
│ ヒープ │ ← malloc/new で動的確保
├─────────────┤
│ データ領域 │ ← グローバル変数、定数
├─────────────┤
│ テキスト領域│ ← プログラムの命令(コード)
└─────────────┘
低アドレス
ページング
OSはメモリを「ページ」という単位(通常4KB)で管理します。
仮想アドレス → ページテーブル → 物理アドレス
👉 ページテーブルはOS(カーネル)が持つ
RAM に載りきらないページは:
- Linuxなら swap パーティション
- Windowsなら pagefile.sys
に書き出されます。
なぜメモリにしか残らない情報があるのか
① 暗号鍵・パスワード
HTTPS通信の処理中
→ TLSの秘密鍵がメモリ上に平文で展開される
→ 通信が終わっても直ぐには消えない
👉 ディスクには書かれない
② ファイルレスマルウェア
通常のマルウェア
→ .exe をディスクに書いて実行
ファイルレスマルウェア
→ PowerShell など正規プロセスのメモリ上で動作
→ ディスクに何も残さない
👉 アンチウイルスにも検知されにくい
③ 実行中のプロセス・ネットワーク接続
ps / netstat の出力もメモリ上の情報
→ ログには残らない
→ 再起動したら消える
メモリダンプとは
👉 実行中の物理メモリ全体をファイルとして保存したもの
電源を切ったら消えてしまう情報を、解析できる形で保存する。
Linuxの場合:LiME
LiME(Linux Memory Extractor)はカーネルモジュールとして動作します。
# LiMEをビルドして読み込む
sudo insmod lime.ko "path=/tmp/memory.lime format=lime"
👉 /tmp/memory.lime にメモリダンプが生成される
Windowsの場合
| 方法 | 説明 |
|---|---|
| WinPmem | オープンソースのツール |
| タスクマネージャ | プロセス単位のミニダンプ |
| hiberfil.sys | ハイバネーション時に自動生成 |
| pagefile.sys | スワップ領域(一部のメモリ情報が残る) |
VMの場合
VMware → .vmem ファイル(スナップショット時)
VirtualBox → .sav ファイル
👉 スナップショットがそのままメモリダンプになる
解析ツール:Volatility 3
Volatility はメモリダンプ解析の定番ツールです。
インストール
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
pip3 install -r requirements.txt
基本的な使い方
python3 vol.py -f memory.lime [プラグイン名]
主要な解析手順
① プロセス一覧:pslist vs psscan
# pslistはOSのリストをたどる
python3 vol.py -f memory.lime linux.pslist
# psscanはメモリを直接スキャン
python3 vol.py -f memory.lime windows.psscan
👉 psscan の方が隠しプロセスも見つかる
違い:
| コマンド | 仕組み | 特徴 |
|---|---|---|
| pslist | OSのプロセスリストをたどる | 速い・改ざんに弱い |
| psscan | メモリ全体をスキャン | 遅い・rootkit も検出できる |
② ネットワーク接続
# Windowsの場合
python3 vol.py -f memory.dmp windows.netstat
出力例:
PID Proto LocalAddr:Port ForeignAddr:Port State
1234 TCP 192.168.1.10:80 10.0.0.1:54321 ESTABLISHED
👉 不審な外部接続がないか確認
③ 不審プロセス検出:malfind
python3 vol.py -f memory.dmp windows.malfind
👉 実行可能なメモリ領域に書き込まれたコードを検出
検出の仕組み:
通常のプロセス
→ コードはテキスト領域(読み取り専用)にある
インジェクションされたコード
→ ヒープやスタックに実行権限付きで書かれる
④ 文字列の抽出
python3 vol.py -f memory.dmp windows.strings --string-file strings.txt
または:
strings memory.dmp | grep -i "password\|token\|secret"
👉 平文で保存されているパスワードや鍵を見つけられる
よくある誤解
❌ ディスクを見れば十分
👉 違う
- ファイルレスマルウェアはディスクに何も残さない
- ネットワーク接続状態はディスクに記録されない
- 実行時のメモリ内容はログに残らない
❌ メモリはすぐ消える
👉 完全には消えない
hiberfil.sys → スリープ時のメモリが丸ごと保存される
pagefile.sys → スワップされたページが残る
コールドブート攻撃 → 電源切断直後でもDRAMは数秒〜数分保持する
まとめ
- メモリはプロセスごとに仮想アドレス空間を持つ
- メモリにしか残らない情報がある(鍵、マルウェア、接続状態)
- LiME / WinPmem でメモリダンプを取得できる
- Volatility 3 で解析できる
-
psscanで隠しプロセス、malfindでインジェクション検出
おわりに
今回のポイントはこれです:
「ディスクを消しても、メモリは残る」
インシデント対応でも CTF でも、
メモリを見る視点を持つと解像度が一段上がります。