2025/06/04 10:11 Hypervisors for Memory Introspection and Reverse Engineering

ロボ子、今回の記事はWindows上でメモリイントロスペクションとリバースエンジニアリングを行うためのRustベースのハイパーバイザの話じゃ。

ハイパーバイザですか。面白そうですね、博士。

そうじゃろう!UEFIベースのIllusionと、WindowsカーネルドライバベースのMatrixという2つのプロジェクトが紹介されておるぞ。

それぞれ特徴があるんですね。

両方ともExtended Page Tables (EPT)を活用して、ゲストメモリを変更せずに制御フローをリダイレクトするステルス技術を使っているのがミソじゃ。

EPTですか。仮想アドレスから物理アドレスへの変換を行う仕組みですね。

その通り!Illusionは、System Service Descriptor Table (SSDT)が完全に初期化されたタイミングを狙って安全にフックを仕掛けるのが特徴じゃ。

SSDTの初期化完了を待つことで、システムクラッシュを防ぐんですね。賢い。

MatrixはデュアルEPTモデルを使っておる。プライマリEPTが読み書きメモリをマップし、セカンダリEPTが実行専用のシャドウページをリマップするのじゃ。

シャドウページですか。ハイパーバイザが元のページの複製を作成して、メモリアクセスを傍受・監視・リダイレクトするんですね。

さすがロボ子、理解が早い!このシャドウイング技術を使うことで、ゲスト仮想メモリからインラインフックを隠せるのじゃ。

攻撃者から見つかりにくくするんですね。

そう!そして、VMCALL、CPUID、INT3などのCPU命令でVM-exitをトリガーして、制御を奪うのじゃ。

命令レベルでのトラップですか。細かく制御できるんですね。

Illusionでは、上書きされたバイトを安全に復元するために、Monitor Trap Flag (MTF)シングルステップを使うんじゃ。

MTFですか。命令を一つずつ実行するんですね。

これらのテクニックはゲームハッキングコミュニティでは有名らしいが、情報セキュリティではまだ十分に活用されていないらしいぞ。

なるほど。この記事は、そのギャップを埋めるためのものなんですね。

その通り!しかも、使われているテクニックはすべて公開されていて、安定しているらしい。

再現性が高いのは良いですね。

両方のハイパーバイザはゲストメモリを一切変更しないから、システムの整合性を保ちつつ、PatchGuardのようなカーネル保護も回避できるんじゃ。

それはすごい!ステルス性が高いんですね。

IA32_LSTAR MSRへの書き込みをインターセプトして、Windowsカーネルの物理ベースアドレスと仮想ベースアドレスを特定するテクニックも紹介されておる。

MSRですか。モデル固有レジスタですね。

そうそう。このレジスタにはsyscallハンドラのアドレスが格納されておる。

そこから逆算して、カーネルのアドレスを特定するんですね。

manage_kernel_ept_hook関数は、ターゲットカーネル関数へのEPTフックのインストールと削除を管理するんじゃ。

フックの管理を自動化するんですね。

セカンドレベルアドレステーブル変換 (SLAT)は、ハイパーバイザが2番目のページ変換レイヤーを定義できる機能のことじゃ。

SLATを使うことで、ソフトウェア介入なしにゲスト物理アドレスをホスト物理アドレスに変換できるんですね。

Illusionは、MTFステッピングを使って置き換えられた命令をリプレイするブートタイムイントロスペクションモデルを検討しておる。

ブート時から監視できるのは強力ですね。

Matrixは、すべての論理プロセッサで共有される単一のEPTを使用するWindowsカーネルドライバベースのハイパーバイザじゃ。

共有EPTモデルは統合が容易なんですね。

最後に、仮想化ベースのセキュリティ (VBS) がカスタムハイパーバイザベースのフッキングを難しくしているという話も出てくるぞ。

VBSは強力なセキュリティ機能ですからね。

まあ、それでも独自のハイパーバイザを構築する価値はある!より優れた制御、柔軟性、理解が得られるからの。

勉強になりました!

ところでロボ子、ハイパーバイザと聞いて思い出すお菓子は何じゃ?

え?ハイレモン、ですか?

ぶっぶー!正解は、ハイパー(高い)カロリーなお菓子じゃった!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。