【テクニカル・上級編】 Windowsレジストリハイブ(SYSTEM, SOFTWARE, NTUSER.DAT)の解析 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

幽霊はメモリの中に棲む:Windowsレジストリ・フォレンジックの深淵

デジタルフォレンジックの現場で、ディスク上のレジストリファイルを解析するのは「基礎」だ。しかし、真に狡猾な攻撃者は、ディスクに痕跡を残さない「ファイルレス」の手口を好む。あるいは、解析を妨害するためにディスク上のレジストリを書き換えた直後にセルフデリートを試みる。

我々SOCアナリストが対峙するのは、そうした「消されたはずの過去」だ。メモリ空間にマッピングされたレジストリハイブ(SYSTEM, SOFTWARE, NTUSER.DAT)は、OSが稼働している限り、攻撃者の野心を生々しく保存し続ける。本稿では、メモリフォレンジックの視点から、Windowsレジストリに隠された永続化のロジックと、その検知の急所を深掘りする。

—

1. メモリ上のハイブ:なぜ「hivelist」から始めるのか

Windowsカーネル(Configuration Manager)は、レジストリを「セル」と呼ばれる小さなデータ構造の集合体としてメモリ上に管理している。ディスク上の .hiv ファイルはあくまで静的なバックアップに過ぎない。

攻撃者が RegDeleteKey を実行したとしても、カーネル内のキャッシュやメモリプール(Cm10 等のプールタグ)には、直前までのデータ構造が残存しているケースが多い。Volatility 3 等のツールで windows.registry.hivelist を叩く際、我々が見ているのは単なるファイルパスではなく、仮想アドレス空間に展開された「システムの思考プロセス」そのものだ。

2. SYSTEMハイブ:権限昇格とカーネルへの回廊

SYSTEMハイブの解析において、最も警戒すべきは CurrentControlSet\Services である。ここは、永続化の王道だ。

サービスの「ImagePath」に潜む罠

攻撃者は、一見正規に見えるサービス名を作成し、その ImagePath に悪意あるペイロードを仕込む。しかし、テックリードならその一歩先、Start 値と Type 値の組み合わせを見るべきだ。

  • Start = 0x02 (Automatic): OS起動時に自動実行。
  • Type = 0x10 (Win32 Own Process): 独立したプロセスとして動作。

ここで注目すべきは、FailureActions キーだ。サービスがクラッシュした際に自動で再起動する設定を悪用し、検知を逃れるためにわざとプロセスを終了させ、バックグラウンドで復活させる挙動は、近年のランサムウェアグループのローダーによく見られる。

# 疑わしいサービスを抽出する監査スクリプトの例
# ImagePathが標準的なパス(system32等)にないものを特定する
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\* | 
    Where-Object { $_.ImagePath -notmatch 'system32|SysWOW64|Program Files' -and $_.Start -eq 2 } |
    Select-Object PSChildName, ImagePath, Start

3. SOFTWAREハイブ:自動実行(ASEP)の盲点

Run や RunOnce キーの確認は新人アナリストの仕事だ。エキスパートは、より「静かな」場所を探す。その筆頭が IFEO (Image File Execution Options) である。

IFEOによる「デバッガ」ハイジャック

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options にターゲットのプロセス名(例: notepad.exe)のキーを作成し、そこに Debugger という値で悪意あるバイナリを指定する。すると、ユーザーが notepad.exe を起動するたびに、攻撃者のプログラムが身代わり、あるいは親プロセスとして起動する。

これは「脆弱性」ではなく「仕様」の悪用だが、メモリフォレンジックにおいては、実行されたプロセスの親プロセス(PPID)の不整合として顕在化する。

COMオブジェクトのハイジャック

SOFTWARE\Classes\CLSID におけるインプロセスのサーバー登録を書き換える手法も、現代のEDRを回避する有力な手段だ。特定のGUIDに関連付けられたDLLパスを、攻撃者のDLLに差し替える。これにより、正規のプロセス(explorer.exe 等)が特定の機能を呼び出した瞬間に、悪意あるコードがそのコンテキストで実行される。

4. NTUSER.DAT:標的となった「人間」の足跡

NTUSER.DAT は、侵害されたユーザーアカウントの行動ログだ。攻撃者がどのディレクトリを探索し、どのツールをダウンロードしたか。それはレジストリの「MRU (Most Recently Used)」リストに刻まれている。

UserAssist:実行の証跡

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist には、GUIから実行されたプログラムの回数と最終実行時刻が記録されている。値の名前は ROT13 で難読化されているが、これをデコードすれば、攻撃者が mimikatz.exe を何度叩いたかが一目瞭然となる。

ShellBags:隠しフォルダの露呈

攻撃者がエクスプローラーで閲覧したフォルダの履歴は BagMRU キーに保存される。たとえ攻撃者がフォルダを削除しても、レジストリ内の ShellBags 構造を解析すれば、かつてそこに「機密情報」という名のフォルダが存在した事実を証明できる。

—

5. 防御層(ガードレイル)のアーキテクチャ設計

レジストリへの不正な永続化を防ぐには、シグネチャベースの検知だけでは不十分だ。以下の3層の防御設計を推奨する。

1. レジストリ整合性モニタリング (RIM):
Sysmon (Event ID 12, 13, 14) を活用し、特に Run キーや Services キーへの書き込みをリアルタイムでSIEMに転送する。単なる「変更」ではなく、「未知のバイナリパス」が含まれているかをフィルタリングするロジックが必要だ。

2. EDRによるプロセストリー解析:
レジストリの自動実行から派生したプロセスが、不自然なネットワーク接続(例: 443ポートへのビーコニング)を行っていないか、親プロセスが services.exe でありながら非標準的な子プロセスを生成していないかを相関分析する。

3. 耐量子暗号と署名の強制:
将来的な脅威(Q-Day)を見据え、カーネルモードドライバだけでなく、ユーザーモードの重要なコンポーネントに対しても、厳格なコード署名の検証をポリシーで強制する。レジストリに何を書き込まれようとも、署名のないバイナリが実行できない環境(Windows Defender Application Control – WDAC)の構築が究極のガードレイルとなる。

結びに代えて

レジストリフォレンジックは、デジタルな考古学だ。メモリの断片から攻撃者の意図を読み解く作業には、ツールの出力結果を鵜呑みにしない「疑いの目」と、OSの内部構造に対する「深い敬意」が求められる。

攻撃者は常に、我々が「ここは安全だ」と思い込んでいる場所に潜んでいる。その場所こそが、レジストリという名の巨大なデータベースなのだ。我々プロフェッショナルに求められるのは、そのデータベースが語る静かな声に耳を澄ませ、背後に潜む「幽霊」を白日の下に晒すことに他ならない。

コメント

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