【入門編】 Volatility 3を用いたプロセスツリーの再構築と親プロセス偽装の検知 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

メモリを覗けば悪意が見える!Volatility 3で「親の顔」を偽る侵入者を暴こう

こんにちは!現場でインシデント対応の指揮を執っていると、「何が起きたか全くわからない!」とパニックになっているエンジニアの方々に頻繁に出会います。そんな時、私たちが頼りにするのは「メモリフォレンジック」という手法です。

パソコンのメモリには、その瞬間、そのPCで何が動いているかの「全て」が残っています。今日は、攻撃者がよく使う「親プロセスの偽装」という卑劣な手口を、Volatility 3を使って見破る方法を解説します。

—

泥棒が「家族のフリ」をして家に侵入する?

まず、プロセスの親子関係をイメージしてみましょう。

Windowsでは、あらゆるプログラム(プロセス)には「親」がいます。例えば、皆さんが普段使うフォルダ画面(explorer.exe)が親となり、そこからメモ帳やブラウザが立ち上がります。

攻撃者は、この「親と子の関係」を悪用します。
普通、explorer.exeからpowershell.exeが勝手に起動して、怪しいコマンドを打つなんてことはまずありませんよね? 泥棒が玄関から堂々と入り、「私は家族の友人だ」と嘘をついて忍び込むようなものです。

彼らは、自分の存在を隠すために「正規のプログラムの子供として振る舞う」ことで、セキュリティソフトの目を誤魔化そうとするのです。

—

Volatility 3で「家族構成」を覗き見る

Volatility 3は、メモリという「動かぬ証拠」を解析するための強力なツールです。今回使う pstree プラグインは、まさに「家族構成図」を作成してくれるものだと考えてください。

1. まずは構成図を出力する

以下のコマンドをターミナルで実行してみましょう。

# -f はメモリダンプファイルの指定です
# windows.pstree はプロセスツリーを表示するプラグインです
python3 vol.py -f memory_dump.raw windows.pstree

出力結果を見ると、ずらりとプロセスが並びます。ここで注目すべきは、「誰が誰を産んだのか」という階層構造です。

—

異常を見抜く「違和感」の正体

pstreeの結果を眺めていると、こんな奇妙な行が見つかるかもしれません。

* 0x1234  explorer.exe
    * 0x5678  powershell.exe  <-- ん?ここが怪しい!

本来、explorer.exeはユーザーが操作する画面を司るものです。そこからpowershell.exeが、しかも裏側で隠れて起動しているとしたら…それは十中八九、攻撃者の仕業です。

なぜ「親プロセス偽装」がバレるのか

攻撃者は「親のID(PID)」を偽装しようとしますが、プロセスの起動時刻や、メモリ上の関連情報まで完璧に作り変えるのは非常に困難です。Volatility 3を使えば、以下のポイントで「偽物」を暴けます。

1. 不自然な親子関係: 本来ありえない親から起動している。
2. 実行パスの矛盾: C:\Windows\System32\にいないはずのpowershell.exeが動いている。
3. 終了時刻の不一致: 親よりも先に子が死んでいる、あるいは親が起動する前に子が動いている。

—

防御への第一歩:自分たちのPCを守るために

「解析は専門家がやることでしょ?」と思うかもしれませんが、開発者やIT担当者としてできることがあります。

  • EDRの導入: そもそも、このような怪しいプロセス起動を自動的に検知・ブロックする「EDR(Endpoint Detection and Response)」を導入するのが現代の基本です。
  • ログの監視: PowerShellの実行ログ(Script Block Logging)を有効にしておくことで、誰が何をしようとしたか、後からでも追跡可能になります。

まとめ:一歩ずつ理解を深めよう

今日学んだのは、「プロセスには必ず親がいて、その関係性を疑うことで侵入者の嘘を見抜ける」という点です。

最初はVolatility 3の膨大な出力に圧倒されるかもしれません。でも、まずは「explorer.exeから変なプログラムが起動していないか?」という視点を持つだけで、皆さんの防御力は格段に上がります。

何か怪しい挙動があったら、慌てず騒がず、まずはメモリをダンプして、pstreeで「家族構成」を確認してみる。この「泥臭い一手間」が、重大な被害を防ぐ鍵になるのです。

次回の記事では、この怪しいプロセスが「具体的にどんなコマンドを打ったのか」をメモリから抽出する方法を解説しますね。一歩ずつ、着実に学んでいきましょう!

コメント

タイトルとURLをコピーしました