速更新!这个 Windows 0day 漏洞已遭 APT 组织利用
编译:代码卫士团队
在昨天的文章《微软修复64个缺陷,包括2个 0day》中,我们提到微软修复了两个 0day漏洞,其中一个是卡巴斯基实验室报告的 CVE-2019-0797。本文将做出简要的技术分析。
2019年2月,卡巴斯基实验室检测到有人尝试利用微软 Windows 操作系统中一个漏洞,进一步分析后发现了 win32k.sys 中的一个 0day 漏洞。2月22日,卡巴斯基实验室将问题告知微软,后者证实了该漏洞的存在并分配编号 CVE-2019-0797,并对卡巴斯基实验室的研究员 Vasiliy Berdnikov 和 Boris Larin 表示感谢。
这是卡巴斯基在 Windows 中发现的第四个本地权限提升漏洞。研究人员认为 CVE-2019-0797 已遭多个威胁者利用,包括但很可能不仅限于 FruityArmor 和 SandCat。FruityArmor 此前使用过 0day,而 SandCat 是最近检测到的一个新兴 APT 组织。除了利用 CVE-2019-0797 和 CHAINSHOT 外,SandCat 还使用了 FinFisher/FinSpy 框架。
简要技术分析
CVE-2019-0797 是存在于 win32k驱动中的一个竞争条件,是因为未记录的系统调用 NtDCompositionDiscardFrame 和 NtDCompositionDestroyConnection之间缺乏适当同步造成的。如下是在首次分析时从最新系统上发现的易受攻击的代码截图:
从这个简化的 NtDCompositionDiscardFrame 系统调用的逻辑的截屏中可以发现,这个易受攻击的代码获得了和 DirectComposition::CConnection 结构中帧操作相关的一个锁,而且试图找到和既定 id相对应的帧并最终调用释放 (free) 。这种操作存在的问题可见如下截屏:
在这个带有从 NtDCompistionDestroyConnection 系统调用的函数 DiscardAllCompsitionFrames 的简化逻辑的截屏上可以看到,它并未获得必要的锁而且调用了将发布所有已分配帧的 DiscardAllCompositionFrames。问题在于,当系统调用 NtDCompositionDiscardFrame 和 NtDCompositionDestroyConnection 同时执行时,函数 DiscardAllCompositionFrames 可能是在 NtDCompositionDiscardFrame 系统调用已经在开始寻找可以发布的帧或已经找到的情况下执行。这种条件就导致使用后释放场景。
有意思的是,这是 SandCat 调用的第三个竞争条件0day 漏洞,前两个是 CVE-2018-8589 和 CVE-2018-8611。
研究人员发现的已遭在野利用的漏洞针对的是 Windows 8 到 Windows 10 build 15063 版本的64位操作系统。在这些操作系统上的利用进程区别并不大,而且是通过堆喷射调色板和加速器表使用 GdiSharedHandleTable 和 gSharedInfo执行的以泄漏其内核地址。在利用 Windows 10 build 14393的情况下使用的是更高的窗口而非调色板。另外,该利用还会查看是否在谷歌 Chrome 上运行。如是则会停止执行,因为漏洞 CVE-2019-0797 无法在沙箱中遭利用。
推荐阅读
原文链接
https://securelist.com/cve-2019-0797-zero-day-vulnerability/89885/
本文由代码卫士编译,不代表其观点,转载请注明“转自代码卫士 www.codesafe.cn”。