メモリの深淵を覗く:DKOMによるプロセス隠蔽と「不整合」の追跡術
インシデントレスポンスの現場において、「プロセスリストに存在しないはずの脅威」と対峙した経験はどれほどあるだろうか。タスクマネージャーや ps コマンドがクリーンに見えても、メモリの深層では悪意あるスレッドが呼吸を続けている。これがDKOM(Direct Kernel Object Manipulation)の真骨頂だ。
今回は、カーネルオブジェクトの不整合を突くことで、この「透明な侵入者」をあぶり出す手法について、カーネル構造の深淵から解説する。
—
1. DKOMの論理:OSの「目」を欺くメカニズム
Windowsのプロセス管理において、カーネルは EPROCESS という構造体の双方向リンクリスト(ActiveProcessLinks)を用いてプロセスを追跡する。攻撃者が行うのは、このリストから自身の EPROCESS を切り離す(Unlink)行為だ。
ポインタを書き換え、リスト上のAとCを直接繋ぐことで、B(悪意あるプロセス)はOSの管理リストから「存在しない」状態になる。しかし、ここで一つ重要な事実がある。「リストから外れても、スレッドスケジューラはプロセスを動かし続ける」ということだ。スケジューラはリストではなく、ディスパッチャ・キュー等を参照して実行権を割り当てるからだ。
2. 不整合を見抜く:二つの視点の乖離
カーネルオブジェクトの不整合を突くとは、「リスト」と「他の管理構造」の間に生じるエントロピーの差分を抽出することに他ならない。以下の二つの手法が、現場で最も信頼できる検知ロジックだ。
A. スレッド探索法(Thread Enumeration)
プロセスリストに載っていないプロセスでも、そのスレッドは ETHREAD 構造体としてカーネル内に存在する。すべてのスレッドを列挙し、そこから親プロセス EPROCESS を逆引きする。リスト上に存在しない EPROCESS が見つかれば、それが即ちDKOMによる隠蔽の証拠だ。
B. ハンドルテーブルの監査(Handle Table Audit)
プロセスが保持するハンドルテーブルをスキャンする。プロセスが隠蔽されていても、デバイスドライバやファイルへのハンドルを保持している限り、ハンドルテーブル内にはそのプロセスの痕跡が残る。
—
3. 実践:Volatility 3を用いた不整合解析のロジック
Volatility 3等のフレームワークでDKOMを追う際、標準的な windows.pslist(リストベース)と windows.psscan(カーネル構造体スキャンベース)の結果を比較するのが定石だ。以下に、解析スクリプトの概念的なロジックを示す。
# 概念的な解析ロジック:pslist(リスト)とpsscan(構造体スキャン)の差分検出
def detect_dkome_process(pslist_data, psscan_data):
# pslistはActiveProcessLinksを辿るため、隠蔽プロセスは含まれない
visible_pids = {p.UniqueProcessId for p in pslist_data}
# psscanはメモリ内のEPROCESS構造体を直接スキャンするため、隠蔽プロセスも拾う
potential_threats = []
for p in psscan_data:
if p.UniqueProcessId not in visible_pids:
# ここでさらにスレッドコンテキストやトークンを検証
print(f"[!] 不整合プロセスを発見: PID {p.UniqueProcessId}")
potential_threats.append(p)
return potential_threats
4. アーキテクトが考えるべき防御層の再構築
DKOMを許すということは、カーネルメモリの保護が破綻していることを意味する。パッチやウイルス対策ソフトのシグネチャベース検知は、カーネルレベルの操作の前では無力だ。
- HVCI (Hypervisor-Protected Code Integrity) の強制:
カーネルメモリの整合性をハイパーバイザレベルで保護し、カーネルモードのデータ構造への不正な書き込みを防止する。これが現代の防衛の最低ラインだ。
- カーネルオブジェクトの改ざん監視:
EDRの機能として、ActiveProcessLinks などの主要なリスト構造の変更をカーネルコールバックで監視する。ただし、これ自体をフックする攻撃手法も存在するため、ハードウェアレベルのテレメトリ(Intel PT等)との相関分析が、次世代のDFIRには不可欠となる。
結論:技術的知見の極致へ
我々アナリストが追うべきは、ツールが吐き出す「アラート」ではなく、メモリという物理層に刻まれた「構造的な矛盾」だ。OSが提供するAPIは、あくまで「OSに見せたい世界」を描写しているに過ぎない。
メモリフォレンジックの本質は、OSの嘘を見抜き、ハードウェアが記憶するありのままの事実を再構築することにある。DKOMは古くからある攻撃手法だが、これを完璧に検知・解析できる能力は、今なおトップレベルのインシデントレスポンスにおける「選別基準」となっている。
次にメモリダンプを開くときは、ツールを動かす前に、まずはカーネル構造体のポインタが指し示す先を脳内でトレースしてみてほしい。そこにこそ、攻撃者の足跡が鮮明に浮かび上がっているはずだ。
コメント