Foxit Reader多个UAF漏洞解析 – 作者:云影实验室

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

0x00 简介

9月28号著名PDF阅读器厂商福昕针对 Foxit Reader 和 Foxit PhantomPDF 发布了例行安全更新,在其安全公告上涉及了其中一个包含较多 CVE 编号的修补,其中包括了由 360 云影实验室发现并提交的 7 个 UAF 漏洞。

Foxit 对此修补的描述为:“解决了一个可能让程序发生Use-After-Free远程代码执行或Out-of-Bounds Read信息泄漏的问题,从而形成漏洞和崩溃。这个问题在执行特定的JavaScript代码时出现,当调用closeDoc函数后使用文档或其辅助对象时被触发。”

本文就简单说一下该系列漏洞。

Foxit Reader多个UAF漏洞解析

0x01 第一次报告

关于这个攻击面的发现在Foxit Reader之前的例行安全更新中修补的远程命令执行漏洞CVE-2018-3924和CVE-2018-3939。这两个漏洞由Cisco Talos的Aleksandar Nikolic提交,在7月19号被修补,有意思的是在8月16号Foxit又发布更新修补了CVE-2018-3924和CVE-2018-3939,明显第一次修补存在一些问题。

这两个漏洞的详情可以在Talos的博客上看到:

https://www.talosintelligence.com/vulnerability_reports/TALOS-2018-0588

https://www.talosintelligence.com/vulnerability_reports/TALOS-2018-0606

0x02 CVE-2018-3924

PDF格式是允许嵌入JavaScript脚本的,从而可以在文档中实现更丰富的功能,比如动态修改文档内容,自动发送电子邮件等。而这一切需要由PDF阅读器提供的JavaScript引擎以及一系列内置函数的支持。触发崩溃的PoC如下:

var v1 = new Array();

function main() {

v1.toString = f;

app.activeDocs[0].mailForm({},v1,{},{},{},true,{});

}

 

function f() {

app.activeDocs[0].closeDoc();

 

    return1;

}

该漏洞出在JavaScript内置类型Doc的mailForm()方法中,Doc类型是Adobe Acrobat API中定义的用于访问PDF文档的内置类,为了和Adobe Acrobat兼容,Foxit Reader也实现了Adobe Acrobat API中的绝大多数内容。全局变量app属于App类型,其方法activeDocs()用于返回当前活跃的文档的Doc实例,Doc的另外一个方法closeDoc()用于关闭文档并从内存中销毁相应的对象。Adobe Acrobat API文档中没有限制mailForm()参数的类型,但可以参考开源的PDFium的代码:

Foxit Reader多个UAF漏洞解析

第二个参数在存在的情况下会被强制转化为字符串类型,结合PoC可以推知转化的过程会调用v1.prototype.toString(),而这个函数被赋值为f(),运行时会销毁当前Doc对象,而销毁后某些代码又会继续引用Doc对象中的属性,从而形成UAF漏洞。实际运行时情况也的确如此,程序会崩溃在0x00B8D5C9的位置上(9.0.1.1049版本):

Foxit Reader多个UAF漏洞解析

edi中存储着当前Doc对象的指针,这里程序调用了Doc对象内部0x5C偏移处的另一个对象的一个虚函数,因为该虚表指针早已被销毁并填充进了其他数据,从而触发Access violation崩溃。从测试情况来看,可以很容易的控制并填充Doc对象的内存区域,从而控制eip,实现任意代码执行。

0x03 CVE-2018-3939

这次的崩溃PoC和CVE-2018-3924长得很像:

function main() {

var a = {};

a.toString = f;

app.activeDocs[0].createTemplate(false,a);

}

 

function f() {

app.activeDocs[0].closeDoc();

}

 

main();

明显可以看出问题很类似,只不过有漏洞的代码在另一个函数里面罢了。运行后崩溃的位置也很相似:

Foxit Reader多个UAF漏洞解析

又是通过调用Doc对象偏移0x5C的对象的虚函数来触发UAF。

0x04 修补

修补后的9.2.0.9297版本中这两个函数几乎都被重写了但从createTemplate()函数的新版本中可以看到在转换类型前对参数类型进行了检查,如果是Object类型则不做类型转换,从而避免执行toString()方法:

Foxit Reader多个UAF漏洞解析

也就是说按福昕的理解,问题出在参数类型过滤不严。

0x05 后续

CVE-2018-3924和CVE-2018-3939的情况明显不会是个例,于是就有了这次较多的同类问题的报告。这里有一个额外的小问题,现在网上可以找到的Adobe Acrobat API文档是2007年的,而后续版本的API又有了一些增补,关于这些变化至少本人没有找到公开的文档。所以这波报告涉及了一些2007年文档中没有的API函数。

实际去看这些后续增加的API时会发现有相当一部分函数Foxit Reader都只是做了一个空壳子,里面没有任何代码实现。可能这一部分功能福昕并不重视。后续发现有该问题的函数还有Doc类的mailDoc()方法、createIcon()方法、getPageBox()方法、gotoNamedDest()方法、importAnFDF()方法等等。

关于利用效果,在做了简单的堆喷射后在关闭DEP的环境中可以弹出计算器:

*本文作者: ManchurianClassmate@360云影实验室,转载请注明来自 FreeBuf.COM。

来源:freebuf.com 2018-10-13 09:00:02 by: 云影实验室

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论