导语:我们发现,在ZDI漏洞项目中提交的漏洞中,最常见的就是影响PDF文档的漏洞,而在这些漏洞中,大多数都涉及到Adobe Reader。因此,我们挑选了这些Adobe Reader中最有代表性的漏洞,进行详细地分析。
概述
我们发现,在ZDI漏洞项目中提交的漏洞中,最常见的就是影响PDF文档的漏洞,而在这些漏洞中,大多数都涉及到Adobe Reader。因此,我们挑选了这些Adobe Reader中最有代表性的漏洞,进行详细地分析。在Adobe Reader 2018年7月发布的更新中,包含CVE-2018-12794/ZDI-18-682的补丁。这一漏洞由Sebastian Apelt发现,并且提交了一份质量非常高的漏洞详情。
漏洞成因
产生这一漏洞的根本原因是类型混淆条件(Type Confusion Condition)。通过构建XML数据包(XML Data Package,XDP)模版,并对XML表单体系结构(XML Forms Architecture,XFA)对象执行某些JavaScript操作,攻击者就可以强制Adobe Reader从模版对象的边界引用数据。成功之后,将会在沙盒渲染器进程中实现代码执行。
漏洞详情
触发此漏洞所需的XDP模版非常简单:
该漏洞由两条JavaScript指令触发。通过将一个子表单附加到另一个子表单,我们可以触发底层Template对象的越界(Out-Of-Bounds)读取错误。在这种情况下,当一个子表单由xfa.template引用,一个由xfa.form引用,随后调用calling <object>.presence = “inactive”;时,就会产生漏洞。
启用页堆(Page Heap)后,在读取Template对象过程中发生越界读取时,就会在CMP指令的位置发生崩溃。虽然该对象的大小似乎只有0x140字节,但我们在偏移量0x1d0处取消引用的数据超出了缓冲区的边界。
深入分析
根据崩溃情况,我们唯一能够知道的是对象类型为0x7c00。通过查看Solaris 9.4.1中acroform.api的符号化版本,我们可以看到这个特定的类型id属于XFATemplateModelImpl对象,它只是来自底层XDP的“Template”对象:
回到非符号化的Windows版本的acroform.api,我们可以确认Template对象的大小为0x140字节,这也是从上面引用的越界对象的大小。我们只需要几个步骤,就能够找到它的大小:
1、在Acroform.api中找到静态变量0x7c00并查找XFATemplateModelImpl::Type方法。
2、通过前后参照,我们得到XFATemplateModelImpl虚函数表(Vtable)。
3、对虚函数表进行前后参照(Xref),得到构造函数。
4、对构造函数进行前后参照,并向上滚动几行,将会展示出对象的大小,即0x140字节:
由于我们导致Template对象的越界读取,因此可以推测,代码正在期望一个更大的对象,而不是Template对象。同时,这一点也说明了在这里发生了类型混淆的问题。最有可能的情况就是,类型混淆的问题发生在xfa.template和xfa.form对象之间。尽管xfa.template的大小为0x140字节,但xfa.form对象的大小为0x270字节。
漏洞利用
我们无法在Template对象实例化之前去执行JavaScript代码,因此控制其崩溃并非一件容易的事。为了实现这一点,在XDP解析发生之前,需要在PDF解析过程中或其他受控制的数据处理期间,利用漏洞进行可以控制的分配和释放。控制崩溃发生的另一种方法,是构建一个PDF,其中包含能触发漏洞的附加PDF。Feng shui这个堆必须发生在外部PDF中,并触发内部(附加的)PDF中的漏洞。在这里,要使其以执行JavaScript代码的方式打开附加的PDF,还需要对权限进行提升。因此,该方法可能对大多数用户都无效。
实际上,也可以在没有页堆的情况下,执行poc.pdf来观察可以控制崩溃发生的情况。由于读取了Unicode字符的一部分,并将其用作指针,最终会导致其发生崩溃。以下是不使用页堆情况下的崩溃输出:
结论
如果大家想要自行测试这一漏洞,PoC位于:https://github.com/thezdi/PoC/tree/master/CVE-2018-12794 。该漏洞应该适用于2018.011.20040版本之前的Adobe Reader。
纵观我们今年发布的通告,我们发现其中有许多与PDF相关的漏洞。Adobe Reader可能是漏洞数量最多的PDF浏览器,同时Foxit中也存在大量漏洞。由于Adobe Reader被很多操作系统作为默认PDF渲染器使用,因此也不难解释,为什么众多调查人员都在针对Adobe Reader寻找漏洞。
在之后,我们还将持续关注其安全性,请大家继续跟随我们了解最新的漏洞利用技术和安全补丁情况。