一、 漏洞信息
CVE-2019-0808是发生在win32k中的一个空指针解引用漏洞,根据网上的blog介绍该漏洞在win32k!xxxMNMouseMove中产生。
二、 测试环境及漏洞复现
测试环境
POC:[https://github.com/ze0r/cve-2019-0808-poc](https://www.sec-
in.com/outLinkPage/?target=https://github.com/ze0r/cve-2019-0808-poc)
靶机: win10 x86 SP1
漏洞复现
三、 漏洞成因分析
补丁分析
通过bindiff对xxxMNMouseMove函数进行对比,发现win32k!xxxMNFindWindowFromPoint函数新增对菜单窗口对象的校验。
对win32k!xxxMNFindWindowFromPoint进行详细分析时,可以看到xxxSendMessage成功获取到菜单窗口对象句柄后,通过HMValidateHandleNoSecure获取对应的菜单窗口对象,随后直接返回。
而在补丁文件中,HMValidateHandleNoSecure成功获取菜单窗口对象后会进行一系列的安全检查后(保证tagWndMenu、tagWnd、tagPopuMenu、tagMenu这四个对象均存在且不为NULL)才会返回。此时也猜测到这个漏洞产生的原因大概率是空指针解引用。
成因分析
在补丁分析中,我们猜测这是一个空指针解引用的洞,这里结合POC去印证。下图为执行POC后windbg抓到的cash现场,从堆栈中可以看到蓝屏触发点在win32!MNGetItem函数。
此时进行精准定位后,就是对ecx+0x20的poi操作发生错误。
进一步调试后,我们发现ecx的值居然也为空!!!
结合IDA对ecx的值进行溯源, 发现其存储的值是ptagMenu。
而ptagMenu的值是由菜单弹出对象tagPopuMenu+0x14提供的。
最终,我们溯源完成后知道ptagPopuMenu的值正是由通过xxxMNFindWindowFromPoint函数中HMValidateHandleNoSecure返回的菜单窗口对象tagMenuWnd+0xb0得到的。
至此,空指针解引用产生的原因已然明了。
四、 漏洞利用分析
漏洞利用分析部分是结合EXP,对其漏洞构造、提权利用进行详细阐述,方式为Q-A模式。
问题一,如何构造空的菜单对象(ptagPopupMenu->spmenu=NULL)
在漏洞成因过程中知道,tagMenu是由tagPopuMenu+0x14提供的,而tagPopuMenu是由tagMenuWnd+0xb0提供的。tagMenuWnd是在xxxMNFindWindowFromPoint在xxxSendMessage获取的弹出菜单句柄后通过HMValidateHandleNoSecure得到的。