【入門編】 WindowsメモリにおけるVAD(Virtual Address Descriptor)ツリーの解析と不正メモリ領域の特定 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!インシデントレスポンスの現場を渡り歩いているSOCアナリストの私です。

セキュリティの勉強を始めると、「マルウェアがメモリに隠れる」「ファイルレス攻撃が怖い」といった話を耳にする機会が一気に増えますよね。「ファイルがないなら、どうやってパソコンの中で悪さをしているの?」と、疑問に思う新人エンジニアの方も非常に多いです。

そこで今回は、サイバー攻撃者が好んで使う「怪しいメモリ領域」を見つけ出すための奥の手、VAD(Virtual Address Descriptor)ツリーの解析について、身近な例えを交えながら一歩ずつ優しく紐解いていきたいと思います。

難しい専門用語が出てきても置いてけぼりにしませんので、ぜひリラックスして読み進めてみてくださいね!

—

1. 家の鍵と泥棒に例える「メモリ」と「VADツリー」の仕組み

まずは、パソコンのメモリと、今回主役になるVADツリーについて、私たちの身の回りにある「家」の防犯に例えてイメージしてみましょう。

プロセス(アプリ)が使うメモリは「部屋」のようなもの

パソコンの中で動いているアプリ(Wordやブラウザなど)は、それぞれ自分専用の「部屋(メモリ空間)」を与えられて作業をしています。お行儀の良いアプリは、あらかじめ決められた家具(プログラムファイルなど)をきれいに並べて使いますよね。

VADツリーは「家の間取り図&鍵の管理台帳」

では、その部屋のどこに何を置いていて、どのドアに鍵がかかっているのかを管理しているのは誰でしょうか?それがWindowsの頭脳です。
Windowsは、プロセスが「ここからここまでを倉庫として使います!」「ここは誰でも入れる廊下です!」と申請した記録を、VADツリー(Virtual Address Descriptor)という巨大な管理台帳(間取り図のようなもの)にしっかり書き込んで把握しています。

正常なアプリであれば、「Cドライブにある正規のプログラム(C:\Program Files\...)をこの部屋に置きます」と正直に申告します。

悪意ある攻撃者の手口:隠し部屋を作る

しかし、狡猾なマルウェア(泥棒)はどうでしょう?
彼らは正体を隠すために、わざわざCドライブからプログラムファイルを読み込まず、インターネットの海から直接拾ってきた怪しいプログラムの断片(シェルコード)を、こっそりメモリの隙間に直接流し込みます。

これをセキュリティ業界では「ファイルレス攻撃」や「インジェクション」と呼びます。彼らは台帳に「ここはただのガラクタ置き場です(ファイルとは無関係のデータ領域です)」と嘘をつきつつ、実際にはその場所で「危険なプログラムを実行(ぶん殴る)」という暴挙に出るのです。

私たちがやるべきフォレンジック調査とは、この「管理台帳(VADツリー)の記録」と「実際の部屋の状態(実行権限)」の矛盾(嘘)を見破る作業に他なりません。

—

2. VADツリー解析で「嘘」を見破るポイント

メモリフォレンジックツール(Volatiltyなど)を使ってVADツリーを覗き見ると、各メモリ領域の属性がずらっと並びます。ここで私たちが目を光らせるべきポイントは、主に以下の3つです。

1. 保護属性(Protection): その領域でプログラムを「実行(Execute)」できるか?
2. コミットされたサイズ(Commit Size): どれくらいの広さを使っているか?
3. ファイルマッピング(File Object): ちゃんと実体のファイル(Cドライブのパスなど)と結びついているか?

通常、プログラムを実行できる領域(Read & Execute / RWXなど)は、必ず信頼できる正規のファイルとセットになっています。
それにもかかわらず、「ファイルと結びついていない(非ファイルベース)のに、実行権限がついている領域」があったとしたら……?

それはもう、泥棒が勝手に作った「隠し部屋」確定です。即座にマークしましょう!

—

3. 【実務で使える】Volatility 3を使ったVAD解析のハンズオン

百聞は一見にしかず。実際にインシデントレスポンスの現場で使われている、メモリ解析フレームワーク Volatility 3 を使った具体的な手順を見ていきましょう。

今回は、怪しい挙動をしているプロセスのPID(プロセスID)が 1234 だと仮定して、そのVADツリーを暴くコマンドを叩いてみます。

ステップ1: プロセスのVAD情報をリストアップする

ターミナルを開き、次のようなコマンドを実行します。(※実際の環境に合わせて適宜パスや引数を調整してください)

# Volatility 3を使用して、指定したPID(1234)のVAD情報を一覧表示する
python vol.py -f memdump.raw windows.vadinfo.VadInfo --pid 1234

このコマンドを実行すると、ターミナルにそのプロセスが持つ膨大なメモリ領域のリストがダーッと出力されます。

ステップ2:怪しい領域をフィルターして絞り込む

出力結果の中から、先ほどお話した「怪しい条件(ファイル名がないのに実行できる)」に合致するものを探します。
PythonやPowerShellのスクリプト、あるいはLinuxの grep コマンドなどを組み合わせて、怪しい兆候を絞り込んでいきます。

例えば、以下のような怪しいエントリが見つかったとします。

# VAD解析結果の抜粋例(仮想的な出力)
VAD Node Start: 0x0000000140000000
VAD Node End:   0x000000014000ffff
Protection:     PAGE_EXECUTE_READWRITE  <-- 【危険】実行・書き込み権限の両方がある!
File Object:    None                    <-- 【怪しい】背後に正規のファイルが存在しない!

PAGE_EXECUTE_READWRITE(または PAGE_EXECUTE_READ)かつ File Object が None(または空欄)。この組み合わせが見つかった瞬間、SOCアナリストの心拍数が上がります。「あ、ここにシェルコードが居座っているぞ」と確信する瞬間です。

—

4. 発見した怪しいメモリ領域を「ダンプ(採取)」して証拠保全する

怪しいメモリ領域の住所(開始アドレスと終了アドレス)が分かったら、次は犯人の足跡を掴むために、その場所のデータをまるごとファイルとして切り出します(メモリダンプ)。

Volatility 3には、特定のVAD領域を切り出す便利なプラグイン windows.vadwalk や windows.memmap などが用意されています。

# 怪しい領域のメモリデータをファイルに切り出す例
python vol.py -f memdump.raw windows.dumpfile.DumpFile --pid 1234 --virtaddr 0x0000000140000000

無事にファイルが保存できたら、それを安全な隔離環境(サンドボックス)に持って行き、静的解析にかけたり、文字列検索(strings コマンドなど)をかけて、マルウェアが通信しようとしているC2サーバーのIPアドレスや、悪意ある命令が隠されていないかを詳細に暴いていくのです。

—

5. 一歩ずつ対策を学んでいきましょう!

いかがでしたでしょうか?
「VADツリー」や「ファイルレスメモリ領域」と聞くと、なんだか呪文のように難しく感じられたかもしれませんが、要するに「家の間取り図(台帳)と、実際の部屋の鍵の使い方が矛盾していないかをチェックする防犯パトロール」と同じことです。

セキュリティのスキルアップは、一日にして成らず。最初は難解なコマンドや概念に圧倒されるかもしれませんが、こうして一つひとつの仕組みを「身近な例え」と「実際のコマンド」に落とし込んでいけば、確実に自分の血肉になっていきます。

インシデントの現場は緊張感の連続ですが、パズルを解くような鮮やかな謎解きができるのも、この仕事の大きな醍醐味です。ぜひ今日の解説を参考に、ご自身の環境や学習用イメージでもVAD解析にトライしてみてくださいね。

それでは、また次回のセキュリティ解説でお会いしましょう!一歩ずつ、着実にスキルを磨いていきましょう!

コメント

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