
Análisis técnico y exploit de prueba de concepto para CVE-2021-1732, una vulnerabilidad de escalada de privilegios en el kernel de Windows en win32kfull, que demuestra la explotación mediante la manipulación de tagWND.
win32kfull!NtUserCreateWindowEx, donde una llamada de retorno del kernel al modo usuario para asignar memoria y la configuración del atributo tagWND->flag están desincronizadas, lo que permite falsificar el valor de tagWND->offset y causar un desbordamiento de memoria.win32kfull.sys llama a NtUserCreateWindowEx para crear una ventana, verifica tagWND->cbWndExtra (cantidad de memoria adicional asignada por instancia de ventana). Si el valor no es nulo, llama a la función win32kfull!xxxClientAllocWindowClassExtraBytes que realiza una llamada de retorno al espacio de usuario user32.dll!__xxxClientAllocWindowClassExtraBytes para asignar espacio. La dirección asignada se corrige mediante la función NtCallbackReturn, ajustando la pila y regresando al kernel para guardarla y continuar la ejecución. Sin embargo, cuando el valor de tagWND->flag incluye el atributo 0x800, el valor guardado se convierte en un offset.user32.dll!_xxxClientAllocWindowClassExtraBytes, llamar a NtUserConsoleControl para modificar tagWND->flag incluyendo el atributo 0x800, y luego usar NtCallbackReturn para devolver un valor personalizado al kernel en tagWND->offset.win32kfull!NtUserCreateWindowEx.win32kfull.sys llama a NtUserCreateWindowEx para crear una ventana, verifica tagWND->cbWndExtra (cantidad de memoria adicional asignada por instancia de ventana). Si el valor no es nulo, llama a la función win32kfull!xxxClientAllocWindowClassExtraBytes que realiza una llamada de retorno al espacio de usuario user32.dll!__xxxClientAllocWindowClassExtraBytes para asignar memoria. La dirección asignada se corrige mediante la función NtCallbackReturn, ajustando la pila y regresando al kernel para guardarla y continuar la ejecución. Cuando el valor de tagWND->flag incluye el atributo 0x800, se utiliza acceso por offset para ese valor.NtUserConsoleControl para modificar la bandera (flag) incluyendo el atributo 0x800.17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
Se menciona que llamar a NtUserConsoleControl reestablecerá tagWND->offset y el valor de tagWND->flag incluyendo el atributo 0x800. Cuando la bandera contiene 0x800, se utiliza acceso por offset. El propósito de llamar a NtUserConsoleControl aquí es modificar el valor de tagWND->flag para que incluya 0x800, y luego llamar a NtCallbackReturn para devolver un valor específico con el objetivo de modificar tagWND->offset, porque win32kfull!xxxClientAllocWindowClassExtraBytes colocará el valor de retorno en tagWND->offset.
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`