PDF 会带病毒吗?打开文件时究竟发生了什么

一位女性坐在电脑前,周围环绕着巨大的昆虫

你收到一封邮件,附件是一张发票。既然是 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 文件安全——一份 PDF 文档内部可能藏着什么

四个真正管用的习惯

关掉 PDF 阅读器里的脚本功能。在 Adobe Acrobat Reader 中,它位于”首选项 → JavaScript”。日常工作中几乎没有人会有意去用带脚本的 PDF,把它关掉能消除一整类风险,而实际代价接近于零。

及时安装更新。这对滥用功能的那一类毫无作用,但面对第二类——那些针对阅读器本身的攻击——它就是你的全部防线。

对催你的文档保持警惕。一张你没预料到的发票。一个你没下单的包裹的派送通知。一份今天就必须签的合同。这种紧迫感不是巧合,它的作用就是让你来不及思考就把文件打开。

留意文件是在哪里被打开的。在浏览器里直接打开 PDF 很方便,但这意味着处理这份文档的软件,本身已经连着整个互联网。两种选择都不是天然正确的——只是这个选择值得你有意识地做出,而不是稀里糊涂地默认。

关于在线转换器的一个常见误解

有一种常见的直觉,值得提前说清楚:如果一份 PDF 看着可疑,那就先用在线转换器过一遍,里面藏的东西自然会被剥掉。

事情不是这样运作的。你把一份可能怀有恶意的文件交给了别人的服务器,换回来一份你照样得打开的文件,而现在你的文档在一处你无法掌控的基础设施上多了一份副本。如果这份文档不仅可疑而且机密,那你就把一个问题变成了两个。

这正是 PDF Manipulator 完全在你自己电脑上运行的原因——你在其中打开的任何东西都不会被上传到任何地方。但我想把话说准确,说清它意味着什么、不意味着什么,因为夸大其词恰恰是这个网站所反对的那类说法:

  • 确实意味着:你的文档永远不会落到别人的服务器上,所以某个你只用过一次的服务发生数据泄露,也无法把它暴露出去。
  • 并不意味着恶意 PDF 会因此变得无害。任何打开 PDF 的程序都必须读取它,我的程序也不例外。在本地处理保护的是你的隐私,它不是杀毒软件。

这是两个彼此独立的问题——还有谁会拿到这份文件的副本,以及这份文件是否正试图攻击我的电脑——它们需要两个各自独立的答案。

简单来说

PDF 不是页面的照片。它是一个恰好长得像照片的小容器,而且被允许携带一些并不只是静静待着的东西。这并不意味着 PDF 很危险——这个月你会打开几十份,每一份都会平安无事。它只是意味着:一份来自陌生人的文件,在赢得你的双击之前,先值得三十秒的注意。

PDF Manipulator 免费,且完全离线运行——看看它能做什么 →

参考来源

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部