首页
学习
活动
专区
工具
TVP
发布

深入剖析最新IE零日漏洞

在2018年4月下旬,我们使用沙箱发现了IE零日漏洞;自从在野外发现上一个样本(CVE-2016-0189)已经有两年多了。从许多方面来看,这个特别的漏洞及其后续的开发比较有趣。下一篇文章将分析最新的漏洞背后的核心原因,CVE-2018-8174。

寻找零日漏洞

我们从VirusTotal (VT)开始搜寻零日漏洞,有人在2018年4月18日上传了一个有趣的漏洞。这一漏洞被包括卡巴斯基在内的几家AV供应商发现,特别是我们的通用启发式逻辑,用于一些较老的Microsoft Word漏洞。

Virustotal对CVE-2018-8174的扫描结果

在我们的沙箱系统中处理了恶意软件样本后,我们注意到微软Word的一个完全补丁版本被成功开发。从这一点开始,我们开始对漏洞进行了更深层次的分析。让我们看一下完整的感染链:

感染链

感染链包括以下步骤:

· 受害者会收到恶意的微软Word文档。

· 在打开恶意文档后,将下载该漏洞的第二阶段;包含VBScript代码的HTML页面。

· VBScript代码触发Use After Free (UAF)漏洞后,并执行shellcode。

初步分析

我们将使用初始Rich Text Format (RTF) 文档开始分析,该文档用于传递IE的实际漏洞。它只包含一个对象,并且其内容是利用我们称为“nibble drop”的已知混淆技术来进行混淆的。

在RTF文档中混淆对象数据

在对对象数据进行了反混淆和十六进制解码后,我们可以看到这是个OLE对象,其包含一个URL Moniker CLSID。正因为如此,这一漏洞最初类似于利用微软HTA处理器的一个旧漏洞(CVE-2017-0199)。

URL Moniker被用来加载IE漏洞

使用CVE-2017-0199漏洞,Word尝试根据其属性,通过默认的文件处理程序,来执行文件;服务器响应中的Content-Type (内容类型)HTTP头是其中之一。由于“application/hta”内容类型的默认处理程序是mshta.exe,该程序也是OLE的服务器,可以让OLE不受限制地运行脚本。这一特点允许攻击者直接调用ShellExecute并启动选择的有效负载。

但是,如果追踪一下最新发现的漏洞中嵌入的URL,可以看到服务器响应中的内容类型不是“application/hta”,而是 “text/html”,这是CVE-2017-0199开发的需求。“text/html”的默认OLE服务器是mshtml.dll,它是一个包含引擎的库,在Internet Explorer后面。

WINWORD.exe为正确的OLE服务器查询注册表

此外,该页面包含VBScript,它利用安全模式标志加载,以将其默认值设为“0xE”。由于这一操作使得攻击者不能直接执行有效负载,就像HTA处理程序一样,需要利用Internet Explorer漏洞来克服这一点。

像上面一样,使用一个URL名字对象来加载远程web页面是可能实现的,因为针对Moniker相关漏洞(CVE-2017-0199, CVE-2017-8570和CVE-2017-8759)的微软补丁,引入了一个激活过滤器,它允许应用程序指定哪些COM对象在运行时被禁止实例化。

一些过滤后的COM对象,被限制IActivationFilter在MSO.dll中创建

在分析时,筛选的CLSID列表包含16个条目。TheMSHTML CLSID ({)不在列表中,这就是为什么MSHTML COM服务器在Word上下文中成功创建的原因。

这就是它变得有趣的地方。尽管Word文档是初始攻击向量,但漏洞实际上是在VBScript中,而不是在Microsoft Word中。这是我们第一次见到利用URL Moniker加载IE漏洞,我们相信在不久的将来这一技术将会被恶意软件作者大量使用。这种技术允许使用IE引擎加载并呈现一个web页面,即使受害者机器上的默认浏览器设置为别的浏览器。

下载的HTML页面中的VBScript包含了函数名和混淆的整数值。

混淆的IE漏洞

漏洞根本原因分析

对于根本原因分析,我们只需要看去混淆版本中的第一个函数(“TriggerVuln”),该函数是在“RandomizeValues”和“CookieCheck”之后被调用的。

去混淆后的漏洞触发程序

为了实现所需的堆布局,并确保释放的类对象内存将被“ClassToReuse”对象重用,该漏洞分配了一些类对象。为了触发这个漏洞,这个代码可以最小化到以下的概念验证(PoC):

CVE – 2018 – 8174的概念验证

当我们通过启用页面堆,在Internet Explorer中启动这个PoC时,我们可以观察到OLEAUT32!VariantClear函数的崩溃。

访问关于释放内存调用的违例

当第二个数组(ArrB)被破坏时,释放的内存指针被重用

通过这个PoC,我们就能够触发一个Use-after-free漏洞;ArrA(1)和ArrB(1)在内存中引用相同的“ClassVuln”对象。这种情况是可能的,因为当调用“Erase ArrA”时,vbscript!VbsErase函数确定要删除的对象类型是SafeArray,然后调用OLEAUT32!SafeArrayDestroy。

它检查是否指向tagSafeArray结构的指针不是NULL,以及它的引用计数,存储在时钟字段中的是零,然后继续调用ReleaseResources。

ArrA(1)的VARTYPE是VT_DISPATCH,因此调用VBScriptClass::Release来破坏对象

反过来,ReleaseResources将会检查fFeatures标志变量,由于我们有VARIANT的一个数组,随后它将调用VariantClear;它是一个函数,该函数迭代数组中的每个成员并执行必要的初始化,并在必要时调用相关的类析构函数。在本例中,VBScriptClass::Release被调用来正确地破坏对象,并且处理像Class_Terminate这样的破坏者,因为ArrA(1)的VARTYPE是VT_DISPATCH。

在TerminateClass函数之前,只检查一次CVE-2018-8174 -“refCount”的根本原因

这最终成为了漏洞的根源所在。在VBScriptClass::Release函数中,在函数开始时对引用计数只检查一次。尽管可以(实际上是在PoC中)在一个超载的TerminateClass函数中增加检查次数,但是在最终释放类对象之前不会进行检查。

Class_Terminate是一种过时的方法,现在被“Finalize”程序取代。在对象破坏期间,它被用来释放获得的资源,一旦对象被设置为空,该程序就会被执行,并且不再有对该对象的引用。在我们的例子中,Class_Terminate方法是超载的,当对VBScriptClass::TerminateClass执行调用时,就会为其分派超载的方法。在该超载方法的内部,为ArrA(1)成员创建了另一个引用。在这个点ArrB(1)引用ArrA(1),ArrA(1)拥有一个很快被释放的ClassVuln对象。

崩溃,由于在释放第二个对象时调用一个无效的虚拟方法

在Class_Terminate子完成之后,Arr(1)中的对象被释放,但是ArrB(1)仍然保留对被释放类对象的引用。当继续执行,并且ArrB被擦除时,整个循环会重复,除了这一次,ArrB(1)引用了一个已释放的ClassVuln对象,因此当调用ClassVuln vtable中的一个虚拟方法时,我们观察到了崩溃。

总结

在本文中,我们分析了CVE-2018-8174背后的核心原因,Use-After-Free是一个特别有趣的漏洞,这可能是由于在Class_Terminate VBScript方法中错误的对象周期处理造成的。其漏洞利用过程不同于我们在过去的漏洞(CVE-2016-0189和CVE-2014-6332)中所看到的,因为该漏洞不再使用Godmode技术。完整的开发链和漏洞本身一样有趣,但是超出了本文的范围。

CVE – 2018 – 8174是首个使用URL名字对象在Word中加载一个IE漏洞的公开漏洞,我们相信,除非被固定,不然未来攻击者将大量的使用这种技术进行攻击,因为它允许在无视受害者系统默认浏览器设置的情况下,强迫IE加载。

鉴于距离漏洞攻击开发者开始滥用这一技术进行路过式攻击(通过浏览器)以及网络钓鱼攻击(通过文档)活动,不会太久,我们预计该漏洞将成为近期利用最多的工具之一。为了保持安全,我们建议应用最新的安全更新,并使用带有行为检测功能的安全解决方案。

在我们看来,这一漏洞和Qihoo360核心安全团队在其最近的出版物中所称的“Double Kill”是同一漏洞。虽然这一漏洞并不局限于浏览器利用,但它被报告为IE零日漏洞,这一举动在安全社区中引起了一定的混乱。

在发现这一漏洞后,我们立即与微软分享了相关信息,并且微软确认这实际上是CVE-2018-8174。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180515B11WJR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券