
Exploit del kernel Windows per CVE-2021-1732, un use-after-free in win32kfull.sys che consente l'elevazione dei privilegi locali tramite la creazione di finestre manipolate e la manipolazione dei callback.
tagWND->flag nella funzione win32kfull!NtUserCreateWindowEx del driver grafico Windows. Ciò consente di falsificare il valore tagWND->offset provocando un overflow della memoria.win32kfull.sys chiama NtUserCreateWindowEx per creare una finestra, controlla tagWND->cbWndExtra (memoria extra allocata per l'istanza della finestra). Se il valore non è nullo, chiama la funzione win32kfull!xxxClientAllocWindowClassExtraBytes che esegue una callback al livello utente user32.dll!__xxxClientAllocWindowClassExtraBytes per allocare spazio. L'indirizzo allocato viene corretto usando NtCallbackReturn per rientrare nel kernel, salvato e l'esecuzione continua. Quando l'attributo tagWND->flag contiene il valore 0x800, il valore salvato diventa un offset.user32.dll!_xxxClientAllocWindowClassExtraBytes, chiamare NtUserConsoleControl per modificare tagWND->flag in modo da includere l'attributo 0x800, e quindi usare NtCallbackReturn per restituire un valore personalizzato all'offset tagWND->offset del kernel.win32kfull!NtUserCreateWindowEx del driver grafico Windows.win32kfull.sys chiama NtUserCreateWindowEx per creare una finestra, controlla tagWND->cbWndExtra (memoria extra allocata per l'istanza della finestra). Se il valore non è nullo, chiama la funzione win32kfull!xxxClientAllocWindowClassExtraBytes che richiama in user mode user32.dll!__xxxClientAllocWindowClassExtraBytes per creare memoria. L'indirizzo allocato viene corretto usando NtCallbackReturn e ritorna al kernel per essere salvato e continuare l'esecuzione. Quando l'attributo tagWND->flag contiene il valore 0x800, per quel valore viene utilizzato l'offset.NtUserConsoleControl per modificare flag in modo da includere l'attributo 0x800.17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
Viene menzionato che chiamando NtUserConsoleControl si reimpostano tagWND->offset e il flag tagWND->flag contenente l'attributo 0x800. Con il flag contenente 0x800 si utilizza l'offset. Lo scopo di chiamare NtUserConsoleControl è proprio modificare tagWND->flag in modo che contenga l'attributo 0x800, e poi chiamare NtCallbackReturn per restituire un valore specifico al fine di modificare tagWND->offset, poiché win32kfull!xxxClientAllocWindowClassExtraBytes inserisce il valore restituito in tagWND->offset.
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`