从像素到POC:MSRC漏洞挖掘实战解析

本文详细讲述了微软安全响应中心如何通过一条推特截图中的崩溃指令,在24小时内成功定位并复现Windows内核未初始化内存漏洞的技术过程,涉及WER错误报告分析、内核代码审计和漏洞利用链构建。

Tales from the MSRC: from pixels to POC

Security Research & Defense
/ By swiat / June 20, 2017 / 5 min read

许久未在此博客发布内容,我们认为现在是时候重新开始发布关于安全研究与防御(SRD)的深度技术内容了。对于新读者或可能忘记的读者,本博客是MSRC漏洞与缓解工程团队的官方博客。我们团队负责处理所有影响微软产品的漏洞和利用程序,执行详细的根本原因分析、变种调查,并与微软内部多个合作伙伴协作构建缓解措施,使Windows、Microsoft Edge、Microsoft Office和Microsoft Azure更难被攻击。

作为开篇,我们想从一个与CVE-2016-0040相关的有趣技术故事开始,这个故事体现了我们团队的精神。该漏洞在2016年2月通过MS16-014得到修复。让我们深入探讨吧😊

从像素到概念验证(POC)

在MSRC,我们通常通过secure@microsoft.com接收漏洞报告。然而,有时我们只收到关于漏洞存在的模糊提示,需要我们自己推敲问题可能是什么。这就是其中一个故事。它讲述了我们如何通过一张崩溃指令的截图,在不到24小时内最终创建出触发漏洞的概念验证。

像素线索

2015年10月19日,@R00tkitSMM发推文称发现了一个可以从Windows沙盒进程触发的内核崩溃。

这迅速引起了我们的兴趣,但表面上除了提示不在win32k.sys中之外,关于漏洞根本原因的信息似乎不多。我们没有放弃,决定深入挖掘。放大崩溃指令,我们可以看到崩溃指令前后部分可见的指令:

由此我们推断指令序列可能如下:

这似乎是一个相当独特的指令序列,因此我们决定在各种内核二进制文件中搜索它的实例。幸运的是,我们可以轻松访问所有可能涉及此问题的已发布二进制文件,这为我们提供了一个很好的样本集进行搜索。

大海捞针

大约一小时后,我们在ntoskrnl.exe的WMI代码中找到了一个非常有趣的匹配项:

这个匹配为我们开始搜索漏洞是否存在提供了一个起点。为了增加信心,我们开始寻找更多证据。我们用来搜索漏洞和利用程序的一个宝贵资源是Windows错误报告(WER)。正如John Lambert在关于MS08-067的博客文章中所描述的那样,WER是微软用于大规模发现和修复错误的崩溃报告机制。在这种情况下,我们在函数WmipRecieveNotifications中发现少量崩溃报告,与推文中描述的确切崩溃指令匹配。这为我们提供了关于问题可能是什么的更多信息,并增加了我们对该代码中存在漏洞的信心。

有烟必有火…

与MS08-067的故事一样,我们现在有一个怀疑存在漏洞的函数。下一步是开始阅读代码,看看是否能发现它。在阅读WmipReceiveNotifications中的代码后,我们能够 pinpoint我们认为的问题:未初始化内存使用漏洞导致内存写入。

在这种情况下,该函数有一个代码路径,如果提供的句柄数量足够小,它会条件性地使用固定大小的局部数组(黄色高亮)来存储对象事件信息:

不幸的是,蓝色高亮代码显示对象数组的内容仅在CHK构建中初始化(通过DBG=1)。这意味着如果访问,其内容将是未初始化的。

在函数的后面,代码检查通知操作是否与创建线程事件相关联。如果是,它假设ObjectArray至少有一个元素并继续访问它,如下红色高亮所示。如果提供的HandleCount设置为零,这将是一个问题,因为ObjectArray的内容将是未初始化的。更糟糕的是,代码继续使用从未初始化对象数组派生的指针写入内存。这导致写入未初始化的内存地址,这对于潜在的利用编写者来说是一个强大的原语。

通过此分析,我们确信已经发现了漏洞。剩下的唯一事情就是确认它。

事实核查

第二天早上,我们构建了一个概念验证,并使用它通过触发与推文中最初提到的完全相同指令的崩溃来确认漏洞存在。在不到24小时内,我们从像素走到了概念验证。

2015年10月25日,@R00tkitSMM通过secure@microsoft.com报告了他们发现的漏洞,但此时我们已经提前大约一周开设了MSRC案例,并已开始着手修复。尽管如此,是@R00tkitSMM提示我们此处存在问题的存在,我们通过CVE-2016-0040的致谢确保了他们的贡献得到认可:

也就是说,此分析突显了发布即使看似最少的漏洞信息的风险,因此我们鼓励研究人员避免这样做😊

总结

在本文中,我们展示了关于漏洞存在的模糊提示如何有时提供足够的信息来揭示潜在问题。虽然有许多情况下这是不可能的,但这是另一个很好的例子,说明我们能够使用各种可用工具回溯并识别漏洞。

向Axel Souchet(@0vercl0k)、Elia Florio和Mark Wodrich(@markwo)致敬,感谢他们为此漏洞侦查做出的贡献!

Matt Miller
MSRC漏洞与缓解团队

MS16-014

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计