你收到一封邮件,附件是一张发票。既然是 PDF,你没多想就打开了。毕竟 PDF 不过是一份文档——一张印刷页面的照片罢了。它还能做什么呢?
事实证明,它能做的比大多数人以为的多得多。
简短的回答是:PDF 不会像程序那样”感染”病毒。但它可以携带把病毒取回来的指令,也可以携带攻击者用来攻破阅读器所需的材料——而阅读器正是你打开它用的那个程序。这个区别很重要,它直接告诉你该往哪里看。
PDF 是容器,不是照片
大多数人脑中的那幅图景,在一个具体的地方错了。我们把 PDF 想象成页面的平面图像。实际上它更像一个带隔层的小盒子。有些隔层装着你看得见的文字和图片,另一些则可能装着你完全看不见的东西。
按规范,一份 PDF 允许包含:
- 脚本——在你的 PDF 阅读器内部运行的小程序
- “打开即执行”指令——你双击的那一刻文件就让阅读器去做的事,此时你连一个字都还没读到
- 附带的文件——藏在文档内部的另一个完整文件
- 会自行访问的链接——文档可以主动去访问的网址
- 启动其他程序的命令
这些都不是罪犯加进去的。它们全都写在官方的 PDF 规范里,而且出于合理的理由:能在你输入时校验答案的表单、可交互的报告、自带附件的文档。问题说起来很简单:为运行代码而设计的功能,终究是一个会运行代码的功能,无论使用它的是谁。
那次根本不需要漏洞的攻击
2010 年 3 月,一位名叫 Didier Stevens 的安全研究者发表了一项成果,他称之为 “Escape From PDF”。他做出了一份能运行自身内部所藏程序的文档——而且全程没有利用任何一个缺陷。他只是用了这个格式本来就提供的功能。
在运行任何东西之前,Adobe Reader 确实向用户发出了警告。但 Stevens 发现,他能在一定程度上控制那条警告的措辞——换个委婉的说法就是,他可以让那个弹窗帮着劝你点”是”。
这一点之所以重要,是因为它推翻了一个让人安心的假设。多数人相信,危险的文档一定是在利用某个缺陷,因此只要软件保持更新,问题就解决了。而在这个案例里,什么都没有坏掉。格式做的正是它被设计出来要做的事。更新解决不了这个问题——所以阅读器软件的应对方式,是干脆把这个功能关掉。
危险的 PDF 分两类
你会遇到的有害 PDF,几乎都属于以下两类之一。区分它们很有必要,因为拦住它们的手段完全不同。
第一类滥用正常功能。脚本、”打开即执行”指令、会自动打开的附件。这就是”Escape From PDF”那一家族。它在完全更新过的软件上照样奏效,因为实际上并没有什么东西是坏的。能拦住它的,是把那些功能关掉。
第二类攻击的是你的 PDF 阅读器本身。一个被蓄意破坏的字体、一张损坏的图片、一种被扭曲成阅读器代码从未设想过的结构。目的是把那段代码搅得足够混乱,从而夺取它的控制权。这一类才是安全更新真正能修好的——这也正是及时安装更新如此重要的原因。
真实的攻击往往把两者结合起来。一部分负责打开门,另一部分负责走进去。
打开之前怎么检查文件
这件事不需要你是安全专家,也不需要把文件发送到任何地方。Didier Stevens 提供了一个名为 pdfid 的免费工具,它在你自己的电脑上运行,大约只需一秒:
python pdfid.py invoice.pdf它会打印出一份简短的清单,列出 PDF 可能包含的东西,每一项后面跟着数量。对于一份普通文档——发票、报告、合同——你希望在 /JavaScript、/OpenAction、/Launch 和 /EmbeddedFile 后面看到的都是零。
数字大于零本身并不能证明有什么不轨。很多正规表单都会用到脚本。但它确实告诉你:这份文档做的事情不止于显示文字——而这一点,值得在打开之前知道,而不是之后。
如果你不想安装任何东西,同样的判断力依然管用:一张来自你从未购买过的公司的意外发票,值得你打个电话,而不是双击它。

四个真正管用的习惯
关掉 PDF 阅读器里的脚本功能。在 Adobe Acrobat Reader 中,它位于”首选项 → JavaScript”。日常工作中几乎没有人会有意去用带脚本的 PDF,把它关掉能消除一整类风险,而实际代价接近于零。
及时安装更新。这对滥用功能的那一类毫无作用,但面对第二类——那些针对阅读器本身的攻击——它就是你的全部防线。
对催你的文档保持警惕。一张你没预料到的发票。一个你没下单的包裹的派送通知。一份今天就必须签的合同。这种紧迫感不是巧合,它的作用就是让你来不及思考就把文件打开。
留意文件是在哪里被打开的。在浏览器里直接打开 PDF 很方便,但这意味着处理这份文档的软件,本身已经连着整个互联网。两种选择都不是天然正确的——只是这个选择值得你有意识地做出,而不是稀里糊涂地默认。
关于在线转换器的一个常见误解
有一种常见的直觉,值得提前说清楚:如果一份 PDF 看着可疑,那就先用在线转换器过一遍,里面藏的东西自然会被剥掉。
事情不是这样运作的。你把一份可能怀有恶意的文件交给了别人的服务器,换回来一份你照样得打开的文件,而现在你的文档在一处你无法掌控的基础设施上多了一份副本。如果这份文档不仅可疑而且机密,那你就把一个问题变成了两个。
这正是 PDF Manipulator 完全在你自己电脑上运行的原因——你在其中打开的任何东西都不会被上传到任何地方。但我想把话说准确,说清它意味着什么、不意味着什么,因为夸大其词恰恰是这个网站所反对的那类说法:
- 它确实意味着:你的文档永远不会落到别人的服务器上,所以某个你只用过一次的服务发生数据泄露,也无法把它暴露出去。
- 它并不意味着恶意 PDF 会因此变得无害。任何打开 PDF 的程序都必须读取它,我的程序也不例外。在本地处理保护的是你的隐私,它不是杀毒软件。
这是两个彼此独立的问题——还有谁会拿到这份文件的副本,以及这份文件是否正试图攻击我的电脑——它们需要两个各自独立的答案。
简单来说
PDF 不是页面的照片。它是一个恰好长得像照片的小容器,而且被允许携带一些并不只是静静待着的东西。这并不意味着 PDF 很危险——这个月你会打开几十份,每一份都会平安无事。它只是意味着:一份来自陌生人的文件,在赢得你的双击之前,先值得三十秒的注意。
PDF Manipulator 免费,且完全离线运行——看看它能做什么 →


参考来源
- Didier Stevens, Escape From PDF (2010)
- Didier Stevens, PDF Tools
- Help Net Security, Researcher exploits PDF file without using a vulnerability


