CVE-2019-0797 windows 0 day漏洞分析
导语:Kaspersky研究人员又发现一个Windows操作的竞争条件0 day漏洞CVE-2019-0797。
概述
2019年2月,Kaspersky的Automatic Exploit Prevention (AEP)系统检测到尝试利用Windows操作系统漏洞的事件。研究人员进一步分析发现了位于win32k.sys的0 day漏洞。研究人员于2月22日将该漏洞报告给微软,微软确认了该漏洞,漏洞CVE编号CVE-2019-0797。目前微软已经发布了一个补丁。
这是AEP系统连续发现的Windows系统中的第4个本地权限提升漏洞。研究人员相信该漏洞已经被FruityArmor、SandCat等攻击者使用了。SandCat是新出现的APT组织,除了CVE-2019-0797和CHAINSHOT外,SandCat还使用FinFisher/FinSpy框架。
CVE-2019-0797漏洞分析
CVE-2019-0797是位于win32k驱动中的竞争条件引起的,具体是由于NtDCompositionDiscardFrame和NtDCompositionDestroyConnection中间未记录的系统调用缺乏适当的同步。有漏洞的代码如下所示:
NtDCompositionDiscardFrame syscall代码(Windows 8.1)
从上图的NtDCompositionDiscardFrame syscall简化逻辑中可以看出,代码需要一个在DirectComposition::CConnection结构中与帧操作相关的锁,并尝试找出与给定id对应的帧,最后在该帧上调用释放。具体问题如下图所示:
NtDCompositionDestroyConnection syscall内部函数(Windows 8.1)
从函数DiscardAllCompositionFrames的简化逻辑的截图可以看出它是在NtDCompositionDestroyConnection syscall调用的,不需要锁和调用释放所有分配的帧的函数DiscardAllCompositionFrames。问题在于当系统调用NtDCompositionDiscardFrame和NtDCompositionDestroyConnection同时执行时,函数DiscardAllCompositionFrames可能在当NtDCompositionDiscardFrame syscall正在寻找帧或已经找到帧的情况下执行。这就导致了一个UAF(use-after-free)场景。
研究人员还发现了其他2个类似的竞争条件0 day漏洞利用,分别是CVE-2018-8589和CVE-2018-8611。
如果模块文件名含有字符串chrome.exe就停止执行
研究人员该漏洞利用实际攻击的是64位的操作系统,具体从Windows 8到Windows 10 build 15063都有。这些操作系统的利用过程并没有很大差别,都使用heap spraying palettes和accelerator tables来泄露kernel地址。在Windows 10 build 14393及更高版本的操作系统利用中使用的是palettes。除此之外,漏洞利用会检查是否在Google chrome中运行,如果是就停止执行,因为CVE-2019-0797无法在沙箱中被利用。
发表评论