解法
经典的拒绝服务压缩包是递归压缩炸弹:42.zip 嵌套六层压缩文件,只有当解压器持续解压嵌套压缩包时,才能达到 4.5 PB。大多数实际解析器只解压一次,因此顶层仅释放 0.6 MB,扫描器通过限制递归深度和解压大小来防御。这种攻击的形态像一棵树。
David Fifield 的突破在于去除了递归。他压缩一个重复字节的内核,然后将数万个中央目录条目指向该字节的重叠范围,并在 DEFLATE 非压缩块中引用每个局部文件头,使普通解析器仍能看到独立、格式良好的文件。内核的每个字节在每次解压文件中都被解压一次,因此输出量随输入量呈二次方增长,炸弹在一次解压中引爆。
其数据量超过了所有早期构造:在 42,374 字节(即 42.zip 的外层大小)时,压缩包扩展至 5.5 GB(压缩比 129,000);10 MB 版本扩展至 281 TB,压缩比超过 2800 万,达到 zip 格式理论最大值的 99.97%;使用 Zip64 扩展时,46 MB 扩展至 4.5 PB。USENIX 接受该论文并授予 WOOT 2019 最佳论文奖。
该压缩包的发布成为对行业防御体系的实战测试。VirusTotal 对 10 MB 样本的扫描在许多引擎中超时;ClamAV 消耗大量 CPU,直到检测补丁发布后又更新;Mark Adler 为 UnZip 编写了重叠文件检测器,Debian 采用,SUSE 拒绝(CVE-2019-13232);Chromium 增加了对异常压缩比的度量;Apple 在 iOS 14 中缓解了 iOS Quick Look 缓存耗尽问题。
What it achieved
将多个文件重叠在同一个压缩数据核上,使每个存储字节扩展 N 次
为什么有效
它攻击了标准防御背后的假设:扫描器限制递归深度,因此能在一次解压中完全爆炸的炸弹看起来普通,直到磁盘被写满。
重叠使得压缩比超线性增长,因为每个存储字节都贡献给每个输出文件,所以压缩包越大越危险,而不是像分层结构那样增加固定倍数。
通过匹配文件名、正确的 CRC 和纯 DEFLATE 实现了兼容性,因此演示在 Info-ZIP、Python、Go 和 Android 解析器上运行,而非仅在特殊场景下。
Fifield 提供了可用样本,并同时提供了攻击与修复方案(重叠检测和解析器沙箱),使这一发现转化为厂商可采纳的补丁。
可以借鉴什么
当防御者针对一种攻击形态打补丁时,改变形态:重叠文件使递归变得可选,深度限制失效。应在解析器内限制时间和磁盘,而非枚举签名。
后续
Mark Adler 的重叠检测器集成到 UnZip 和 Debian,ClamAV 先检查相邻对,后限制时间,D 语言的 std.zip 学会了拒绝重叠,Chromium 增加了异常压缩比度量,Apple 在 iOS 14 中缓解了 iOS 12/13 的 Quick Look 耗尽问题。VirusTotal 扫描记录了引擎超时情况,杀毒软件厂商在 2019 年持续更新检测。从 2019 年 7 月下旬至 8 月中旬,Google 安全浏览标记了 bamsoftware.com,短暂破坏了 Tor 的 Snowflake 代理,Xfinity 在 2019 年 11 月屏蔽了该页面。Fifield 在 USENIX WOOT 2019 上获得最佳论文奖。
从这里,追溯依据
参考来源
- A better zip bomb bamsoftware.com
- A better zip bomb (Best Paper), USENIX WOOT 19 usenix.org
- A better zip bomb — Hacker News discussion news.ycombinator.com