ESET研究人员发现一个Windows系统中的本地权限提升漏洞利用。
2019年6月,ESET研究人员在针对东欧的攻击活动中发现了一个Windows 0day漏洞利用。
该漏洞利用了Windows的一个本地权限提升漏洞——win32k.sys组件中的空指针间接引用。研究人员发现该漏洞利用后,即报告给微软安全应急响应中心,微软及时修复了该漏洞并发布了补丁。
该漏洞影响以下Windows版本:
Windows 7 for 32-bit Systems Service Pack 1
Windows 7 for x64-based Systems Service Pack 1
Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2008 for Itanium-Based Systems Service Pack 2
Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1
本文介绍漏洞详情和利用方法。
近年来,研究人员在Windows win32k.sys中发现了多个漏洞,本漏洞利用使用popup meau对象。比如,Sednit组织的本地权限提升漏洞(2017年)就利用了meau对象和技术,与本漏洞利用非常相似。
该漏洞利用会创建2个窗口,一个用于漏洞利用的第一阶段,一个用于第二阶段。对第一个窗口,漏洞利用会创建popup menu对象,并使用CreatePopupMenu和AppendMenu函数将其加到menu项目中。除此之外,漏洞利用还会设置WH_CALLWNDPROC和 EVENT_SYSTEM_MENUPOPUPSTARThooks。
然后漏洞利用会使用函数TrackPopupMenu来展示菜单。此时hook到EVENT_SYSTEM_MENUPOPUPSTART的代码会执行。代码会尝试打开menu的第一个可用项目,通过发送MN_SELECTITEM,MN_SELECTFIRSTVALIDITEM, MN_OPENHIERARCHY消息到菜单。
下一步对触发漏洞非常重要。漏洞利用必须抓住初始化菜单创建,但子菜单将要创建的这一时间间隔。这样,漏洞利用就有处理WH_CALLWNDPROC hook中WM_NCCREATE消息的代码。当漏洞利用代码检测到系统处于该状态时,就会发送MN_CANCELMENUS (0x1E6)消息到第一个菜单来取消该菜单。但子菜单即将要创建了。
如果检查kernel模式的子菜单对象,就可以看到tag POPUPMENU->ppopupmenuRoot等于 0。该状态允许攻击者使用kernel结构中的元素作为空指针间接引用。漏洞利用会在地址0x0处分配新的页面,该地址会被kernel作为POPUPMENU对象,如图1所示。
图1. POPUPMENU kernel 结构
此时,攻击者会使用第二个窗口。主要的漏洞利用目标就是浏览第二个窗口的tagWND结构的bServerSideWindowProc位。这会导致kernel模式的WndProc过程的执行。
为了执行,攻击者通过调用use*.dll库的HMValidateHandle函数来泄漏第二个窗口的tagWND结构的kernel内存地址。然后漏洞利用会在NULL页面伪造一个tagPOPUPMENU对象,并发送MN_BUTTONDOWN 消息到子菜单。之后,kernel会执行win32k!xxxMNOpenHierarchy函数。
图2. win32k!xxxMNOpenHierarchy函数反汇编代码
该函数会传递NULL页上伪造的对象到win32k!HMAssignmentLock。并设置win32k!HMDestroyUnlockedObject函数的bServerSideWindowProc位,这位于 win32k!HMAssignmentLock中的一些调用。
图3. win32k!HMDestroyUnlockedObject函数反汇编代码
Everything is done! 然后漏洞利用发送特定的消息到第二个窗口来在kernel模式下执行WndProc。
最后一步,漏洞利用用system token替换当前进程的token。
发布的补丁中,在函数win32k!xxxMNOpenHierarchy中添加了空指针的检查。
图4. 两个win32k.sys版本的差异比较:有漏洞版本(左)补丁修复版(右)
该漏洞利用只作用于老版本的Windows,因为Windows 8的用户进程不允许映射空页面。使用Windows 7 32位Service Pack 1系统的用户建议更新到最新版操作系统,因为Windows 7 Service Pack 1的支持时间将在2020年1月结束,因此该漏洞可能会一直存在并且不会修复。
https://www.welivesecurity.com/2019/07/10/windows-zero-day-cve-2019-1132-exploit/