此外,PDF支持嵌入外部文件,如字体(TrueType,Type0,Type1,Type3等),图像(Jpeg2000,Jpeg,Png,Bmp,Tiff,Gif,Jbig2等),XML(XSLT等)。 这些文件的标准文件将不会被讨论在本文中2.2安全咨询
注意安全咨询是观察状况的好方法安全趋势。 最重要的是,我们可以知道其中存在的缺陷零件。 以下咨询是值得一读的。
零日倡议咨询[9] Zero Day Initiative’s Advisory
铬问题跟踪[10]Chromium Issue Tracker
[Adobe安全公告和建议[11]Adobe Security Bulletins and Advisories
2.3 Installation Files
文件名属性内部字符串,包括ASCII和Unicode字符串功能名称,包括内部符号和导出功能Copyrights information
例如,通过分析文件的属性,我们可以得出结论Adobe Reader的安装目录中的JP2KLib.dll负责解析JPEG2000图像。 下图显示了文件的属性页。
下表显示了Adobe Acrobat中部分文件的作用读者的安装目录。
2.4开源项目
找到攻击面的另一种方法是调查类似的开源项目。 PDFium是一个着名的开源PDF渲染引擎基于Foxit Reader的技术,并由Chromium的开发人员维护。事实上,我们可以在PDFium和Foxit Reader之间找到很多类似的代码比较PDFium的源代码和Foxit的反汇编代码读者。我们可以通过分析PDFium的源代码来尝试找到攻击面。 但对于PDFium,另一种方法是分析libFuzzer组件。目前,PDFium在“测试/ libfuzzer”目录中有19个官方的模糊器[12]。
下表显示了这些模糊器的详细信息
3. 测试样例测试用例
或种子文件在模糊过程中起着重要的作用。 对于基于传统突变的模糊器,更多的测试用例意味着更多可能的代码最终意味着更多可能发生的事故。 收集更多的测试在大多数情况下,写入爬虫的情况是可以接受的,但有一些替代方式。 在这里我总结了收集测试用例的两种可能的方法
3.1基于代码覆盖的模糊器测试用例
American fuzzy lop (a.k.a AFL)和libFuzzer是两个着名的代码覆盖基于模糊器。 对于AFL fuzzer,单个和小的测试用例足以驱动模糊过程。 对于libFuzzer,它通常会消耗最小的测试集案例作为输入数据,但即使没有任何初始测试用例,它仍然可以工作。这两个模糊器的共同特征是它们会产生大量的测试案例得到更高的代码覆盖率。 所以为什么不重用测试用例由AFL或libFuzzer生成? 为了达到这个目标,我们必须摸索开放源库或类似的,与AFL或libFuzzer。 下图显示此方法的过程。
###3.2开源项目测试套件收集测试用例的另一种方法是重用开源项目的测试套件。一般来说,流行的开放源码项目也保留了一个测试套件存储库包含大量有效和无效的文件。 一些测试用例可能会直接崩溃旧版本的二进制文件。 使用测试套件是个好主意作为模糊器的种子文件。 对于不经常使用的文件格式,它是均匀的很难从搜索引擎中抓取一些。 例如,很难收集
来自Google的一些JPEG2000图像,但是您可以从中获取数百个文件OpenJPEG [13]。 下表显示了一些可用的测试套件。
https://pdfium.googlesource.com/pdfium_tests/
https://github.com/mozilla/pdf.js/tree/master/test/pdfs
https://github.com/uclouvain/openjpeg-data
https://www.google.com/get/noto/
4 测试技巧
效率是模糊者的重要指标,特别是计算时资源有限 在这里我总结了两个提高效率的模糊技巧
4.1 Write PDF makers
一般来说,PDF文件由纯文本和二进制数据组成。 它的如果你已经有了具体的目标,那么直接对PDF进行模糊处理就不是一个好主意作为图像,字体等。我们可以编写PDF制作者,以便我们只会突变我们感兴趣的数据有些第三方PDF制作者可以转换文件,如图像和字体,到PDF文件。 但是它不是推荐的解决方案,因为错误检查工具中的功能可能会导致许多格式错误的测试用例。在这种情况下,请阅读标准文件并撰写临时PDF制作人被推荐。 PDF制作者的技术细节将不会被讨论这篇文章不是一件艰巨的任务
4.2 Fuzz第三方库
大型软件使用开源库并不奇怪。 值得一试fuzz第三方库 揭示安全漏洞。 以下列表显示fuzz第三方库的优势。
使用AFL或libFuzzer的Fuzz开源库更有效率目标软件可能受到已知漏洞的影响零日漏洞影响使用库的所有目标软件下表显示了Adobe使用的一些开源项目
去年,我在libtiff发现了一个Out-of-Bounds写入漏洞PixarLogDecode功能并报告给Chromium。 帖子显示谷歌的Mathias Svensson也发现了这个漏洞[14]和思科Talos的Tyler Bohan [15]。 此漏洞的CVE标识符为CVE-2016-5875。 下表显示受此影响的PDF阅读器
对于Adobe Acrobat和Reader,渲染引擎没有受到影响在AcroForm.api中未配置PixarLog压缩支持。 对于Google Chrome,Canary,Dev和Beta版本的XFA已启用受影响(XFA已在Chrome Canary,Dev和Beta版本中启用并尽快停用)。 对于Foxit Reader,渲染引擎和ConvertToPDF插件受到影响。
4. 3 Write wrappers
PDF阅读器或Web浏览器是大型软件,创建了这些实例产品是耗时的,特别是一次又一次地创建实例在模糊过程中。 避免加载不必要的模块和初始化不必要的数据,写封包是一个不错的选择。对于开源项目,写一个包装很容易。 对于产品提供API,如Foxit Reader和Windows PDF Library,它也不是很难写一个包装。 但对于不符合上述要求的产品条件,我们可能需要做一些逆向工程工作来写一个包装。Windows.Data.PDF.dll负责在Edge浏览器中呈现PDF并自Windows 8.1起运行在操作系统中。 这个图书馆可以通过Windows运行时API进行交互。 帖子[16]显示如何使用C ++编写一个用于渲染PDF的包装器
5 Results
研究从2015年12月开始,主要关注Adobe Acrobat读者和大多数漏洞都在产品中被发现。 然而,这并不意味着产品比其他PDF更容易受到伤害读者。 去年,供应商修补了122个漏洞并分配了CVE。 应该指出,将排除一个漏洞如果满足以下条件之一。
不影响PDF阅读器稳定版本的漏洞供应商尚未修复的漏洞其他研究人员报告的脆弱性\下图显示了按供应商排序的漏洞分布
下图显示了按攻击面排列的漏洞分布
References
[1]. Document management - Portable document format - Part 1: PDF 1. 7,http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
[2]. Dumb fuzzing XSLT engines in a smart way,http://www.nosuchcon.org/talks/2013/D1_04_Nicolas_Gregoire_XSLT_Fuzzing.pdf
[3]. Abusing Adobe Reader’s JavaScript APIs,https://media.defcon.org/DEF%20CON%2023/DEF%20CON%2023%20presentations/DEFCON-23-H ariri-Spelman-Gorenc-Abusing-Adobe-Readers-JavaScript-APIs.pdf
[4]. Abusing the Reader’s embedded XFA engine for reliable Exploitation,https://www.syscan360.org/slides/2016_SG_Sebastian_Apelt_Pwning_Adobe_Reader-Abusing_the_readers_embedded_XFA_engine_for_reliable_ Exploitation.pdf
[5]. ISO 32000-1:2008,https://www.iso.org/standard/51502.html
[6]. JavaScript for Acrobat API Reference,http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/js_api_reference.pdf
[7]. XML Forms Architecture (XFA) Specification,http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.364.2157&rep=rep1&type=pdf
[8]. FormCalc User Reference,http://help.adobe.com/en_US/livecycle/es/FormCalc.pdf
[9]. Zero Day Initiative’s published advisories,http://www.zerodayinitiative.com/advisories/published/
[10]. Chromium issue tracker,https://bugs.chromium.org/p/chromium/issues/list?can=1&q=Type=%22Bug-Security%22
[11]. Adobe Security Bulletins and Advisories,https://helpx.adobe.com/security.html#acrobat
[12]. Official fuzzers for PDFium,https://pdfium.googlesource.com/pdfium/+/refs/heads/master/testing/libfuzzer/
[13]. OpenJPEG data,https://github.com/uclouvain/openjpeg-data
[14]. Seclists,http://seclists.org/oss-sec/2016/q2/623
[15]. LibTIFF Issues Lead To Code Execution,http://blog.talosintelligence.com/2016/10/LibTIFF-Code-Execution.html
[16]. Using WinRT API to render PDF,http://dev.activebasic.com/egtra/2015/12/24/853/