
Windows カーネルエクスプロイト CVE-2021-1732 向け。win32kfull.sys の use-after-free 脆弱性であり、細工されたウィンドウ作成とコールバック操作を通じてローカル権限昇格を可能にする。
win32kfull!NtUserCreateWindowEx 関数における、カーネルコールバックによるユーザーモードメモリ割り当てと tagWND->flag 属性設定の同期ずれに起因します。これにより、tagWND->offset 値を偽装してメモリ境界外アクセスが可能になります。win32kfull.sys が NtUserCreateWindowEx を呼び出してウィンドウを作成する際、tagWND->cbWndExtra(ウィンドウインスタンスの追加メモリ割り当て数)をチェックします。この値が空でない場合、win32kfull!xxxClientAllocWindowClassExtraBytes 関数を呼び出してユーザーレイヤ user32.dll!__xxxClientAllocWindowClassExtraBytes をコールバックし、メモリを割り当てます。割り当て後のアドレスは NtCallbackReturn 関数を使用してスタックを修正した後、カーネル層に戻り保存されて実行が継続されます。しかし、tagWND->flag 値に 0x800 属性が含まれると、その保存値はオフセットになります。user32.dll!_xxxClientAllocWindowClassExtraBytes 関数をフックし、NtUserConsoleControl を呼び出して tagWND->flag に 0x800 属性値を含むように変更した後、NtCallbackReturn を使用してカスタム値をカーネルの tagWND->offset に返すことができます。win32kfull!NtUserCreateWindowEx 内で発生します。win32kfull.sys が NtUserCreateWindowEx を呼び出してウィンドウを作成する際、tagWND->cbWndExtra をチェックします。この値が空でない場合、win32kfull!xxxClientAllocWindowClassExtraBytes 関数を呼び出してユーザーレイヤ user32.dll!__xxxClientAllocWindowClassExtraBytes をコールバックし、メモリを作成します。割り当て後のアドレスは NtCallbackReturn を使用してスタックを修正した後、カーネル層に戻り保存されて実行が継続されます。しかし、tagWND->flag 値に 0x800 属性が含まれる場合は、その値にオフセットでアクセスします。NtUserConsoleControl を使用してフラグに 0x800 属性を含めるように変更します。17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
NtUserConsoleControl を呼び出すと、tagWND->offset と tagWND->flag 値に 0x800 属性が含まれるよう再設定されると述べています。フラグ値に 0x800 属性が含まれる場合、オフセットでアクセスします。ここで NtUserConsoleControl を呼び出す目的は、tagWND->flag 値に 0x800 属性を含めるように変更し、さらに NtCallbackReturn 関数を呼び出して指定値を返すことで tagWND->offset を再変更することです。なぜなら win32kfull!xxxClientAllocWindowClassExtraBytes は戻り値を tagWND->offset に格納するからです。
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`