こんにちは!日夜、サイバー空間の「泥棒」たちと知恵比べをしながら、侵入された企業のレスキュー(インシデント調査)を行っているSOCアナリストです。
今回は、セキュリティの世界でも特に奥が深く、プロの調査官が最も神経を尖らせる「メモリフォレンジック」の世界へ、皆さんをご案内します。
「メモリダンプ? フォレンジック? 何だか難しそう……」と思った方も安心してください。今回は、難しい専門用語をできる限り使わず、「おうちの防犯」や「泥棒に入られた現場の保存」に例えて、一歩ずつ丁寧に紐解いていきます。
ITの運用を始めたばかりの新人担当者の方や、セキュリティに興味がある開発者の皆さんにとって、いざという時に役立つ「実践的な知見」をギュッと詰め込みました。それでは、一緒に学んでいきましょう!
—
1. なぜ「メモリ」を調べるの? 本棚と「机の上」のたとえ話
サイバー攻撃が発生したとき、多くの人は「ハードディスク(SSD)のファイルを調べればいいのでは?」と考えます。確かに、ハードディスクはすべてのデータが保存される「本棚」のようなものです。
しかし、最近の賢い泥棒(ハッカー)は、本棚に一切証拠を残さず、メモリ(RAM)という「一時的な作業机」の上だけで悪事を働き、証拠を残さずに立ち去る手法(ファイルレス攻撃など)を好みます。
メモリはPCの電源を切ると消えてしまう、いわば「一瞬の記憶」です。
【ハードディスク(本棚)】
電源を切っても残る。過去の記録。
【メモリ(作業机の上)】
電源を切ると消える。今まさに泥棒が散らかしている書類や、使っている道具(ウイルス)。
泥棒が今まさに部屋で作業している痕跡を押さえるには、この「作業机の上(メモリ)」をそのままカメラでパシャリと撮影して保存しなければなりません。この、メモリの中身を丸ごとファイルとして保存したものを「メモリダンプ」と呼びます。
—
2. メモリ汚染との戦い:足跡を残さずに犯行現場を撮影する方法
ここで、フォレンジックの現場で最も頭を悩ませる大問題が発生します。
犯行現場をカメラで撮影するために部屋に入ると、「自分自身の足跡」で現場が汚れてしまいますよね。
メモリも全く同じです。メモリダンプを取得するツール(プログラム)を起動した瞬間、そのツール自体がメモリ(作業机)の上に乗り上げてしまい、もともとあった犯人の痕跡を上書きして消し去ってしまうのです。これを専門用語で「メモリ汚染(アーティファクトの発生)」と呼びます。
現場をできるだけ汚さずに、ありのままの証拠を確保するためには、以下のような「徹底した気配り」が必要になります。
汚染を最小限に抑える3つのアプローチ
1. ツールのサイズは極限まで小さく!
余計な機能がついた重いソフトは使わず、メモリを丸ごと書き出す機能だけに特化した、極小のツール(WinPmem や DumpIt など)を使いましょう。
2. ダンプデータの保存先は「外」にする!
撮影した写真(メモリダンプファイル)を、調査対象のパソコンの中に保存してはいけません。保存する処理自体が、さらにメモリやディスクを汚してしまうからです。必ず、外付けUSBメモリや、ネットワーク経由の共有フォルダに直接書き出すように設定します。
3. コマンドプロンプトやPowerShellの起動すら慎重に!
調査のために黒い画面(コマンドライン)を立ち上げるだけでも、メモリは書き換わります。本番では、あらかじめ用意したバッチファイルをクリックするだけで、一瞬で処理が終わるように準備しておくのがプロの鉄則です。
—
3. ハッシュ管理:撮影した写真が「本物」だと証明する仕組み
無事にメモリを撮影(ダンプ)できたら、次に重要なのが「この写真は、後から改ざんされた偽物ではありません」と裁判所や警察、あるいは社内の報告会議で証明することです。
せっかく見つけた泥棒の証拠も、「後からあなたがPhotoshopで合成したのでは?」と疑われてしまっては意味がありません。
ここで登場するのが、デジタルの封印シールである「ハッシュ値」です。
ハッシュ値はおうちの「封印スタンプ」
ハッシュ値とは、データから計算される「絶対に重複しない、そのファイル固有の指紋」のようなものです(主に SHA-256 という計算方法が使われます)。
1. メモリをダンプした直後に、そのファイルの「指紋(ハッシュ値)」を計算してメモしておきます。
2. その後、解析用のパソコンにファイルをコピーして調査を行います。
3. 調査の前後で再度ハッシュ値を計算し、最初のメモと「1文字」でも狂いがなければ、そのファイルは1ビットも改ざんされていない(整合性が保たれている)ことが証明されます。
[取得直後のメモリダンプ] ──(ハッシュ計算)──> 「a1b2c3d4...」(指紋をメモ)
│
▼ (解析のために移動・保管)
│
[解析前のメモリダンプ] ──(再計算)───> 「a1b2c3d4...」(完全一致=改ざんなし!)
—
4. 実践!安全にメモリを取得してハッシュを記録するスクリプト例
それでは、実際の現場で使える具体的な手順を見てみましょう。
ここでは、Windows環境を想定し、管理者権限で実行することで「メモリダンプの取得(イメージ)」と「ハッシュ値の自動記録」を安全に行うPowerShellスクリプトのサンプルをご紹介します。
このスクリプトは、調査対象のPCを汚さないよう、「USBメモリ(Dドライブ等)から実行し、ダンプファイルとハッシュ値を直接USBメモリに書き出す」設計にしています。
# =========================================================================
# 【フォレンジック向け】メモリダンプ取得 & ハッシュ自動生成スクリプト
# =========================================================================
# [事前準備]
# 信頼できるメモリ取得ツール(例: winpmem.exe)をこのスクリプトと同じフォルダに配置します。
# 実行する際は、必ず「管理者として実行」したPowerShellで呼び出してください。
# 1. 保存先と出力ファイル名の定義
# ※対象PCのハードディスクを汚さないよう、スクリプトが実行されている場所(USB等)を出力先にします。
$ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
$TargetHost = $env:COMPUTERNAME
$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$DumpFile = Join-Path $ScriptPath "${TargetHost}_memory_${Timestamp}.raw"
$HashFile = Join-Path $ScriptPath "${TargetHost}_memory_${Timestamp}_hash.txt"
$ToolPath = Join-Path $ScriptPath "winpmem.exe" # 信頼されたダンプツール
Write-Host "=========================================================" -ForegroundColor Cyan
Write-Host "[DFIR] メモリ保全処理を開始します..." -ForegroundColor Cyan
Write-Host "対象ホスト: $TargetHost"
Write-Host "出力先: $DumpFile"
Write-Host "=========================================================" -ForegroundColor Cyan
# 2. ツールが存在するか確認
if (-not (Test-Path $ToolPath)) {
Write-Error "エラー: メモリ取得ツール(winpmem.exe)が見つかりません。USBメモリの配置を確認してください。"
exit
}
# 3. メモリダンプの実行(汚染を避けるため、静かに実行)
Write-Host "[1/2] メモリをダンプ中...(これには数分かかります。PCには触らないでください)" -ForegroundColor Yellow
# winpmemを実行し、進捗を妨げないように直接USBに書き出します
Start-Process -FilePath $ToolPath -ArgumentList "-o `"$DumpFile`"" -NoNewWindow -Wait
# ダンプファイルが正しく作成されたか確認
if (Test-Path $DumpFile) {
Write-Host "[成功] メモリダンプの作成が完了しました。" -ForegroundColor Green
} else {
Write-Error "エラー: メモリダンプの作成に失敗しました。"
exit
}
# 4. 整合性検証のためのハッシュ値(SHA-256)の計算
Write-Host "[2/2] 整合性検証用のハッシュ値(SHA-256)を計算中..." -ForegroundColor Yellow
# ダンプファイルの「指紋」を採取します
$FileHash = Get-FileHash -Path $DumpFile -Algorithm SHA256
# ハッシュ値とファイル名、取得日時を記録したテキストファイルを作成
$HashReport = @"
=========================================================
メモリダンプ 整合性検証レポート (SHA-256)
=========================================================
取得日時 : $(Get-Date)
対象ホスト : $TargetHost
ファイル名 : $(Split-Path $DumpFile -Leaf)
ハッシュ値 : $($FileHash.Hash)
=========================================================
"@
# テキストファイルとして保存(これもUSB内)
$HashReport | Out-File -FilePath $HashFile -Encoding utf8
Write-Host "[完了] ハッシュ値が正常に記録されました!" -ForegroundColor Green
Write-Host "ハッシュ値: $($FileHash.Hash)" -ForegroundColor White
Write-Host "保存された報告書: $HashFile" -ForegroundColor White
Write-Host "=========================================================" -ForegroundColor Cyan
スクリプトのポイント
Start-Process ... -Wait: ツールが完全にメモリを書き出し終わるまで次の処理に進まないように制御しています。Get-FileHash: Windows標準の安全なコマンドを使って、ダンプ直後の「指紋(SHA-256)」を計算しています。これにより、サードパーティ製の怪しいツールを追加で動かす必要がなく、メモリ汚染を最低限に抑えられます。
—
5. まとめ:一歩ずつ対策を学んでいきましょう!
メモリフォレンジックは、サイバー攻撃者との「心理戦」であり「タイムレース」です。
一見すると難解な分野ですが、今回お話しした以下の3つの大原則を覚えておけば、基礎はバッチリです。
1. メモリは「作業机」: 電源を切ると消えてしまう、今まさに進行中の証拠が詰まった場所。
2. 足跡を残さない(汚染防止): ツールは最小限にし、保存先は外付けメディアにする。
3. 封印シール(ハッシュ値): 取得した直後に指紋(SHA-256)を記録し、後から改ざんされていないことを証明する。
インシデントレスポンス(事後対応)のスキルは、一朝一夕で身につくものではありません。まずは、テスト環境で実際にメモリをダンプしてみて、「ハッシュ値が変わらないこと」を目で確認する一歩から始めてみませんか?
皆さんのシステムが今日も明日も安全であることを願っています。一歩ずつ、一緒にセキュリティの階段を上っていきましょう!
コメント