
Exploit de kernel do Windows para CVE-2021-1732, um uso após liberação em win32kfull.sys que permite escalonamento de privilégio local via criação de janela manipulada e manipulação de callback.
win32kfull!NtUserCreateWindowEx, devido a uma falta de sincronização entre a alocação de memória em modo usuário durante um callback do kernel e a configuração do atributo tagWND->flag. Isso permite falsificar o valor tagWND->offset, resultando em um estouro de memória.win32kfull.sys chama NtUserCreateWindowEx para criar uma janela, verifica tagWND->cbWndExtra (quantidade extra de memória alocada para a instância da janela). Se esse valor não for nulo, chama a função win32kfull!xxxClientAllocWindowClassExtraBytes que faz um callback para a camada de usuário user32.dll!__xxxClientAllocWindowClassExtraBytes para alocar espaço. O endereço alocado é corrigido na pilha usando a função NtCallbackReturn, retornando ao kernel para salvar e continuar a execução. No entanto, quando o valor tagWND->flag contém o atributo 0x800, esse valor salvo se torna um offset.user32.dll!_xxxClientAllocWindowClassExtraBytes, chamar NtUserConsoleControl para modificar tagWND->flag incluindo o atributo 0x800, e então usar NtCallbackReturn para retornar um valor personalizado para tagWND->offset no kernel.win32kfull!NtUserCreateWindowEx.win32kfull.sys chama NtUserCreateWindowEx para criar uma janela, verifica tagWND->cbWndExtra (quantidade extra de memória alocada para a instância da janela). Se esse valor não for nulo, chama a função win32kfull!xxxClientAllocWindowClassExtraBytes que faz um callback para a camada de usuário user32.dll!__xxxClientAllocWindowClassExtraBytes para alocar memória. O endereço alocado é corrigido na pilha usando NtCallbackReturn, retornando ao kernel para salvar e continuar. No entanto, quando o valor tagWND->flag contém o atributo 0x800, esse valor é tratado como um offset.NtUserConsoleControl para modificar o flag incluindo o atributo 0x800.17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
Menciona-se que chamar NtUserConsoleControl redefine os valores de tagWND->offset e tagWND->flag incluindo o atributo 0x800. Quando o atributo 0x800 está presente no flag, o acesso é feito via offset. Nosso objetivo ao chamar NtUserConsoleControl é modificar o valor tagWND->flag para incluir o atributo 0x800, e então chamar NtCallbackReturn para retornar um valor específico, a fim de modificar tagWND->offset, pois win32kfull!xxxClientAllocWindowClassExtraBytes coloca o valor de retorno em tagWND->offset.
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`