CVE-2019-1132:Windows 0 day漏洞在野发现
2019-07-12 11:02:50 Author: www.4hou.com(查看原文) 阅读量:100 收藏

导语: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)。

01_tagPOPUPMENU_NULL_red-1.png

图1. tagPOPUPMENU的内核结构

再之后使用第二个窗口。此阶段的主要目标是翻转第二个窗口的tagWND结构中的bServerSideWindowProc位,使其在内核模式下执行WndProc过程。

为了执行上述操作,攻击者调用了user32.dll库中的非导出函数HMValidateHandle来获取第二个窗口中tagWND结构的内核内存地址,然后在NULL页面处制作一个假的tagPOPUPMENU对象,并将MN_BUTTONDOWN消息发送到子菜单。

之后内核最终将执行win32k!xxxMNOpenHierarchy函数。

02_HMAssignmentLock-1.png

图2. win32k!xxxMNOpenHierarchy函数的反汇编代码

此函数再将NULL页面上设计的对象传递给win32k!HMAssignmentLock。 bServerSideWindowProc位是在win32k!HMDestroyUnlockedObject函数内部设置的,win32k!HMDestroyUnlockedObject函数则位于win32k!HMAssignmentLock内部的几个更深层的调用中。

03_HMDestroyUnlockedObject-1.png

图3. win32k!HMDestroyUnlockedObject函数的反汇编代码

到此步算是万事俱备了。之后攻击者可以将特定消息发送到第二个窗口,以便在内核模式下执行WndProc。

利用代码的最后一步是将系统令牌替换当前进程的令牌。

而微软最新发布的补丁中,增加了win32k!xxxMNOpenHierarchy函数中对NULL指针的检查步骤。

Figure-4.-NULL_pointer.png

图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


文章来源: https://www.4hou.com/vulnerable/19153.html
如有侵权请联系:admin#unsafe.sh