Pdf文件是应用广泛的一种文件格式,发展至今已经到了2.0版本,其功能也得到了不断丰富,很多鲜为人知的功能可能会被利用实施恶意行为。本文将简单介绍在pdf文件中嵌入Javasript脚本的利用方式。
一、PDF中的Javascript利用
pdf是portable document format的缩写,是目前广泛应用于各种场合的文件格式,其是由Adobe公司根据Postscript语言修改后提出的文件标准,并且被ISO组织接受,目前已经发展到2.0版本(ISO32000-2)。目前广泛使用的是1.7版本,该版本pdf功能已经相当丰富,可以显示3D模型,播放多媒体音视频,执行Javascript脚本等功能。
很多针对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来进行触发。
在pdf文件中的Javascript内容是一个很有用且用途比较广泛的攻击手段。
然而在pdf的Javascript函数引用规范中,对于pdf中可以引用的函数进行了很严格的限制,可以进行的操作比较有限。
通过研究发现,目前针对该攻击面的攻击主要分为以下三种方式:
- 通过Javascript调用pdf中的模块进行攻击;
- 通过Javascript调用阅读器中提供的Javascript相关功能,进行攻击;
- 其他未知形式的攻击。
二、pdf中的Javascript规范
在pdf中插入Javascript的相关介绍主要在Javascript_api_reference.pdf中进行介绍。文档在函数介绍时,会通过四元组对函数进行说明:
其中第一列说明该方法的启用版本以及是否还在使用、第二列说明该方法引起的变化是否会影响文件、第三列表明该方法执行需要特殊设置、第四列表明该方法的可用性。
Pdf中的Javascript按照影响范围分为以下几种:文件夹级脚本、文档级脚本、页面级脚本、域级脚本以及批处理级脚本。所有类型的脚本都是事件驱动的,即当发生相应事件时,才会响应执行。
1、文件夹级脚本
包含可以影响Acrobat的变量声明和函数定义,一般用于增加菜单或者菜单项等针对Acrobat有影响的函数,包括两种:app和user。
此类脚本一般是放到相应文件夹中,一般在Acrobat启动时载入,一般与event实体的应用初始化事件联系。
2、文档级脚本
包含可以影响给定文件的变量声明和函数定义,在文件之外不能应用。可以通过Acrobat创建该级别脚本嵌入pdf文件中。除该类型脚本外,还有文档级动作脚本,其触发动作包括:文件关闭前,文件保存前,文件保存后,文件打印前和文件打印后。
3、页面级脚本
该类型脚本在一页打开或关闭时执行。打开事件为当一个页面完成绘制或任何时候查看一个新页的时候。关闭事件为当用户查看的页面不再是当前页时。
4、域级脚本
域级脚本与Acrobat中的表格域绑定,当用户与相应区域直接或间接交互时,即触发相应的域事件,该级别脚步存放在pdf文件中。
三、潜在可利用内容
在pdf阅读器支持的所有Javascript函数中以下函数在实际应用中,还是可以对用户的使用造成一些困扰:
app.launchURL()、app.media.getURLdata()、app.alert()、app.execDialog()、doc.getURL。
1、app.launchURL()函数功能为访问远程url。
该函数的四元组如下:
该函数包含两个参数,为cURL(用于指定文件的路径)和bNewFrame(用于指定是否用新建页面显示文件)。
当打开包含该函数的pdf文件时,首先会弹出窗口提醒用户建立远程链接,随后使用默认浏览器打开一个远程连接。
2、app.media.getURLdata()函数功能为打开url指定的多媒体文件。
四元组如下:
该函数包含两个参数,cURL(用于指定文件的路径)和cMimeType(可选,用于指定文件MIME类型)。
当打开包含该函数的pdf文件时,首先会弹出窗口提醒用户建立远程链接,随后根据版本和应用不同可能会有安全提示,随后需要用户手动选择信任,最终使用系统默认的播放器播放URL指定的文件。
3、app.alert()函数功能为弹出一个警示对话框。
该函数四元组如下:
该函数包含多个参数分别为:cMsg(用于指定对话框的内容)、nIcon(可选,用于指定对话框图标)、nType(可选,用于指定按钮的类型)、cTitle(可选,用于指定对话框标题)、oDoc(可选,指定与警告相关的Doc结构)、oCheckbox(可选,在对话框中放一个checkbox并且可以指定相关内容、初始值以及结束值)
当打开包含该函数的pdf文件时,将会弹出相应对话框,但是在标题处会有提示:“警告:JavaScript Window”字样如下:
4、app.execDialog()函数的功能为创建一个对话框。
其四元组如下:
该函数可以通过设定相关参数实现高度定制化对话框,如下所示:
但是在对话框中包括“Javascript Window”标题,和红色的警告文本。
5、doc.getURL函数功能为通过GET方法获取URL指向文件。
其四元组如下:
该函数包含两个参数,分别为cURL(目标文件的地址)和bAppend(如果为true,将运行结果附加到当前文件;当文件在浏览器中运行时,推荐使用false)。当该函数运行后,仍然会有安全性提示,如下:
然而该函数还有另外一个功能是可以运行本地文件,同时为了防止执行任意文件,还在注册表项中\LOCAL_MACHINE\SOFTWARE\Policies\Adobe\Acrobat Reader\11.0\FeatureLockDown\cDefaultLaunchAttachmentPerms进行了限制。当用户尝试执行文件不在限制范围内时,还会调用系统函数SaferiIsExecutableFileType判断是否为可执行文件,同时不受两方面限制后将会出现以下两个弹窗进行提示:
并最终打开目标文件:
针对不同版本所使用的程序不同,在reader X中为上图使用默认浏览器打开,而在Acrobat XI pro中则直接使用notepad打开。
参考链接:
https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/Javascript_api_reference.pdf