几乎任何一家公司或政府机构都会用到PDF文件,同时他们还会使用数字签名来确保文件的真实性。当你使用任何PDF阅读器打开已签名的文件,程序将会显示一个标志,表明文档已经过那些人签名,并允许您访问签名验证菜单。
因此,来自德国几所大学的一组研究人员希望测试PDF签名的可靠性。来自波鸿鲁尔大学的Vladislav Mladenov在36C3上分享了他们团队的发现。
研究人员要做的事情非常简单,他们想在维持原本有效签名的情况下修改已签名PDF文档的内容。从理论上讲,网络犯罪分子也可以做同样的事情,将恶意内容或虚假信息添加到签名文件中。毕竟,客户倾向于无条件信任银行发来的签名PDF文档,且有可能点开其中任何一个链接。
该团队选择了22个不同平台上的主流PDF阅读器,并经过系统性的实验得出结果。
PDF文件结构
首先让我们简单地介绍一下PDF格式。每个PDF文件都由四个主要部分构成的,分别是文件头、文件体、Xref交叉引用表以及文件尾追踪器。其中文件头标注了PDF的版本,文件体显示用户看到的主要内容,交叉引用表负责列出主体内的对象及其显示内容位置的目录,文件尾则是PDF查看器阅读文档的第一步,它包含了两个重要参数,告诉程序应该从哪里开始处理文件,以及交叉引用表的起始地址。
PDF格式中还有一个增量更新功能,允许用户标记部分文本并留下评论。从技术角度看,这个功能给文档增加了三个新的部分,正文的更新、新的交叉引用表和新的文件尾追踪器。这三个部分能够有效地改变用户查看到的对象,并给文档添加新的内容。本质上,数字签名也是一种增量更新,即向文件中添加另一个元素和相应的部分。
增量保存攻击ISA
首先,这支技术团队尝试使用文本编辑器通过另一个增量更新向文件添加额外的部分。严格地说,这不能算是攻击文件——该团队只是使用了PDF格式创建者实现的一个函数。当用户打开以这种方式修改过的文件时,PDF阅读器通常会显示一条消息,说明数字签名是有效的,但文档已被修改。但这样的信息并不足以引起注意,尤其是对没什么经验的用户来说。更糟糕的是,其中一个PDF阅读器(LibreOffice)甚至连这样的提示消息都没有。
接下来的实验中,他们删除了PDF文档的最后两个部分,即向正文添加更新,但不添加新的交叉引用表和追踪器。部分应用程序拒绝打开这类文件,有两个PDF阅读器发现了这部分内容的缺失,并且在没有通知用户的情况下自动补足。另外三种PDF阅读器没有丝毫怀疑就让用户打开了文件。
紧接着,研究人员想知道如果他们只是简单地将数字签名复制到他们自己”手动”添加的更新之后会发生什么。显然,Foxit和MasterPDF都中计了。
总的来说,在22个PDF阅读器中,有11个会受到这些初级操作的影响。更糟糕的是,有6个阅读器完全不显示文件被修改过的相关信息,而在另外5个软件中,想要找到文件经过修改的迹象,仅仅打开文件是不够的,用户必须手动进入菜单并检查数字签名的有效性。
签名包装攻击SWA
对文件签名就是将两个重要的字段作为增量更新到文件体,即包含签名内容的/Contents和准确描述签名的/ByteRange。后者中有四个参数,分别定义了文件的起点、签名代码之前的字节数、界定签名代码结束的字节以及签名之后的字节数。电子签名是从pdf文档代码中加密生成的一串字符序列,一般来说签名是不能够再给自己授信的,所以存储它的区域也被排除在签名计算的过程以外。
研究人员试图在签名后直接添加另一个/ByteRange字段,字段中的前两个数值保持不变,改动签名末尾的位置。那么在文件中就出现了一个额外的区域,能够放入任何恶意对象以及描述他们的Xref交叉表。理论上来说,如果正确读取文件,那么PDF阅读器是无法查看到这个区域的内容。然而在22款应用中,有17种阅读器都有这个漏洞。
通用签名伪造USF
此外,研究团队决定对这些软件进行压力测试,使用渗透测试的方法,尝试用错误的值替换字段或干脆删除他们。针对/Contents进行实验后发现,就算将实际签名替换为值0x00,依旧有两个PDF阅读器认可了文件签名。
那么如果不考虑改变签名内容,直接删除含有签名具体信息的/ByteRange呢?或者使用空值替代真实数值?这两种情况下,依然还是有部分阅读器验证了签名。
在接受测试的22个PDF阅读器中,有4款软件包含可被利用的执行错误。
下面的这张结果汇总表显示,在22个软件中有21个可能被一定的手段误导欺骗。也就是说,除非用户使用的是那唯一一个通过测试的PDF阅读器,网络犯罪分子是能够创建看起来可靠有效,实际上却含有恶意内容或错误信息的PDF文档来诱导用户的。
有趣的是,只有Adobe Reader 9 这一个软件没有落入研究人员的任何套路。但问题在于,它容易受到RCE漏洞的影响,且只有Linux用户因为缺少更新的可用版本才不得已地使用它。
结论
从以上的实验中,我们能够得出的实际结论有以下两点:首先,任何人都不应该盲目相信PDF数字签名,即便你看见了那个绿色的标记也并不意味着签名就是有效可靠的。
其次,即便是经过签名的文档也可能带来威胁。在打开任何来自网络的文件或点击其中的链接之前,请确认你的电脑上安装有可靠的安全解决方案。