Loading... # 一种更好的 Zip 炸弹非递归压缩攻击技术分析 # 一、技术概述 ## 1. 研究背景 Zip 炸弹是一种恶意压缩文件,通过高度压缩技术在小体积文件中隐藏巨大数量的解压数据,导致解压程序耗尽系统资源。传统的 zip 炸弹依赖递归解压,即多层嵌套 zip 文件,但大多数现代解压程序并不支持递归解压。 ## 2. 核心创新 David Fifield 于 2019 年提出了一种非递归 zip 炸弹构造方法,通过在 zip 容器内重叠文件实现超高压缩比。该方法仅需一次解压轮次即可完全展开,压缩比可达 2800 万倍(10 MB 压缩文件可解压出 281 TB 数据)。 ## 3. 技术意义 该技术揭示了 zip 格式规范和实现中的安全漏洞,展示了格式歧义性可能被滥用的方式。研究对文件解析器设计和安全防护具有重要参考价值。 # 二、Zip 文件结构分析 ## 1. 基本组成 Zip 文件由中央目录和文件条目组成: ```mermaid 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 ```  ## 2. 关键组件 - 中央目录头:46 字节 + 文件名长度,包含文件元数据和向后指针 - 本地文件头:30 字节 + 文件名长度,包含压缩/解压大小信息 - 文件数据:使用 DEFLATE 算法压缩的实际数据 # 三、核心攻击技术 ## 1. 第一个洞察:文件重叠 通过让多个中央目录头指向同一个本地文件头,实现数据内核的重复利用: ```mermaid 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 非压缩块来"引用"后续的本地文件头: ```mermaid 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.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 域名事件 # 九、参考资料 *** ## 参考资料 1. [A better zip bomb - David Fifield](https://www.bamsoftware.com/hacks/zipbomb/) 2. [Zip bomb - Wikipedia](https://en.wikipedia.org/wiki/Zip_bomb) 3. [DEFLATE - RFC 1951](https://tools.ietf.org/html/rfc1951) 4. [APPNOTE.TXT - ZIP File Format Specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) 最后修改:2026 年 01 月 16 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏