导语:2019年6月,ESET的研究人员发现了一起针对东欧国家的网络攻击事件,攻击者利用了Microsoft Windows中的本地权限提升漏洞CVE-2019-1132。
2019年6月,ESET的研究人员发现了一起针对东欧国家的网络攻击事件,攻击者利用了Microsoft Windows中的本地权限提升漏洞CVE-2019-1132。利用过程的核心是win32k.sys模块中的NULL指针解引用(pointer dereference)。在发现并分析后,ESET向微软安全响应中心提交了报告。该漏洞现已被微软修复并发布了相应补丁。
该漏洞影响以下Windows版本如下:
· Windows 7 32位系统Service Pack 1
· Windows 7(基于x64的系统)Service Pack 1
· Windows Server 2008 32位系统Service Pack 2
· Windows Server 2008(基于Itanium的系统)Service Pack 2
· Windows Server 2008(基于x64的系统)Service Pack 2
· Windows Server 2008 R2(基于Itanium的系统)Service Pack 1
· Windows Server 2008 R2(基于x64的系统)Service Pack 1
利用过程
与近年来披露的许多其他win32k.sys漏洞一样,攻击者利用的也是弹出式菜单对象。利用过程首先创建两个窗口,分别用于第一阶段和第二阶段,在第一个窗口中创建弹出式菜单对象,并通过CreatePopupMenu和AppendMenu函数追加菜单项,此外还需设置WH_CALLWNDPROC和EVENT_SYSTEM_MENUPOPUPSTART钩子。
接着通过TrackPopupMenu函数来显示菜单。此时,连接到EVENT_SYSTEM_MENUPOPUPSTART的代码将被执行——通过向菜单发送MN_SELECTITEM,MN_SELECTFIRSTVALIDITEM和MN_OPENHIERARCHY消息序列来打开菜单中的第一个可用项。
下一步对于触发此漏洞非常关键。当初始菜单已经创建、子菜单正准备创建时,攻击者必须及时捕获这一时刻,为此需要在WH_CALLWNDPROC钩子中处理WM_NCCREATE消息。当利用代码检测到系统处于这种状态时,它会向第一个菜单发送MN_CANCELMENUS (0x1E6)消息来取消该菜单,但是子菜单仍会被创建。
如果我们在内核模式下检查这个子菜单对象,将看到tagPOPUPMENU – >ppopupmenuRoot = 0,这种状态能让攻击者将该内核结构中的元素用作空指针解引用。接着利用代码会在地址0x0处分配一个新页面,内核将把此地址当作tagPOPUPMENU对象(参见图1)。
图1. tagPOPUPMENU的内核结构
再之后使用第二个窗口。此阶段的主要目标是翻转第二个窗口的tagWND结构中的bServerSideWindowProc位,使其在内核模式下执行WndProc过程。
为了执行上述操作,攻击者调用了user32.dll库中的非导出函数HMValidateHandle来获取第二个窗口中tagWND结构的内核内存地址,然后在NULL页面处制作一个假的tagPOPUPMENU对象,并将MN_BUTTONDOWN消息发送到子菜单。
之后内核最终将执行win32k!xxxMNOpenHierarchy函数。
图2. win32k!xxxMNOpenHierarchy函数的反汇编代码
此函数再将NULL页面上设计的对象传递给win32k!HMAssignmentLock。 bServerSideWindowProc位是在win32k!HMDestroyUnlockedObject函数内部设置的,win32k!HMDestroyUnlockedObject函数则位于win32k!HMAssignmentLock内部的几个更深层的调用中。
图3. win32k!HMDestroyUnlockedObject函数的反汇编代码
到此步算是万事俱备了。之后攻击者可以将特定消息发送到第二个窗口,以便在内核模式下执行WndProc。
利用代码的最后一步是将系统令牌替换当前进程的令牌。
而微软最新发布的补丁中,增加了win32k!xxxMNOpenHierarchy函数中对NULL指针的检查步骤。
图4.两个win32k.sys版本之间的代码差异,原始(左)和修补后(右)
结论
该漏洞仅适用于较老版本的Windows,因为微软从Windows 8开始不允许用户进程映射到NULL页面,还将此缓解措施反向移植到64位的Windows 7。
仍然使用32位Windows 7 Service Pack 1的人应考虑更新到最新版本,因为它的扩展支持将于2020年1月14日结束。这意味着Windows 7用户将无法获得关键的安全更新,类似这样的漏洞以后就很难修补了。
IoC
SHA-1 hash :CBC93A9DD769DEE98FFE1F43A4F5CADAF568E321
ESET检测名:Win32/Exploit.CVE-2019-1132.A