- 漏洞发生在Windows 图形驱动
win32kfull!NtUserCreateWindowEx
函数中的一处内核回调用户态分配内存与tagWND->flag属性设置不同步导致的漏洞。使得可以伪造这个tagWND->offset
值发生内存越界。 - 当驱动win32kfull.sys调用
NtUserCreateWindowEx
创建窗口时会判断tagWND->cbWndExtra
(窗口实例额外分配内存数),该值不为空时调用win32kfull!xxxClientAllocWindowClassExtraBytes
函数回调用户层user32.dll!__xxxClientAllocWindowClassExtraBytes
分配空间,分配后的地址使用NtCallbackReturn
函数修正堆栈后重新返回内核层并保存并继续运行,而当tagWND->flag
值包含0x800属性后该保存值变成了一个offset。 - 攻击者可以Hook
user32.dll!_xxxClientAllocWindowClassExtraBytes
函数调用NtUserConsoleControl修改tagWND->flag包含0x800属性值后使用NtCallbackReturn
返回一个自定义的值到内核tagWND->offset。
- 漏洞发生在Windows 图形驱动
win32kfull!NtUserCreateWindowEx
中。 - 当驱动
win32kfull.sys
调用NtUserCreateWindowEx
创建窗口时会判断tagWND->cbWndExtra
(窗口实例额外分配内存数),该值不为空时调用win32kfull!xxxClientAllocWindowClassExtraBytes
函数回调用户层user32.dll!__xxxClientAllocWindowClassExtraBytes
创建内存,分配后的地址使用NtCallbackReturn
函数修正堆栈后重新返回内核层并保存并继续运行,而当tagWND->flag
值包含0x800属性时候对该值采用offset 寻址。 - 使用
NtUserConsoleControl
修改flag包含0x800属性。
17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
提到调用NtUserConsoleControl
会重新设置tagWND->offset
跟tagWND->flag
值包含0x800
属性, flag值包含0x800
属性采用offset 寻址。我们在当前调用NtUserConsoleControl
的目的就是修改tagWND->flag
值包含0x800属性, 再调用NtCallbackReturn
函数返回指定值目的是重新修改tagWND->offset
, 因为win32kfull!xxxClientAllocWindowClassExtraBytes
会把返回值放入到tagWND->offset
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb
0e9d1448`