新たに文書化されたインジェクション技術は、Windowsグラフィカルサブシステム(win32k.sys)が使用するカーネル・ユーザー間のコールバックディスパッチパスを悪用し、KernelCallbackTableの構造を維持したままリモートコード実行を実現します。
KernelCallbackTableのエントリをシェルコードポインタに差し替えるのではなく、攻撃者はテーブルから正規のコールバックターゲットを特定し、そのユーザーモードルーティン内にインラインの迂回路を設置します。これにより、呼び出し時に期待されるGUIコールバックが攻撃者の管理下にあるシェルコードへとジャンプするようになります。
この変更はPEBテーブル自体ではなく、コールバックのエントリポイントに対して行われるため、多くの整合性チェックが検出対象とする明らかな痕跡を残しにくくなっています。リモートスレッドの作成やAPCベースのインジェクションと比べて、よりステルス性の高い代替手法となっています。
カーネルがユーザーモードに切り替わると、実行はntdllのKiUserCallbackDispatcherに到達します。KiUserCallbackDispatcherは、対象プロセスのProcess Environment Block(PEB)に格納されたKernelCallbackTableから要求されたコールバックインデックスを参照し、関連するユーザーモードハンドラー(通常はuser32.dll内の関数)に制御を渡します。
KernelCallbackTableのエントリを列挙することで、攻撃者は__fnCOPYDATAのような頻繁に到達可能なコールバックの具体的な関数ポインタを特定し、確実なトリガーを準備できます。
Mediumの記事によると、この技術はwin32k.sysがGUI関連の処理をユーザーモードコードに依頼するために使用する標準的なKeUserModeCallbackトランジションを悪用しています。
Hacking& Cracking
KernelCallbackTableのエントリを上書きする手法(PEB構造やテーブルの整合性を検証することで防御側が検出できる技術)とは異なり、攻撃者は対象プロセスに実行可能メモリを確保してシェルコードを書き込み、正規のコールバックルーティンのプロローグバイトを保存した上で、インジェクトされたコードへの絶対ジャンプでルーティンの先頭にパッチを当てます。
迂回先として__fnCOPYDATAを選択するのは意図的なものです。この関数はWM_COPYDATAメッセージに応答して呼び出され、SendMessageを通じて外部からトリガーできます。そのため、異常なプロセス状態や複雑な同期処理を必要とせず、信頼性の高いインバンド実行プリミティブとして機能します。
Win32kを乗っ取るWindowsインジェクション技術
技術的な実装は、シンプルな3ステップのフローに沿っています。まず、攻撃者は対象プロセスを開き、そのPROCESS_BASIC_INFORMATIONを照会してPEBアドレスを取得し、PEBオフセットのKernelCallbackTableポインタを読み取ります。
次に、NtAllocateVirtualMemoryによってリモートで実行可能メモリが確保され、NtWriteVirtualMemoryを通じてシェルコードが書き込まれます。

そして、攻撃者はNtReadVirtualMemoryで元のコールバックプロローグを読み取って保存し、NtProtectVirtualMemoryで一時的にページ保護を変更した後、プロローグにx64絶対ジャンプスタブを上書きし、SendMessageW/WM_COPYDATAでコールバックをトリガーします。
変更が正規の関数のメモリ上のプロローグに限定されているため、変更されたPEB構造や予期しないコールバックテーブルアドレスに注目する従来のヒューリスティックでは、この活動を見逃す可能性があります。

ただし、防御側はいくつかの方法でこの技術を検出できます。代表的なuser32コールバックルーティンに対するプロセス内コードページの変更、直後にSendMessageトリガーが続く異常なWriteProcessMemory/NtWriteVirtualMemoryのシーケンス、またはコールバック呼び出しウィンドウ付近での一時的な実行可能アロケーションを監視することが有効です。
EDRがリモートメモリ保護の変更(PAGE_EXECUTE_READWRITE)をキャプチャできるよう構成し、GUIメッセージトラフィックと相関分析することで、実用的な検出手段が得られます。
技術的な詳細情報や緩和策については、KeUserModeCallbackとKiUserCallbackDispatcherに関するMicrosoftのドキュメント、およびKernelCallbackTableインジェクションとインライン関数デトゥーリングに関する公開された解説記事を参照してください。
翻訳元: https://gbhackers.com/windows-injection-technique-hijacks-win32k/