一种更好的 Zip 炸弹非递归压缩攻击技术分析
一、技术概述
1. 研究背景
Zip 炸弹是一种恶意压缩文件,通过高度压缩技术在小体积文件中隐藏巨大数量的解压数据,导致解压程序耗尽系统资源。传统的 zip 炸弹依赖递归解压,即多层嵌套 zip 文件,但大多数现代解压程序并不支持递归解压。
2. 核心创新
David Fifield 于 2019 年提出了一种非递归 zip 炸弹构造方法,通过在 zip 容器内重叠文件实现超高压缩比。该方法仅需一次解压轮次即可完全展开,压缩比可达 2800 万倍(10 MB 压缩文件可解压出 281 TB 数据)。
3. 技术意义
该技术揭示了 zip 格式规范和实现中的安全漏洞,展示了格式歧义性可能被滥用的方式。研究对文件解析器设计和安全防护具有重要参考价值。
二、Zip 文件结构分析
1. 基本组成
Zip 文件由中央目录和文件条目组成:
graph TB
subgraph Zip文件结构
A[Local File Headers] --> B[File Data]
B --> C[More Files...]
C --> D[Central Directory]
D --> E[End of Central Directory Record]
end
D -->|反向指针| A
D -->|反向指针| C2. 关键组件
- 中央目录头:46 字节 + 文件名长度,包含文件元数据和向后指针
- 本地文件头:30 字节 + 文件名长度,包含压缩/解压大小信息
- 文件数据:使用 DEFLATE 算法压缩的实际数据
三、核心攻击技术
1. 第一个洞察:文件重叠
通过让多个中央目录头指向同一个本地文件头,实现数据内核的重复利用:
graph LR
subgraph 重叠文件结构
CDH1[Central Directory Header 1]
CDH2[Central Directory Header 2]
CDHN[Central Directory Header N]
LFH[Single Local File Header]
KD[Compressed Kernel Data]
end
CDH1 -->|指向| LFH
CDH2 -->|指向| LFH
CDHN -->|指向| LFH
LFH --> KD压缩比分析:
- 首个文件引用:内核大小 + 头部开销
- 后续文件引用:仅需 47 字节(中央目录头)
- 压缩比接近 1,000,000 / 47 ≈ 21,277
2. 第二个洞察:引用本地文件头
为解决文件名不匹配问题,使用 DEFLATE 非压缩块来"引用"后续的本地文件头:
graph TD
subgraph 引用重叠结构
CDH1[CDH File A] --> LFH1[LFH File A]
CDH2[CDH File B] --> LFH2[LFH File B]
CDHN[CDH File Z] --> LFHN[LFH File Z]
LFH1 --> QB1[Quote Block]
QB1 --> LFH2
LFH2 --> QB2[Quote Block]
QB2 --> LFH3
LFHN --> KD[Kernel Data]
end工作原理:
- DEFLATE 流包含压缩块和非压缩块
- 非压缩块以 5 字节头部开始,指示"原样输出接下来的 n 个字节"
- 将后续本地文件头作为非压缩块数据,使其既作为代码结构又作为文件内容
四、技术优化
1. 内核压缩优化
使用自定义 DEFLATE 压缩器 bulk_deflate:
- 专门针对重复字节字符串优化
- 压缩比比 zlib 高约 26 kB,比 Zopfli 高约 15 kB
- 仅支持特定长度:517 + 258^k(k ≥ 0)
2. 文件名优化
为兼容性考虑,使用 36 字符集(0-9,A-Z)生成文件名:
- 避免 CP 437 和 UTF-8 编码差异
- 跳过文件系统特殊字符
- 最长文件名放在最后(因其被引用次数最多)
3. 内核大小优化
数学模型表明最优分配约为:
- 内核大小 ≈ 文件大小 / 2
- 文件头部开销 ≈ 文件大小 / 2
- 输出大小随输入大小二次增长
4. 格式限制利用
Zip 格式限制:
- 最大文件数:2^16 - 1(兼容性考虑为 2^16 - 2)
- 最大解压文件大小:2^32 - 1 字节(兼容性考虑为 2^32 - 2)
在限制下达到的最大压缩比:2800 万倍
五、实际攻击样本
| 样本文件 | 压缩大小 | 解压大小 | 压缩比 |
|---|---|---|---|
| zbsm.zip | 42 kB | 5.5 GB | 129,000 倍 |
| zblg.zip | 10 MB | 281 TB | 28,000,000 倍 |
| zbxl.zip | 46 MB | 4.5 PB | 98,000,000 倍(Zip64,兼容性较差) |
与传统 42.zip 对比(42,374 字节):
- 递归解压:4.5 PB(1060 亿倍压缩比)
- 单层解压:0.6 MB
- 非递归技术:5.46 GB(12.9 万倍压缩比)
六、安全影响分析
1. 攻击面
- 文件扫描器可能因内存耗尽而崩溃
- 邮件网关可能被绕过
- 自动化解压系统可能遭受拒绝服务攻击
2. 兼容性
该技术在大多数 zip 解析器上有效,但流式解析器(一次性解析而不参考中央目录)不受影响。
3. 防护建议
- 实施解压大小限制
- 检测文件重叠异常
- 使用流式解析器
- 限制单个 zip 文件中的文件数量
七、技术细节深度解析
1. CRC-32 高效计算
使用矩阵变换表示 CRC-32 计算:
- 将位操作建模为线性变换
- 使用 33×33 矩阵表示仿射变换
- 利用齐次坐标表示平移
- 通过矩阵幂运算快速计算重复字节的校验和
2. DEFLATE 非压缩块利用
标准 DEFLATE 压缩比限制为 1032,但通过构造特殊的数据流:
- 混合压缩块和非压缩块
- 让文件头同时作为结构和内容
- 突破单层压缩的限制
八、实施时间线
该研究历经多次更新:
- 2019-07-02:初始发布
- 2019-07-03 至 2019-08-22:多次技术修正
- 2019-10-14 至 2021-07-29:持续优化
- 2023-05-18:记录 42.zip 域名事件