安全新闻里每隔几个月就会冒出这样一句话:”攻击者正在利用 PDF 文件中的一个漏洞。”这个说法略有误导,而把它纠正过来是真的有用。
漏洞几乎从来不在文件里。它在打开文件的那个程序里。
这个区别会改变你该为此做些什么。如果危险住在文档里,你需要的就是一种清洗文档的办法。而既然它住在阅读器里,真正有帮助的,就是那些让你的阅读器更难被攻破的做法——而值得费心去做的,大约只有四件。
如果你还没读过,PDF 会带病毒吗讲的是这个故事里比较简单的那一半:一份 PDF 完全依靠正常功能就能做出的有害举动。本文谈的是更难的那一半。
PDF 阅读器为何是如此诱人的目标
把一页 PDF 显示给你看,听起来像是一件事。它实际上是几十件事。
为了把那一页放到你的屏幕上,阅读器必须解开压缩的数据、解码其中的图片(它们可能采用五六种不同的格式)、安装并解释内嵌的字体、算出版面、处理透明度和颜色,还要把各种表单字段构建出来。这些步骤中的每一步,都由一段不同的代码负责。而每一段代码,都会照单全收文件递给它的任何东西。
字体值得停下来说一说,因为它常常出乎人们意料。一个内嵌字体并不是一堆字母的图片——它更接近一个小程序,描述每个字符该怎么画出来。你的阅读器会去运行那份描述。图片解码器也类似:结构复杂、为速度而生,而且还被要求在遇到损坏的文件时不崩溃地把它对付过去。
于是,一份来自陌生人的 PDF 送到之后,就被直接喂进了十几个复杂的软件部件。这就是攻击面所在,也是二十年来攻击者能在这里屡屡得手的原因。
它同时也解释了一条听起来很在理、实际帮助不大的建议:”只要别点文档里的任何链接就行了。”危险的部分通常发生在页面正被绘制出来的时候——那会儿还没有任何可以点的东西。
一次漏洞利用究竟是怎么运作的
你不需要懂技术细节也能做出正确的决定,但了解个大致轮廓是有用的,因为它能解释为什么有些防范措施真的管用,而另一些只是让人感觉管用。
一次攻击由三个部分组成。
一个畸形的东西——一个写着不可能尺寸的字体、一张长宽对不上的图片、一种嵌套得比任何人预想的都深得多的结构。它唯一的任务,就是把阅读器的代码搅糊涂。
混乱本身——那段代码最终写进了一块它本不该碰的内存。单看这一步,通常也就是让程序崩溃而已。
把崩溃变成控制权——这是最难的一步,也正是文档内部的脚本派上用场的地方。脚本本身不是攻击。它是那个先把内存整理成可预测状态的工具,好让崩溃落在一个有用的位置上,而不是只把程序弄死。
第三步才是真正可以带走的结论。关掉阅读器里的脚本功能,一个底层缺陷都修不好——但它依然让攻击难上不少,因为它拿走了那件最顺手的工具:把一个不可靠的花招变得可靠的那件工具。
为什么”扫描一下就好”并不够
说到这里,有个合理的问题:安全软件难道不能直接看看文件内部,把坏的那一部分找出来吗?
有时候能。但 PDF 格式提供了好几种完全合法的手段,让一份文档变得更难被检查。内容可以被反复压缩好几层,于是一个词要解开好几次才会露面。名称可以用另一种写法记录,于是按某一种拼写去搜索的扫描器,会漏掉另一种意思完全相同的写法。文件的某些部分可以被塞进压缩包里,而简单的搜索从来不会去打开它们。
这些都不是缺陷。它们全都写在规范里,而且每一项功能背后都有再平常不过的理由。它只是意味着:要像样地检查一份 PDF,需要的是能把文件实实在在拆开的软件,而不是在里面搜索一遍的软件——这是简单扫描的一个真实局限,而不是你该不信任杀毒软件的理由。

该做什么,按管用程度排序
1. 及时安装阅读器更新。只有这一条是真正把漏洞消除掉,而不是让它更难被够到。如果这份清单上你只做一件事,就做这一件。Adobe、Foxit 和各家浏览器厂商都会定期发布安全修复,而绝大多数攻击瞄准的,都是几个月前就已经被补上的缺陷。
2. 关掉脚本功能。在 Adobe Acrobat Reader 中是”首选项 → JavaScript”。它堵不上那个洞,但它把梯子搬走了。
3. 让沙箱保持开启。现代的 Acrobat Reader、Chrome 和 Firefox 都会在一块受限的区域里打开 PDF,与你电脑的其余部分隔开。如果它叫”保护模式””受保护的视图”或者类似的名字,就别去动它。这样一来,一次成功的攻击还得先逃出那个盒子才谈得上有什么意义——那是第二个问题,而且难得多。
4. 把你从来不用的附加功能关掉。3D 内容、内嵌视频、表单自动提交。每一个可选功能,都是又一段要去处理陌生人输入的代码。如果你从来没有有意用过其中某一项,关掉它你什么也不会损失。
还有一件事该停下来做:别把转换当成清洗。把一份可疑的 PDF 拿去用转换器过一遍,依然意味着把它喂给一个必须先读取它的软件。你改变的只是由哪个程序来承担风险,而不是风险还存不存在。
真出了事,会是什么样子
值得把一次成功的攻击究竟达成了什么说清楚,因为人们脑中的那幅画面,往往不是太戏剧化,就是太模糊。
你打开一份文档。它正常显示出来——这正是要点所在,因为一个把阅读器弄崩溃的文件会引来追问。而在后台,攻击者提供的代码此刻正以你的权限运行着。不一定是管理员权限,但确实是你的权限:你的文档、你保存的密码、你的网络连接。
到这一步,它是一个立足点,而不是终局。通常的下一步是从互联网上取回一个更大的东西,建立一条重启之后依然有效的回来的路,然后安静下来。几个月后被报道出来的那些损失——勒索软件、被掏空的账户、泄露的档案——往往可以一路追溯到某个人打开的一份文档,而当时他什么异常都没察觉到。
所以,”我打开的时候什么也没发生”并不能说明什么。什么也没发生,正是对方想要你得到的体验。
离线工作在哪里有帮助——又在哪里没有
我做 PDF Manipulator,是因为我希望自己的文档不要再跑到我掌控不了的服务器上去。这就是本地处理能给你的、诚实的那个范围:转换器的硬盘上没有副本,没有隐私政策需要读,也不会因为某家你 2023 年只用过一次的公司发生数据泄露而受牵连。
它给不了你的,是对一份恶意文档的防护。任何处理 PDF 的程序都必须先读取它——我的程序和别人的一样。在本地处理是一项隐私保障,不是一个安全扫描器;谁要是跟你说得不一样,那他是在推销东西。
两个问题,两个答案。还有谁会拿到这份文件的副本?——在本地工作解决的是这一个。这份文件是否正试图攻击我的电脑?——更新、沙箱,再加上一点戒心,解决的是那一个。
简单来说
PDF 漏洞利用瞄准的是你的阅读器,不是你的文档。这是个好消息,因为它意味着解决办法就在屏幕的你这一侧:让阅读器保持更新、关掉脚本功能、别关掉沙箱。三项设置,十分钟,这个问题的绝大部分就不再是你的问题了。
处理你的 PDF,无需上传到任何地方——PDF Manipulator 完全免费 →
参考来源
- Didier Stevens, PDF Tools
- Didier Stevens, Malicious PDF Documents Explained, Black Hat EU 2012




