Win32kコールバックデトゥーリング — カーネルからユーザーへのディスパッチを悪用したリモートコード実行

新たなプロセスインジェクション技術が明らかになりました。この手法は、Windowsのグラフィカルサブシステムを悪用し、極めて発見されにくいリモートコード実行を実現するものです。

win32k.sysが管理するカーネルからユーザーへのコールバックディスパッチパスを悪用することで、攻撃者はリモートスレッドの作成など、厳しく監視されているAPIに依存することなく、リモートプロセス内で任意のコードを実行できます。

この手法はグラフィカルプロセスの正規の実行フローを活用するため、従来のEDRソリューションが異常な動作を検出することは極めて困難です。

セキュリティ研究者のAdrian Medero氏(ハンドルネーム:n0qword)が、このWin32kコールバックデトゥーリング手法に関する包括的なPoC(概念実証)を最近公開しました。

IntCyberDigestが技術的な実装を分析したところ、この変種は中核的なメモリ構造を保持することで、従来のインジェクション手法と大きく異なることが判明しました。

セキュリティツールが積極的に監視しているメモリアドレスを露骨に上書きするのではなく、KiUserCallbackDispatcherをターゲットにすることで、この手法はアプリケーションの正規の制御フローにシームレスに溶け込みます。

Windowsカーネルがユーザーモードアプリケーションにグラフィカルロジックを処理させる必要がある場合、内部のKeUserModeCallback関数を介した制御された遷移が起動されます。

この重要な遷移は、ターゲットプロセスの環境ブロック内に安全に格納されたKernelCallbackTableに大きく依存しており、このテーブルにはさまざまなグラフィカルサブシステム操作へのポインタが含まれています。

従来の悪用手法では、このコールバックテーブルのエントリを直接上書きして悪意あるシェルコードを指定しますが、現代のメモリ整合性検証ツールはこのような構造的な異常を定常的に検出します。

今回詳細が明らかになったデトゥーリングの変種は、KernelCallbackTableの正確なレイアウトを保持しつつ、整合性監視を完全に回避します。

テーブル自体を改ざんするのではなく、攻撃者のツールはターゲットのコールバックポインタが指す正規のメモリ先に、極めて小さなデトゥーリングを直接仕込みます。無数に存在するコールバックエントリの中でも、データコピーに関連する関数は、昇格した権限を必要とせずに攻撃者がオンデマンドで外部から呼び出せるため、理想的なトリガープリミティブとなります。

IntCyberDigestのセキュリティアナリストは、__fnCOPYDATAルーティンはその固有のアクセスしやすさから、悪用において特に有利であると指摘しています。

ネイティブのSendMessage関数を介してターゲットウィンドウに標準のWM_COPYDATAメッセージを送信することで、悪意ある操作者はオペレーティングシステムに対してコールバックを確実にディスパッチさせることができます。

この精密なシグナリングにより、実行チェーンはペイロードへの悪意ある転送が行われる瞬間まで、想定されるカーネルからユーザーへのディスパッチパラメータの範囲内に完全に収まります。

展開フェーズでは、まず攻撃者がターゲットアプリケーションを特定し、そのメモリを読み取ってKernelCallbackTableのアドレスを正確に抽出します。

環境ブロックから正確な__fnCOPYDATAコールバックポインタが解決されると、リモートプロセスは悪意あるペイロードをステージングするための実行可能メモリをひそかに確保します。

Medero氏がMediumで公開した技術文書によると、メモリを変更する前に、ターゲットのコールバックルーティンのオリジナルバイトがローカル構造体に入念に保存されます。x+2

翻訳元: https://cyberpress.org/win32k-callback-enables-rce/

ソース: cyberpress.org