工作笔记 PDFium -- PDF 原理和攻防案例分析

概述

什么是 PDF?

可移植文档格式(PDF)是一种文件格式,可用来独立于软件、硬件或操作系统可靠地呈现和交换文档。PDF 是由 Adobe 发明的,现已成为由国际标准化组织 (ISO) 维护的一个开放式标准。PDF 可以包含链接和按钮、表单域、音频、视频和业务逻辑。

PDF 的优势

  1. 容易创建
  2. 强大的兼容性
  3. 安全性
  4. 体积小

PDF 格式解析

PDF 文件格式

PDF 基本文件格式

  1. 文件头:指明了该文件遵从的 PDF 规范版本号
  2. 文件体:PDF 的主要部分,由一系列的对象组成
  3. 交叉引用表:为了能对间接对象进行随机存取而设立的一个间接对象的地址索引表
  4. 文件尾:声明交叉引用表的位置,保存 PDF 文件的加密安全信息等

PDF 文件逻辑结构

文件尾(Trail),说明根对象的对象号,并且说明交叉引用表的位置,通过对交叉引用表的查询可以找到目录对象 (Catalog)。这个目录对象是该 PDF 文档的根对象,包含 PDF 文档的大纲 (outline) 和页面组对象(pages)引用。大纲对象是指 PDF 文件的书签树;页面组对象(pages)包含该文件的页面数,各个页面对象 (page) 的对象号。

基本类型对象

  1. boolean( 布尔型 ):对应关键字“True”和“False”
  2. numberic( 数值型 ):支持整型和浮点型
  3. String( 字符串型 ):有文字串由“(”和“)”作为对象的开始和结束和十六进制字符串由“<”和“>”作为对象的开始和结束
  4. name(名字型):是由“/”作为首字符的字符串组成
  5. array(数组型):由“[”和“]”作为对象的起始符号
  6. dictionary( 字典型 ):对象以“«”和“»”作为对象的开始和结束。
  7. stream(数据流型): 数据流对象由一个字典对象和关键字“stream”,“endstream”之间的数据块组成。

PDF 基本语法

1 0 obj
<<
/Type /Catalog
/Pages 3 0 R
/Outlines 2 0 R
>>
endobj

第一行,3 为对象号,来唯一标识一个对象,“0”为产生号,记录创建后的修改次数,obj 对象包含在”«”和“»”中,以 endobj 结尾,Catalog 表明这是一个根对象,“/Pages 3 0 R”表示 pages 的目标对象号为 3 的对象,“3 0 R”表示对对象 3 的引用。

xref 交叉引用表

xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000322 00000 n
0000000415 00000 n
0000000445 00000 n

xref 说明一个交叉引用表的开始,“0 8”说明所描述的对象号从 0 开始,一共有 8 个对象。0000000000 65535 f,一般每个 PDF 文件都是以这一行开始交叉应用表的,说明对象 0 的起始地址为 0000000000,产生号(generation number)为 65535,也是最大产生号,不可以再进行更改,而且最后对象的表示是 f, 表明该对象为 free,n 表示对象在使用。

Trailer 文件尾

railer
<<
/Size 15
/Root 1 0 R
/Info 3 0 R
/ID [<713426ff2d8242afb682c0773c4e7dea><7bdc95e8c8e1427c83de76efbff959d3>]
>>startxref
22053
%%EOF
  • /Size 指定交叉引用表中的条目数
  • /Root 说明根对象的对象号
  • /Info 指定文档信息字典的参考对象
  • /ID 指定由两个字节的未加密字符串组成的数组,这些字符串构成文件标识符
  • /XrefStm 交叉引用表在文件中的偏移

PDF 转换原理

PDF 格式转换原理

先将 PDF 文档中的文档元素提取出来,然后再将这些文档元素一个一个的复制到新生成的 Word 文档中,并将原 PDF 文档中的排版信息也引用到 Word 文档中。这样,PDF 文档中的文字,图片,表格,注释等等文档元素就能转换成 Word 文档中相对应的元素。

恶意代码案例

PDF 恶意代码。

  • 2014 年 1 月 15 日,发生了针对以色列国防部的攻击事件。
  • 2014 年,黑客通过在钓鱼邮件附件中使用恶意 PDF 文件,成功入侵了索尼加利福尼亚公司内网并下载了上千份敏感文件和机密邮件。
  • 2016 年 6 月,美国民主党委员会网络攻击和信息泄露事件曝出,对美国大选造成了极其关键的影响。

CVE-2018-4990 背景

2018 年 5 月 15 日,ESET 发布文章“A tale of two zero-days”,该文章披露了今年 3 月 ESET 在恶意软件扫描引擎(VirusTotal)上捕获了一个用于攻击测试的 PDF 文档。该 PDF 文档样本包含两枚 0-day 漏洞(CVE-2018-4990,CVE-2018-8120)以实现针对 Adobe Acrobat/Reader PDF 阅读器的任意代码执行。其中 CVE-2018-4990 为 Adobe PDF 阅读器的代码执行漏洞,而 CVE-2018-8120 则是 Windows 操作系统 Win32k 的内核提权漏洞,在获取代码执行权限后通过内核提权漏洞绕过 Adobe PDF 阅读器的沙盒保护,实现任意代码执行。

Heap Spray(堆喷射)

堆喷射是在 shellcode 的前面加上大量的 slide code(跳板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得内存被大量的注入代码占据。然后通过结合其他漏洞控制程序流,使得程序执行到堆上,最终将导致 shellcode 的执行。

在漏洞利用开头阶段,JavaScript 代码开始操控 Button1 对象,该对象包含一个精心构造的 JPEG2000 图像,该图像会触发 Adobe Reader 中的双重释放(double-free)漏洞。

JavaScript 代码中用到了堆喷射(heap-spray)技术以破坏内部数据结构。在这些操作都完成后,攻击者就实现了他们的主要目标:从 JavaScript 代码中实现内存的读取及写入。

攻击者成功定位 EScript.api 插件的内存地址,而该插件正是 Adobe JavaScript 的引擎。利用该模块的汇编指令(ROP gadgets),恶意 JavaScript 成功构造了一条 ROP 链,可以执行本地 shellcode。

Refs


参考资料快照
参考资料快照

本文短链接:
If you have any questions or feedback, please reach out .