图 1. PDF数字签名所基于的增量保存过程。 根据测试结果,这是伪造证件最有效的方法从理论上讲,PDF数字签名可以可靠地验证文档的作者。 但实际上,PDF处理通常由无法正确执行验证的专有软件执行。 来自德国波鸿的鲁尔大学的专家介绍
了几种伪造数字签名的PDF文档的方法 ,这些
文档适用于大多数PDF查看器和在线验证服务。
仅在单个程序中提供了针对所有攻击的防护,甚至在Linux下也可以使用。
PDF结构
图 2. PDF文件结构PDF文档的结构如图2所示。 2.当增量保存对PDF文档的更改时,新对象将被添加到
主体中 ,新的
Xref表将包含对新对象的描述以及新的
预告片以及指向
目录的链接(请参见图1)。 目录是PDF文件的根对象;它定义了文档的结构,可以选择确定访问权限。
每个对象均以对象号和版本号开头,并随对象的每次更新而增加。
图 2. PDF对象的结构签名创建
将数字签名添加到PDF文档依赖于增量保存机制(请参见图1)。 在增量保存期间添加签名时,以下内容将添加到文档中:
- 具有新的Perms参数的新目录 ,该参数定义了修改文档的权限; 此参数引用签名对象;
- 签名对象(
5 0 obj
),具有有关用于对文档进行哈希和签名的加密算法的信息,并带有Contents
参数,该参数包含PKCS7十六进制编码的Blob-它存储证书以及使用与公钥相对应的私钥创建的签名的值在证书中。 ByteRange
参数确定在哈希函数的输入处使用PDF文件的哪些字节来计算签名(对a, b
和c, d
),即对文件的哪个部分进行签名;
- 具有指向新对象链接的新外部参照表
- 新预告片 。
在图。 图3显示了经过数字签名的PDF文件的简化图。
图 3.简化的数字签名PDF文件布局根据当前规范,
建议对整个文件进行签名,但PKCS7 blob除外。
签名验证由打开PDF文档的应用程序执行。 它立即从PDF中提取签名,并使用加密操作来验证其正确性,然后检查是否可以信任使用其密钥进行签名的X.509证书。
通常,所有PDF阅读器都不信任操作系统内置的密钥库。 像Firefox浏览器一样,它们分发自己的密钥库,并且通常允许用户使用受信任的证书指定存储。 此功能允许您仅信任某些证书,例如来自您自己的证书颁发机构的证书。
数字签名伪造
研究人员描述了三种在签名的PDF中伪造内容的方法。
- 通用签名伪造(USF);
- 增量保存攻击(ISA)攻击
- 对签名包装程序的攻击(Signature Wrapping Attack,SWA)。
通用签名假(USF)
USF攻击会在打开PDF的应用程序中禁用
签名验证 。 同时,将有关成功验证签名的正常消息发送给用户。 这是通过操作文档中的
Signature对象来完成的:在该文档内部创建了错误的记录,或者从文件中删除了该对象的链接。 尽管PDF查看器无法验证签名正确无误,但在某些情况下,程序仍会显示其存在,这符合攻击者的目标。
研究人员制定了18种USF攻击媒介,其中8种如图1所示。 4。
图 4.八个攻击媒介绕过数字签名验证如果PDF查看器未正确验证数字签名,则所有这些方法均有效。
增量保留攻击(ISA)
此类攻击包括在文档的其他部分中重新定义结构和内容。 这个想法是,签名是根据
ByteRange
指定的字节范围来计算的,多余的部分不会落入该范围,如图2所示。 5,
图 5.将内容添加到附加部分时,不会违反数字签名可以通过多种方法来检查文档更改并阻止在PDF查看器中显示相应的警告。
签名包装攻击(SWA)
最后,最后一类攻击允许您绕过签名验证而不进行增量保存,而是将PDF的签名部分移到文档的末尾,并将签名的
Trailer中的
xref
指针重新使用到修改后的
xref
参照表中。 同时,为了避免处理移动的零件,可以将其包装在一些无关的对象中,例如
stream或
dictionary 。
图 6.比较原始和修改过的PDF文档攻击表现
研究人员在用于查看PDF的不同程序中测试了每种攻击的有效性。
在Linux下无法仅欺骗
Adobe Reader 9 。 在所有其他程序中,以一种或多种方式绕过签名验证。

在线PDF数字签名验证服务的情况并没有更好。
