一种更好的 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 -->|反向指针| C

Zip 文件结构

2. 关键组件

  • 中央目录头: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

引用重叠结构

工作原理

  1. DEFLATE 流包含压缩块和非压缩块
  2. 非压缩块以 5 字节头部开始,指示"原样输出接下来的 n 个字节"
  3. 将后续本地文件头作为非压缩块数据,使其既作为代码结构又作为文件内容

四、技术优化

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.zip42 kB5.5 GB129,000 倍
zblg.zip10 MB281 TB28,000,000 倍
zbxl.zip46 MB4.5 PB98,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 域名事件

九、参考资料


参考资料

  1. A better zip bomb - David Fifield
  2. Zip bomb - Wikipedia
  3. DEFLATE - RFC 1951
  4. APPNOTE.TXT - ZIP File Format Specification
最后修改:2026 年 01 月 16 日
如果觉得我的文章对你有用,请随意赞赏