Shadow Attack:隐藏和替换签名PDF中的内容

看此文之前请参见 PDF的基础以及常见的三种欺骗签名的方式 ,以下部分为 PDF影子攻击

1 Shadow Attack Model

攻击者模型基于真实的用例,在这些用例中签署了PDF文档(例如合同)。在这些用例中,攻击者可以在签名前将不可见的部分(影子内容,shadow content)注入PDF。签名后,攻击者再次操纵已签名的PDF。因此,它们在不使签名无效的情况下,对其内容进行了可见的更改。
在这里插入图片描述

1.1 攻击步骤

分为三个部分,每个阶段的输出是一个PDF文件

  1. 攻击者创建一个不可见的影子内容(文本或图像)的PDF,PDF1=createPDF()
  2. 签名者收到PDF1,对其进行签名,生成签名文档,PDF2=sign(PDF1)
  3. 攻击者收到PDF2。他们可以再次修改PDF2,例如,攻击者创建PDF3 = manipulate(PDF2)。攻击者将PDF3发送给受害者。

1.2 攻击成功判定

  1. 签名人只有在不注意影子内容的情况下才对PDF1进行签名。换句话说,攻击者注入的所有更改必须对签名者是不可见的。
  2. 一旦受害者打开PDF3,他们就会看到影子内容。
  3. PDF3签名验证成功。受害者相信签名者的公钥。受害者不信任任何其他密钥。特别是,他们不信任攻击者的密钥。例如,由于文件格式错误,打开PDF3不会显示任何错误或警告。

1.3 文件修改分析

当文件执行以下操作时,将被认为是合法的

  1. 追加新的Xref表和Trailer
  2. 覆盖无害对象: 增量保存攻击仅考虑对象类型:Catalog, Pages, Page和Contents。这是合理的,因为这些对象通过打开文档直接影响显示的内容。应用程序的供应商通过在应用签名后检测此类对象的定义来修复漏洞
  3. 重叠对象: 在分析中,提出了关于重叠内容的可见表示的问题。更准确地说:“如果两个对象在页面上共享同一位置,那么哪个对象在应用程序前台显示,哪个对象在后台显示?” 本文确定文档中对象的声明是决定性的。在重叠的情况下,第一个对象显示在第二个对象的顶部。因此,可以将相同的对象添加到PDF文件中,但顺序不同。由于对象的内容未更改,因此该增量更新也被认为是无害的。但是,打开PDF文件时可见内容会更改。
  4. 更改交互式表单: 本研究观察到一种应用于交互式表单的意外功能,该功能覆盖了文本字段的内容。通过单击文本字段,将显示其内容,并且叠加层消失。尽管避免讨论此功能的有效性,但发现叠加层上的更改被认为是无害的,并且不会使签名无效。

2 Shadow Attack(Hide+Replace+Hide-and-Replace)

在这里插入图片描述

2.1 Hide

此类影子攻击旨在将与受害者相关的内容隐藏在可见层后面。例如,攻击者可以在全页图片“签名以获得奖励!”后面隐藏文本“您已被解雇!”。攻击者一旦收到签名的文档,便会操纵该文档,以使查看器应用程序不再呈现图片。从攻击者的角度来看,隐藏攻击具有两个优点:

  1. 如果使用增量更新添加了新的可见内容,则许多查看器会显示警告。但是,在大多数情况下,如果内容被删除,它们不会发出警告。

  2. 对象仍可在PDF中访问。在上面的示例中,文字“您被解雇了!”仍可以通过搜索功能检测到。如果使用在线签名服务,并且通过搜索特定的关键字来查看文档,则可能需要进行此检测。本文确定了此攻击类别的两个变体,下面将对其进行进一步说明。

  • 变体1——通过引用的对象隐藏内容(令覆盖物失效):在此攻击变体中,攻击者创建覆盖对象(例如图像或表单域),并在文档签名后隐藏它们,以显示这些对象下面的内容。创建了三种不同的漏洞利用方法,它们分别通过
    1.恶意图像隐藏内容
    2.通过恶意表单字段隐藏表单字段
    3.通过恶意表单字段隐藏内容。
    攻击步骤
    1. 注入影子内容: 如上图所示,攻击者注入一个或多个图像并将其放置在原始内容上。图像可以覆盖整个页面或仅覆盖部分内容,例如,数字或文本段落。攻击者完全控制所放置图像的位置和可见性。
    2. 使影子内容可见: 最简单的方法是创建一个增量更新,该更新仅通过将overlay对象设置为free来更新Xref表。但是,许多查看器(例如Adobe)将该更改分类为危险并抛出错误或警告。因此,使用另一种方法:在增量更新中使用相同的对象ID,但将其定义为不同的对象类型。例如,将叠加层类型Image更改为XML/Metadata。此外,添加了一个Xref表更新,该更新指向元数据对象,但保留了叠加层的对象ID。当打开此操作过的文档时,由于无法显示元数据,因此叠加层被隐藏。由于使用 Incremental Update将元数据添加到签名的PDF被认为是无害的,因此签名保持有效。
  • 变体2——按对象顺序隐藏内容( 交换对象覆盖顺序):在分析过程中发现,对于两个大小相同且在文档中x-y位置相同的不同表单域,仅显示最后一个域。此外,只要内容没有更改,就可以在增量更新中重新声明相同的表单字段。基于这两种观察,攻击者可以建立以下利用。
    1. 注入影子内容: 攻击者将shadow form字段注入到原始未签名文档中,该影子表单字段与要隐藏的内容位于相同的x-y位置,但是他们在原始对象之前声明了它们的表单对象。签名者只能看到原始表单字段,因为它们是在影子字段之后定义的。

    2. 使影子内容可见: 攻击者收到文档后,将附加一个Incremental Update,该Update将复制并粘贴原始字段和影子表单字段。但是,在这种情况下,他们首先放置原始图像,然后放置影子表单字段。结果,显示了影子表单字段及其值,而不是原始字段。由于对象本身并没有修改,只是它们的声明顺序而已,因此增量更新被认为是无害的。

2.2 Replace

该影子攻击类的主要思想是使用直接更改先前声明的对象的增量更新。由于不允许对所有类型的对象进行修改,因此攻击者只能更改认为无害的对象,但仍然可以更改文档的可见内容。例如,字体的(重新)定义不会直接更改内容。但是,它会影响所显示内容的视图并使数字或字符交换成为可能。确定了此攻击类别的两个变体。

  • 变体1——通过重叠替换(保持原值不变并修改叠加层):PDF表单支持不同的输入,例如文本字段,文本区域和单选/选择按钮。表单可以具有默认值,例如预定义的文本。用户可以动态更改这些值并将其存储在PDF文档中。
    在这里插入图片描述该攻击滥用了PDF文本字段的专有属性。一个文本字段可以显示两个不同的值:实际字段值和叠加值,一旦选择了文本字段,该值就会消失。表单字段的实际值包含在名为/V的对象键中。叠加元素的内容在/ BBox对象中定义。/ BBox对象与HTML表单中已知的提示标签具有可比性。例如,提示用户名指示应将用户名输入特定的登录字段。与HTML相比,PDF中的提示和实际值之间没有视觉上的区别,在上图中描述了一个示例攻击。

    攻击步骤:

    1. 注入影子内容: 首先,攻击者创建一个包含交互式表单的转账传票(PDF1),签名者在签署文档之前完成该表单。攻击者使用默认值初始化某些表单元素。在上图提供的示例中,攻击者将前三个表单字段的值/V设置为Attacker和攻击者的IBAN和BIC。其次,攻击者将叠加值(/ BBox)设置为unicef并设置相应的IBAN和BIC。只要签名者不关注准备的值,他们就认为正确的值已经预先填充。
    2. 使影子内容可见: 签名者可以在不更改预填写表单的情况下对PDF进行签名。一旦攻击者收到PDF2,他们就会通过使用不同的值替换存储在/BBox中的叠加层来更新文本字段。/V中存储的值保持不变。由于原始文本字段值未更改,而仅覆盖了更改,因此查看器认为此替换无害。

    攻击结果:
    受害者打开PDF3后,查看器首先验证每个文本字段中/V中存储的值是否已更改,并且是否与已签名的值不同。如果值已更改且与已签名的值不同,则签名验证失败。由于攻击者未更改/V中存储的任何值,因此签名仍然有效。然后,查看器处理每个文本字段对象,并显示/BBox值(如果它映射到已签名的对象)。否则,将显示存储在/V中的值。由于攻击者更改了/BBox的值,因此显示了/V(成为攻击者)的值,并且相应的恶意交易也通过了。结果,签名者和受害者在同一文档中看到不同的内容,这本应该通过数字签名来防止。对于每种攻击变体,都创建一个漏洞利用程序。


  • 变体2——通过覆盖替换( 变换字体):攻击的思想是ISA。因此,供应商实施了一系列被认为是危险的对象,并不允许它们在增量更新中出现。但是,在许多应用程序中,字体被认为是无害的,因此可以在增量更新中定义它们。这种攻击变体被证明是相反的。

    攻击步骤:

    1. 注入影子内容: 攻击者分析与该内容相关的原始文档和馏出物中使用的字体。其次,PDF中通常不包含默认字体,例如Verdana或Times New Roman。在这种情况下,攻击者需要注入字体说明。

    2. 使影子内容可见: 文档签名后,攻击者将添加新的字体描述并覆盖以前的字体描述。新的字体描述完全改变了原始文本的显示方式。例如,创建了一个漏洞利用程序,将原始文本US90 5628 3174 5628 3174的显示方式更改为US01 2345 678923456789。由于新字体的定义被认为是无害的,因此验证签名的应用程序不会警告所做的更改。创建恶意字体描述的流行软件是FontForge.4。

2.3 Hide-and-Replace

在此影子攻击类中,攻击者创建一个影子PDF文档,该文档将发送给签名者。PDF文档包含内容不同的另一个文档的隐藏说明。由于签名者无法检测到隐藏的(恶意)内容,因此他们对文档进行签名。签名后,攻击者将收到文档,并仅附加一个启用了隐藏对象的newXref表和Trailer。确定了此攻击类别的两个变体,两种变体的不同之处在于,攻击者在文档签名后启用隐藏内容的方式不同。对于每种攻击变体,创建了一个漏洞利用程序。
在这里插入图片描述

  • 变体1-更改对象引用( Change Object References):此攻击变体的想法是使用外部参照表将对文档目录(或任何其他隐藏对象)的引用更改为指向影子文档。在上图中,描述了攻击的示例,并将进一步说明。

    攻击步骤:

    1. 注入影子内容: 攻击者创建一个PDF文件,其中包含两个具有相同objectID(例如4 0 obj)但内容不同的对象:“对文档签名以获取奖励!”和“您被解雇了。立即离开”。如上图左侧所示,在Xref表部分中,引用了看似无害的内容。签名者只能看到此内容并签名PDF文件。
    2. 使影子内容可见: 攻击者收到签名的PDF后,将添加一个新的Xref表,并将该引用与具有恶意内容“您被解雇了。立即离开”的对象(例如4 0 obj)交换。还添加了新Trailer。由于在指向区域内包含指向已定义对象的Xreft表被认为是无害的,因此不会对所做的更改发出警告。签名验证成功。但是,受害者看到的内容与签名者看到的内容不同。
  • 变体2-更改对象用法( Change Objects Usage):此攻击变体的想法再次是使用外部参照表。但是,攻击者没有更改对对象的引用,而是指定了哪些对象“正在使用”和哪些对象未被使用(即free)。使用此Xref表功能,攻击者可以修改先前包含的对象的可见性。通过这种方式,攻击者可以隐藏“使用中”的对象并显示free对象。这可以在不更改对象本身的情况下实现。攻击者只接触Xref表,但是可以完全更改已签名文档的表示。

    攻击步骤:

    1. 注入影子内容: 与第一个攻击变体类似,攻击者插入正确引用但在Xref表中标记为未使用的恶意内容。因此,仅原始文档的内容显示给签名者。
    2. 使影子内容可见: 攻击者一旦收到签名的操纵文档,便会附加一个新的Xreft表。新的外部参照表启用了隐藏内容并禁用了原始内容。

3 The concealment of shadow attack

文本选择,粘贴文本或在文档内搜索之类的进一步操作可能会使暴露攻击的隐隐蔽性。对于所有攻击类别,都要求受害者不能以任何方式检测影子内容。因此,集中讨论签名者可能检测到攻击的情况。

  • 对于Hide——通过在叠加层后面搜索特定文本或选择覆盖的内容,可以检测到Hide变体1((Hide via Referenced Object)。关于此限制,覆盖的内容只能是数字或文本区域,使攻击难以检测。考虑到Hide变体2(Hide via Object’s Order),由于可以隐藏先前显示的字段,因此对于表单域完全隐藏了攻击。
  • 对于Replace——关于Replace 变体1(Replace via Overlay),只有在表单字段是可编辑的并且用户单击该字段时,才能检测到攻击。值得注意的是,攻击者定义了表单字段的功能,并且始终可以停用可编辑性。可以通过搜索原始内容或将操作内容复制粘贴来检测Replace变体2(Replace via Object’s Order),复制的文本包含原始值。
  • 对于Hide and Replace——类对签名者完全隐藏。从签名者的角度来看,不可能检测到影子内容。攻击的变体2仅限于形成区域,因为许多查看器认为其隐藏是无害的。

4 prevention

可以通过使用坐标计算两个对象的碰撞来识别覆盖文本框的图像。创建PDF文档时,图像和文本框略有重叠并不罕见。因此,碰撞计算应以百分比计算覆盖值。值越低,对象所覆盖的内容就越少。
对于Replace类别,无法合理地执行预防阶段。第一步“注入影子内容”与良性注入是无法区分的。例如,在创建PDF文档时插入多种字体并不是一种常见的恶意行为。
对于Hide-and-Replace类别,这根本不适用。在此,由于影子文档路径包含在文档中,因此可以检测到第一步。认识到这一点的一种有前途的方法是将对Kids对象的引用交换为allPages对象。随后,将新创建的PDF文档的所有正确引用的对象与源文档进行比较。在未处理的PDF文档中,仅交换所包含页面的位置。假设PDF文档包含Hide-and-Replace类别的影子内容。在这种情况下,攻击者可以通过引用它在第二步中使其可见。因此,可以识别它。


5 Detection

虽然在预防阶段应发现有效(隐藏)影子内容,但有效(可见)影子内容是检测阶段的重点。在实践中,这意味着攻击者创建了一个影子文件,签名者对其进行了签名。然后,攻击者使影子内容可见。为了检测Hide,Hide-and-Replace以及Replace 类的overlay变体,PDF-Detector可以比较当前文件签名之前的文件。这种比较可以从技术上通过删除第一个签名后的所有数据(即所有增量更新)来实现。在Hide攻击的第二步中,两个文件之间的差异会变得很明显,因为签名文件中没有对象,例如,一个隐藏的图像对象。相反,在Hide-and-Replace的第二步中,与未签名的文档相比,攻击者提供了不同的总体内容。在Font变体中检测替换攻击并不那么复杂。为此,在签名添加的FontFile对象后扫描更新并将它们的对象编号与已经包含的FontFiles比较就足够了。


6 Shdow Attack:Beyond Signature Bypass

PDF中的高特权动作:PDF规范基本上定义了两种代码执行**(CE)-PDF动作和JavaScript**。动作的功能受到限制。URL调用是常见的操作示例,相比之下,JavaScript提供了巨大的功能集,包括控件结构(例如if,while)。出于安全原因,CE的两种类型均受PDF限制。例如,URL调用需要用户确认,并且对其他文档和文件的访问被阻止。

在研究中,确定两个CE变体都可以特权模式运行。此模式允许执行对安全性要求较高的操作,而无需任何限制或用户同意。例如,特权JavaScript可以更改查看器应用程序菜单项的UI和功能。它可以读取其他打开的PDF选项卡的内容,甚至可以读取存储在机器上的文件的内容。它也可以在没有任何确认的情况下调用URL。通常,如果没有用户确认或在PDF查看器中进行配置更改,则不允许PDF执行特权JavaScript或操作。

使用数字签名的PDF(更具体的认证PDF)是一种例外。Adobe Products用户可以将使用特定证书签名的PDF配置为具有执行高特权操作的权限。默认情况下,对于大多数预配置的CA和所有手动信任的证书,此设置是禁用的。在Adobe产品中发现了一个例外:如果已知证书的私钥,则自动允许使用此特定证书签名的PDF文档执行高特权代码。

攻击说明

简化的攻击者模型创建新的攻击。假设签名者和受害者是同一实体。此外,攻击者无需在PDF文档签名后对其进行操作。注意攻击者执行的唯一步骤是创建PDF1并将高特权代码嵌入其中。PDF1签名后,高特权代码将在签名者的计算机上自动执行。

攻击步骤:

  1. 攻击者生成包含恶意,高特权代码的PDF,例如,使用特权JavaScript读取对其他PDFtab的访问权限。该代码存储在特定的执行事件上,该事件将在签名文档后触发,例如,在willCloseevent期间,或在签名后触发的任何其他事件(例如willSave,didSave)。
  2. 将PDF发送给签名者。他们在文件上签名。
  3. 签名后,受害者保存并关闭PDF。
  4. 关闭文档会触发willClose事件,并执行PDF中的恶意代码。
  5. 通常,不执行特权JavaScript,因为未授予特权JavaScript的特殊权限。但是,应用程序认为用于签名PDF的证书的私钥是已知的。这错误地说服了应用程序执行特权JavaScript –应用程序认为签名者打算执行脚本,因为他们对脚本进行了签名。此攻击仅限于Adobe产品,因为它们定义了有关CE的特殊策略,并且与未签名的PDF区别对待。

7 攻击结果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值