PDF签名系列(1):PDF签名机制的漏洞分析
来源: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字节串A1,A2;可以看到文档里包含两个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索引到了catalog1,C2索引到了catalog2,所以C1和C2渲染出来的文档可以是totally不同的内容。但是签名值确实对两个文档都是合法的签名值,这有悖于数字签名的原则。
思考下这个问题的根源来自PDF文档允许冗余的object存在,所以这个漏洞能否存在取决于是否认为这是PDF符合语法规范的。
参考文档:
Collisions in PDF Signatures
PDF签名系列(1):PDF签名机制的漏洞分析相关推荐
- PDF签名系列(2):PDF的签名值到底存在哪里?
来源:PDF签名系列(2):PDF的签名值到底存在哪里? - 知乎 研究过PDF签名的同学应该见过下面这张图, 来自ADOBE的文档Acrobat_DigitalSignatures_in_PDF.p ...
- Windows 组策略(Group Policy Object)机制的漏洞分析
Windows 组策略(Group Policy Object)机制的漏洞类大约有60个,专门针对策略更新步骤,允许域环境中的标准用户执行文件系统攻击,进而使恶意用户可以逃避反恶意软件解决方案,绕过安 ...
- 从Dump到POC系列一:Win32k内核提权漏洞分析
转载自:http://blogs.360.cn/blog/dump-to-poc-to-win32k-kernel-privilege-escalation-vulnerability/ 1.引言 近 ...
- Linux 二进制漏洞挖掘入门系列之(五)UAF 漏洞分析与利用
0x10 UAF(Use After Free) 漏洞原理 这里,需要先介绍一下堆分配内存的原则.ptmalloc 是 glibc 的堆管理器,前身是 dlmalloc,Linux 中进程分配内存的两 ...
- 想要在PDF文档中提取签名和图像信息?有这篇Aspose.PDF for .NET干货教程就够了!
Aspose.PDF for .NET是一种高PDF处理和解析API,用于在跨平台应用程序中执行文档管理和操作任务.API可以轻松用于生成.修改.转换.渲染.保护和打印PDF文档,而无需使用Adobe ...
- 什么是计算机系统的可信基点,基于可信基点的结构化签名比较算法.pdf
基于可信基点的结构化签名比较算法.pdf 第28卷 第24期 计算机工程与设计 21)07年12月 VO1.28 NO.24 Computer Engineering and Design Dec.2 ...
- 【每日随笔】电子签名 ( 下载 “e 签保“ 应用 | 使用 手机号 + 短信验证码 登录 | 发起签署 | 签名 | 获取签名后的 PDF 文件及出证信息 )
文章目录 一.下载 "e 签保" 应用 二.使用 手机号 + 短信验证码 登录 三.发起签署 四.签名 五.获取签名后的 PDF 文件及出证信息 一.下载 "e 签保&q ...
- Java对PDF进行电子签章CA签名认证
什么是CA? CA是认证中心的英文Certification Authority的缩写.它为电子商务环境中各个实体颁发数字证书,以证明各实体身份的真实性,并负责在交易中检验和管理证书:它是电子商务和网 ...
- java读取pdf签名_Java 获取PDF中的数字签名信息
一.概述及程序环境要求 本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人.签名位置.日期.原因.联系方式.签名在文档中的坐标等等. 程序环境包括: Spire.Pdf.jar(ja ...
最新文章
- leetcode算法题--Restore IP Addresses
- linux环境内核调试软件,Linux内核调试环境的搭建(使用qemu)
- javascript的eval和with使用小结
- Atomic原子类常用方法总结(包含四大类型)
- 鸿蒙上海开发者日直播,华为鸿蒙 OS 开发者日于 4月17 日上海举行
- 业务线开发流程图(四)
- centos7安装kubernetes 1.1
- 高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题
- VC 使用 MinGW编写的dll
- php session string,教你如何使用php session
- python马尔可夫链_Python中的马尔可夫链(初学者)
- Maven实战_许晓斌
- Mysql查询当天,本周,本月所有数据记录
- Qua Vadis Eclipse? 第一部分
- mysql 串行化_MySQL事务的可串行化
- crt上传数据_使用SecureCRT上传文件到Linux服务器
- 机器学习线性回归实践,波士顿房价预测,手写梯度下降
- CleanMyMac X4.10.6mac上非常强大的系统清理工具
- level set 介绍4(水平集方法)
- 细看00后90后80后的不同