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

利用逆向分析与模糊测试技术深入考察Windows图形库漏洞

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

对于Windows应用程序和组件的漏洞,攻击者通常都会垂涎三尺。其中,Recorded Future进行的一项研究表明,2018年漏洞利用率最高的10个漏洞中有8个是Microsoft Office的漏洞。是不是觉得难以置信?实际上这一点也不奇怪,举例来说,如果我们考察Microsoft Excel实例启动时所加载的模块,会发现竟然多达91个DLL——还是那句老话,系统越复杂,越容易出现安全漏洞。此外,notepad.exe或calc.exe出现要想正常运行,也需要大约30-40个DLL。

Process Explorer:考察Microsoft Excel的相关模块
实际上,任何一个模块中出现安全漏洞,都会危及Microsoft Excel自身。其中一种潜在的攻击向量,就是向用户提供恶意文档,并设法让用户打开这些文档。因此,对于攻击者来说,只需找到一个含有安全漏洞的模块,就能攻陷整个应用程序,进而搞定整个系统。这是攻击者的最大优势,他们拥有充足的时间,可以全面深入的研究目标,因此,通常总能找到相应的攻击方法。而对于系统安全来说,其安全性取决于系统中最薄弱的一个环节。
在本文中,我们通过一个具体的例子,为读者演示如何通过比对原始程序与打过补丁后的程序之间的差异和逆向工程来分析导致Microsoft相关的漏洞的根源,并展示让含有相关漏洞的应用程序发生崩溃所需的具体步骤——这对于安全研究人员来说是非常有帮助的,因为应用程序崩溃是成功利用漏洞的重要一步。
具体来说,这里使用的漏洞是CVE-2019-0618,这是一个Windows GDI+组件的远程执行代码漏洞。在某些情况下,将多个普通漏洞组合在一起也足以搞定整个系统。鉴于此,我们认为CVE-2019-0618很可能会成为一个被广泛利用的漏洞,因为它可用于在感兴趣的目标系统上执行恶意软件。有关攻击者使用的恶意软件免杀技术的详细概述,请参阅另一篇文章。
Windows GDI+
GDI+是一种基于C/C++类的API,使应用程序能够在视频显示器和打印机上使用图形和格式化文本。实际上,基于Microsoft Win32和Win64 API的应用程序是无法直接访问图形硬件的。相反,应用程序要想与设备驱动程序进行交互,必须借助于GDI+。另外,由于GDI+可用于所有基于Windows的应用程序,使得GDI+ API已经成为显示Windows表单并管理其内容的主要工具。
在撰写本文时,ZDI已经公布了9个针对GDI+的漏洞,其中包括本文所研究漏洞。从公布的ZDI报告来看,本文研究的是 一个基于堆的缓冲区溢出漏洞,它能够导致远程代码执行。同时,根据该报告来看,该漏洞的CVSSv2得分为9.2,同时还指出,该漏洞位于DoRotatedStretchBlt方法中,这对于我们的分析工作来说是一个非常有用的线索。除此之外,它没有公开披露与我们的调查相关的其他信息,也没有通过针对这个漏洞的概念证明(PoC)代码。
相关代码在打补丁前后的变化情况
首先,我们想了解漏洞是如何进行修复的。基于此,我们可以推断出漏洞的大致情况。为此,我们必须通过比较DLL打补丁后的版本与此前的版本的变化情况,从而缩小需要关注的代码的范围;具体的比对方法,请参考另一篇文章中的详细介绍。简而言之,我们需要将打补丁后的Windows 7 x86 GdiPlus DLL与未打补丁的Windows 7 x86 GdiPlus DLL进行比对。

Gdiplus.dll:未打补丁(左)vs已打补丁(右)
通过考察相关代码在打补丁前后的变化情况,我们可以推断出许多有用的信息。例如,观察打过补丁的方法的数量,可以推测该特定更新的重要性。通过观察和比较单个模块的连续补丁,可以帮我们了解其开发过程,例如特定组件中出现的问题/漏洞的类别等。同时,这种方法还可以帮助安全研究人员识别模糊测试的目标,以及哪些功能更可能存在漏洞。
利用IDA插件BinDiff,我们可以对比二进制代码在打补丁前后的变化情况,具体如下所示:

BinDiff的输出结果:比较GdiPlus.dll在打补丁前后的变化情况
通过比较发现,DoRotatedStretchBlt方法确实发生了一些变化,并且这里还具有较高的置信度。下面,让我们详细看看圈起来部分的变化情况。

BinDiff的输出结果:gdiplus!DoRotatedStretchBlt方法,已打补丁与未打补丁的情况
BinDiff插件的颜色的含义:
绿色节点表示在两个可执行文件中具有相同指令的基本块;
红色节点表示比较算法无法找到等价物的基本块;
黄色节点表示算法可以找到等价物的节点,但是在不同版本中,某些指令已经发生了变化。
在我们的例子中,我们可以看到打过补丁的DLL中有一些红色基本块,所以,我们可以使用IDA Hex-Rays反汇编程序来进一步查看实际的差异。

IDA的输出结果:GdiPlus!DoRotatedStretchBlt方法,已打补丁的版本(左)vs未打补丁的版本(右)
通过观察这个补丁,可以看出它处理的是一种典型的安全问题——使用memcpy时没有进行适当边界检查。该补丁似乎是用于处置Size参数的不同值的,以避免发生溢出。奇怪的是,并非所有的情况都得到了相应的处理。这是因为,与Windows补丁程序的情况一样,补丁程序不会出现在漏洞所在的确切位置。进一步的研究表明,该补丁程序的另一部分位于StretchBLT记录的处理程序中:

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

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