东莞市做网站的公司哪家好,wordpress grace 8.0,网络服务主要有什么服务,爱站网关键词挖掘查询工具来源#xff1a;PDF签名系列(1):PDF签名机制的漏洞分析 - 知乎
研究PDF文件的签名机制有一段时间了#xff0c;刚开始学习的时候就看到有提到说#xff0c;被签名的PDF内容的Range gap#xff0c;会成为这个机制的漏洞#xff0c;但是一直不能完全参透。直到昨天看到一篇…来源PDF签名系列(1):PDF签名机制的漏洞分析 - 知乎
研究PDF文件的签名机制有一段时间了刚开始学习的时候就看到有提到说被签名的PDF内容的Range gap会成为这个机制的漏洞但是一直不能完全参透。直到昨天看到一篇文章的分析才对这个问题有了一个更清晰的认识所以做一个小小总结整理。
这里假设读者对PDF文件格式和数字签名的原理有一定了解。
首先我们来看一下PDF文档里的Signature Dictionary 我们知道PDF文件是由一系列Objects组成的通过objects的互相引用组织成了一个文档的appearance. 对于一个签过名的文档来说最重要的就是上图这样一个dictionary类型的object.
用一张图来简单说明一下PDF的签名机制。 上图是一个加入了数字签名的PDF文档内容。被签名的文档内容是整个文档但是除去了Contents入口下面的具体值。简单来说是对图中蓝色部分的所有内容做哈希然后对哈希做签名最后把签名值以及相关内容写进图中粉色部分。
好了这样的方法有什么漏洞呢
先简单描绘一下PDF文档的签名流程
1. 把文档序列化成一个字节串中间预留出合适的空间存放签名值此步骤称为preliminary serialization
2. 将字节串预留的空间去掉生成新的字节串称为signing serialization
3. 根据signing serilization生成签名数据块写入步骤一的preliminary serialization。签名完毕。 下面来详细描述下这个机制隐含的一个漏洞
假设生成两个preliminary serilization字节串A1A2可以看到文档里包含两个catalog.
Note一般来说catalog是整个PDF的入口所有用来显示PDF所用到的内容object都是从catalog开始逐级引用的。所以理论上来说文档内容里允许有冗余的object也就是说此object虽然在文档中定义了但是在显示的时候并没有被引用到。
另外我们可以知道object的相对位置是可以改变的只要修改了xreftable里对object的offset的描述那么最终显示的效果是一样的。 我们可以看到通过将A1和A2中的gap去掉生成signing serialization B1和B2之后B1和B2可以是完全一样的字节串。因此最终的签名值也会是一样的。
当签名值被嵌入回原来的A1和A2之后生成了最终签名文件C1和C2.
可以看到C1和C2是两个不同的文档了虽然是相同的xreftable相同的catalog的offset但是C1索引到了catalog1C2索引到了catalog2所以C1和C2渲染出来的文档可以是totally不同的内容。但是签名值确实对两个文档都是合法的签名值这有悖于数字签名的原则。
思考下这个问题的根源来自PDF文档允许冗余的object存在所以这个漏洞能否存在取决于是否认为这是PDF符合语法规范的。 参考文档
Collisions in PDF Signatures