
Эксплойт для ядра Windows для CVE-2021-1732, использование после освобождения в win32kfull.sys, позволяющее повышение локальных привилегий через создание специально подготовленных окон и манипуляцию обратными вызовами.
tagWND->flag в функции win32kfull!NtUserCreateWindowEx драйвера Windows. Это позволяет подделать значение tagWND->offset, что приводит к выходу за пределы памяти.win32kfull.sys вызывает NtUserCreateWindowEx для создания окна, он проверяет tagWND->cbWndExtra (количество дополнительной выделяемой памяти для экземпляра окна). Если это значение не равно нулю, вызывается функция win32kfull!xxxClientAllocWindowClassExtraBytes, которая обращается к пользовательскому уровню через user32.dll!__xxxClientAllocWindowClassExtraBytes для выделения памяти. После выделения адрес возвращается обратно в ядро с помощью функции NtCallbackReturn, которая корректирует стек, сохраняет его и продолжает выполнение. Однако, когда значение tagWND->flag содержит атрибут 0x800, это сохраненное значение становится смещением (offset).user32.dll!_xxxClientAllocWindowClassExtraBytes, вызвать NtUserConsoleControl, чтобы изменить tagWND->flag, добавив атрибут 0x800, а затем с помощью NtCallbackReturn вернуть в ядро произвольное значение в tagWND->offset.win32kfull!NtUserCreateWindowEx драйвера Windows.win32kfull.sys вызывает NtUserCreateWindowEx для создания окна, он проверяет tagWND->cbWndExtra (количество дополнительной выделяемой памяти для экземпляра окна). Если это значение не равно нулю, вызывается функция win32kfull!xxxClientAllocWindowClassExtraBytes, которая обращается к пользовательскому уровню через user32.dll!__xxxClientAllocWindowClassExtraBytes для создания памяти. После выделения адрес возвращается обратно в ядро с помощью NtCallbackReturn, которая корректирует стек, сохраняет его и продолжает выполнение. Однако, когда значение tagWND->flag содержит атрибут 0x800, для этого значения используется адресация по смещению (offset addressing).NtUserConsoleControl для изменения flag, чтобы он содержал атрибут 0x800.17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
Упоминается, что вызов NtUserConsoleControl сбрасывает значения tagWND->offset и tagWND->flag, добавляя атрибут 0x800. Когда flag содержит атрибут 0x800, для доступа используется смещение. Наша цель при вызове NtUserConsoleControl — изменить tagWND->flag, чтобы он содержал атрибут 0x800, а затем с помощью NtCallbackReturn вернуть указанное значение, чтобы изменить tagWND->offset, потому что win32kfull!xxxClientAllocWindowClassExtraBytes помещает возвращаемое значение в tagWND->offset.
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`