前言
pdf是portable document format的缩写,是目前广泛应用于各种场合的文件格式,其是由Adobe公司根据Postscript语言修改后提出的文件标准,并且被ISO组织接受,目前已经发展到2.0版本(ISO32000-2)。
目前广泛使用的是1.7版本,该版本pdf功能已经相当丰富,可以显示3D模型,播放多媒体音视频,执行Javascript脚本等功能。
PDF中的JavaScript利用
Pdf文件是应用广泛的一种文件格式,很多针对Adobe阅读器的CVE漏洞都是通过pdf文件中的某些结构触发,触发过程都需要执行事先嵌入在pdf文件中的Javascript脚本。例如CVE-2017-11254 Adobe Acrobat 和Reader中addAnnot Use After Free漏洞,就是通过调用Javascript代码调用addAnnot函数从而触发漏洞;以及CVE-2018-4901 针对pdf中Trailer结构里的ID字段的溢出漏洞,也是需要在文件中通过Javascript调用docID来进行触发。
通过研究发现,目前针对该攻击面的攻击主要分为以下三种方式:
-
通过Javascript调用pdf中的模块进行攻击;
-
通过Javascript调用阅读器中提供的Javascript相关功能,进行攻击;
-
其他未知形式的攻击。
PDF中的JavaScript规范
在PDF中插入JavaScript的相关介绍信息可以在Javascript_api_reference.pdf中看到文档下载
文档开头函数介绍时,使用四元数组进行函数介绍,如图:
我们来看看这四元数组各自所代表的含义:
-
第一列指的是该方法的启用版本以及是否还在使用
-
第二列指的是该方法引起的变化是否会影响文件
-
第三列指的是该方法执行需要特殊设置
-
第四列指的是该方法的可用性
PDF中的JavaScript影响范围
Pdf中的Javascript按照影响范围分为以下几种:文件夹级脚本、文档级脚本、页面级脚本、域级脚本以及批处理级脚本。所有类型的脚本都是事件驱动的,即当发生相应事件时,才会响应执行。
文件夹级脚本
可以影响Acrobat的变量声明和函数定义。一般用于增加菜单或者菜单项等针对Acrobat有影响的函数,包括两种:app和user。此类脚本一般是放到相应文件夹中,一般在Acrobat启动时载入,一般与event实体的应用初始化事件联系。
文档级脚本
可以影响给定文件的变量声明和函数定义,在文件之外不能应用。可以通过Acrobat创建该级别脚本嵌入pdf文件中。除该类型脚本外,还有文档级动作脚本,其触发动作包括:文件关闭前,文件保存前,文件保存后,文件打印前和文件打印后。
页面级脚本
该类型脚本在一页打开