影子攻击让攻击者可以替换已签名 PDF 中的内容

 

安全研究者展示了一种新型的 PDF 攻击方式:攻击者可以绕过现有的 PDF 安全策略,在确保数字签名有效的情况下,修改 PDF 文件的内容。这破坏了已签名 PDF 文档的完整性保护机制。

图中展示了攻击者通过“隐藏+替换”方法,让文档的签署者和文档的查看者看到不同的内容。

左侧绿色部分为文档签署者看到的内容;
右侧红色部分为查看者看到的文档内容。

PDF 文档对象中用红色标注的是被攻击者修改后的文档对象。

—— 论文第8页,图6

德国波鸿鲁尔大学(Ruhr-University Bochum)的学者将这种攻击方式称为影子攻击(Shadow attacks)”。“影子攻击”利用了 “PDF 规范提供的巨大灵活性,让修改后的影子文档依然符合标准”。

研究者在2021年2月22日的网络和分布式系统安全研讨会(Distributed System Security Symposium, NDSS)上公布了“影子攻击”方法。已测试的 29 个 PDF 应用中有 16 个容易受到影子攻击。测试的 PDF 应用包括:Adobe Acrobat、Foxit Reader、Perfect PDF 和 Okular。

实施攻击时,攻击者创建了一个包含两段不同内容的 PDF 文档:一段是文档签署方看到的正常内容;另一段是隐藏内容,在 PDF 被签名后就会显示出来。

研究者将“影子攻击”概括为:“PDF 的签署者接收、审阅、然后对文档签名”,“攻击者对已签名的文档稍加修改,发给受害者。受害者打开已签名的 PDF,检查数字签名是否有效。虽然数字签名依然有效,但受害者看到的内容与签署者看到的并不相同”。

对应到现实世界中,这种攻击相当于故意在纸质文档中留下空白,并让授权方签名。这让攻击者能够在文档的空白部分插入他们想要的任意内容。

“影子攻击”基于研究者在2019年2月发现的类似威胁。之前的威胁发现在保持签名有效的情况下,依旧存在更改文档内容的可能性,因此有可能伪造已签名的 PDF 文档。

PDF 查看器厂商已经采取了安全措施来修复之前发现的威胁。新的研究旨在扩展这种攻击模型,并探究新攻击方式的可能性:假设攻击者可以在 PDF 签名之前对其进行操作,那么他们是否可以修改已签名 PDF 的可见内容,而不使其签名无效。

 

“影子攻击”的变体

图中展示了“影子攻击”的三种变体:隐藏、替换、隐藏+替换

绿色的人为文档签署者、红色的为攻击者。
绿色的框代表签署者看到的文档结构,红色的框代表攻击者修改后的文档结构。

—— 论文第5页,图4

“影子攻击”的核心是利用“无害”的、不会使签名无效的功能来修改 PDF。如:“增量更新”(例如:填写表单)和“交互式表单”(例如:文本字段、单选按钮等)。
有多种攻击方式:一种叫做“隐藏”,攻击者用无害的对象覆盖了恶意内容;另一种叫做“替换”,攻击者直接替换原始内容,并保留签名。

还有一种变体称为“隐藏和替换”。可以组合上述方法,并通过简单地更改 PDF 中的对象引用来修改整个文档的内容。

研究者写道:“攻击者可以构建一个完整的影子文档,修改原文档每一页的内容,甚至修改总页数、以及原文档中包含的每个对象”。

简单地说,这种攻击方法通过创建一个表单,让表单在签名前后显示相同的内容。但在攻击者的操纵下,可以显示完全不同的内容。

 

受影响的范围

研究者发布了两种新的开源工具用于测试漏洞:PDF-Attacker 和 PDF-Detector,他们可以生成影子文档,并对比未签名和修改后的 PDF。

表格为针对不同 PDF 应用的测试结果。
左侧为 PDF 应用及版本、中间为受到三种攻击的情况、右侧为漏洞是否修复。

在已测试的 29 个应用中,有 16 个容易受到至少一种攻击,标记为 ●;

另有 10 中情况下,PDF 应用对于允许的修改和禁止的修改均显示相同的警告。
允许的修改有:对一个文档二次签名;禁止的修改有:修改已签名的文档内容。
文中将这种情况称之为有限的脆弱性,标记为 ◐。

—— 论文第11页,表2

CVE 为针对 Adobe Acrobat 的漏洞分配了两个编号:CVE-2020-9592CVE-2020-9596。Adobe 在2020年5月12日发布的更新中修复了这些漏洞。截至2020年12月17日,已测试的 29 个 PDF 应用程序中有 11 个仍未修复该漏洞。

这并不是 PDF 安全第一次受到学界的关注。此前研究者就演示过提取受密码保护的 PDF 文件内容的方法。该方法利用 PDF 规范支持的部分加密,在用户打开文档时远程提取受保护内容。

此外,研究者上个月还发现了影响 PDF 标准的另一组漏洞:从 CVE-2020-28352CVE-2020-28359CVE-2020-28410CVE-2020-28412,共计 11 个漏洞。这些漏洞可能带来拒绝服务、信息泄露、数据操纵攻击,甚至任意代码执行的风险。

 

相关链接

(完)