来源: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签名机制的漏洞分析相关推荐

  1. PDF签名系列(2):PDF的签名值到底存在哪里?

    来源:PDF签名系列(2):PDF的签名值到底存在哪里? - 知乎 研究过PDF签名的同学应该见过下面这张图, 来自ADOBE的文档Acrobat_DigitalSignatures_in_PDF.p ...

  2. Windows 组策略(Group Policy Object)机制的漏洞分析

    Windows 组策略(Group Policy Object)机制的漏洞类大约有60个,专门针对策略更新步骤,允许域环境中的标准用户执行文件系统攻击,进而使恶意用户可以逃避反恶意软件解决方案,绕过安 ...

  3. 从Dump到POC系列一:Win32k内核提权漏洞分析

    转载自:http://blogs.360.cn/blog/dump-to-poc-to-win32k-kernel-privilege-escalation-vulnerability/ 1.引言 近 ...

  4. Linux 二进制漏洞挖掘入门系列之(五)UAF 漏洞分析与利用

    0x10 UAF(Use After Free) 漏洞原理 这里,需要先介绍一下堆分配内存的原则.ptmalloc 是 glibc 的堆管理器,前身是 dlmalloc,Linux 中进程分配内存的两 ...

  5. 想要在PDF文档中提取签名和图像信息?有这篇Aspose.PDF for .NET干货教程就够了!

    Aspose.PDF for .NET是一种高PDF处理和解析API,用于在跨平台应用程序中执行文档管理和操作任务.API可以轻松用于生成.修改.转换.渲染.保护和打印PDF文档,而无需使用Adobe ...

  6. 什么是计算机系统的可信基点,基于可信基点的结构化签名比较算法.pdf

    基于可信基点的结构化签名比较算法.pdf 第28卷 第24期 计算机工程与设计 21)07年12月 VO1.28 NO.24 Computer Engineering and Design Dec.2 ...

  7. 【每日随笔】电子签名 ( 下载 “e 签保“ 应用 | 使用 手机号 + 短信验证码 登录 | 发起签署 | 签名 | 获取签名后的 PDF 文件及出证信息 )

    文章目录 一.下载 "e 签保" 应用 二.使用 手机号 + 短信验证码 登录 三.发起签署 四.签名 五.获取签名后的 PDF 文件及出证信息 一.下载 "e 签保&q ...

  8. Java对PDF进行电子签章CA签名认证

    什么是CA? CA是认证中心的英文Certification Authority的缩写.它为电子商务环境中各个实体颁发数字证书,以证明各实体身份的真实性,并负责在交易中检验和管理证书:它是电子商务和网 ...

  9. java读取pdf签名_Java 获取PDF中的数字签名信息

    一.概述及程序环境要求 本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人.签名位置.日期.原因.联系方式.签名在文档中的坐标等等. 程序环境包括: Spire.Pdf.jar(ja ...

最新文章

  1. leetcode算法题--Restore IP Addresses
  2. linux环境内核调试软件,Linux内核调试环境的搭建(使用qemu)
  3. javascript的eval和with使用小结
  4. Atomic原子类常用方法总结(包含四大类型)
  5. 鸿蒙上海开发者日直播,华为鸿蒙 OS 开发者日于 4月17 日上海举行
  6. 业务线开发流程图(四)
  7. centos7安装kubernetes 1.1
  8. 高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题
  9. VC 使用 MinGW编写的dll
  10. php session string,教你如何使用php session
  11. python马尔可夫链_Python中的马尔可夫链(初学者)
  12. Maven实战_许晓斌
  13. Mysql查询当天,本周,本月所有数据记录
  14. Qua Vadis Eclipse? 第一部分
  15. mysql 串行化_MySQL事务的可串行化
  16. crt上传数据_使用SecureCRT上传文件到Linux服务器
  17. 机器学习线性回归实践,波士顿房价预测,手写梯度下降
  18. CleanMyMac X4.10.6mac上非常强大的系统清理工具
  19. level set 介绍4(水平集方法)
  20. 细看00后90后80后的不同

热门文章

  1. Leaf:美团分布式ID生成服务开源 1
  2. 美团开源 Logan Web:前端日志在 Web 端的实现
  3. 论文浅尝 - WSDM20 | 基于弱监督及逐步推理的多关系知识图谱问答
  4. 统计学-自然语言处理
  5. 【数据挖掘】数据挖掘和数据分析基础
  6. 基于改进YOLO v3网络的夜间环境柑橘识别方法
  7. 简单的循环以及从接口获取数组对象的一个字段集合
  8. 解决PendingIntent传递参数为空的问题
  9. 翻译题(map使用)
  10. Head first servlet and jsp学习笔记