用数字签名伪造PDF的几种方法


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, bc, 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参照表中。 同时,为了避免处理移动的零件,可以将其包装在一些无关的对象中,例如streamdictionary


6.比较原始和修改过的PDF文档

攻击表现


研究人员在用于查看PDF的不同程序中测试了每种攻击的有效性。 在Linux下无法仅欺骗Adobe Reader 9 。 在所有其他程序中,以一种或多种方式绕过签名验证。



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

Source: https://habr.com/ru/post/zh-CN442066/


All Articles