
Technische Analyse und Proof-of-Concept-Exploit für CVE-2021-1732, eine Windows-Kernel-Privilege-Escalation-Schwachstelle in win32kfull, die Exploitation über tagWND-Manipulation demonstriert.
win32kfull!NtUserCreateWindowEx auf, verursacht durch eine fehlende Synchronisation zwischen der Kernel-Rückruffunktion zur Speicherzuweisung im Benutzermodus und der Einstellung der tagWND->flag-Eigenschaft. Dadurch kann der tagWND->offset-Wert gefälscht werden, was zu einem Speicherzugriffsfehler (Out-of-Bounds) führt.win32kfull.sys NtUserCreateWindowEx zum Erstellen eines Fensters aufruft, wird tagWND->cbWndExtra (die Anzahl der zusätzlich für die Fensterinstanz zugewiesenen Speicherbytes) überprüft. Ist dieser Wert nicht null, wird die Funktion win32kfull!xxxClientAllocWindowClassExtraBytes aufgerufen, die in die Benutzerebene zurückruft (user32.dll!__xxxClientAllocWindowClassExtraBytes), um Speicher zuzuweisen. Die Adresse nach der Zuweisung wird mit der NtCallbackReturn-Funktion korrigiert (Stack-Anpassung) und dann an die Kernel-Ebene zurückgegeben, gespeichert und die Ausführung fortgesetzt. Wenn das tagWND->flag die Eigenschaft 0x800 enthält, wird dieser gespeicherte Wert zu einem Offset.user32.dll!_xxxClientAllocWindowClassExtraBytes hooken, NtUserConsoleControl aufrufen, um das tagWND->flag so zu ändern, dass es die Eigenschaft 0x800 enthält, und dann mit NtCallbackReturn einen benutzerdefinierten Wert an den Kernel tagWND->offset zurückgeben.win32kfull!NtUserCreateWindowEx auf.win32kfull.sys NtUserCreateWindowEx zum Erstellen eines Fensters aufruft, wird tagWND->cbWndExtra überprüft. Ist dieser Wert nicht null, wird die Funktion win32kfull!xxxClientAllocWindowClassExtraBytes aufgerufen, die in die Benutzerebene (user32.dll!__xxxClientAllocWindowClassExtraBytes) zurückruft, um Speicher zu erstellen. Die Adresse nach der Zuweisung wird mit NtCallbackReturn korrigiert, dann an die Kernel-Ebene zurückgegeben, gespeichert und fortgesetzt. Wenn das tagWND->flag die Eigenschaft 0x800 enthält, wird für diesen Wert eine Offset-Adressierung verwendet.NtUserConsoleControl, um das Flag so zu ändern, dass es die Eigenschaft 0x800 enthält.17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
Es wird erwähnt, dass der Aufruf von NtUserConsoleControl die Werte tagWND->offset und tagWND->flag zurücksetzt, wobei das Flag die Eigenschaft 0x800 enthält. Wenn das Flag die Eigenschaft 0x800 enthält, wird eine Offset-Adressierung verwendet. Der Zweck des aktuellen Aufrufs von NtUserConsoleControl besteht darin, das tagWND->flag so zu ändern, dass es die Eigenschaft 0x800 enthält. Anschließend wird NtCallbackReturn aufgerufen, um einen bestimmten Wert zurückzugeben, mit dem Ziel, tagWND->offset erneut zu ändern, da win32kfull!xxxClientAllocWindowClassExtraBytes den Rückgabewert in tagWND->offset ablegt.
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`