Hacker News 中文摘要

RSS订阅

探索gzip炸弹与邮件客户端的趣味之旅 -- Fun with gzip bombs and email clients

文章摘要

Gzip炸弹是一种压缩文件,解压后会膨胀至极大体积,如10MB文件解压为10GB。通过配置Nginx将其伪装为图片,HTTP客户端会尝试解压,导致处理大量数据。Firefox能识别并避免解压,而Thunderbird和Gmail的代理在获取图片时会提前终止,避免处理完整数据。

文章总结

标题:Gzip炸弹与邮件客户端的趣味实验

Gzip/Zip炸弹已经存在了几十年。我们可以创建一个10MB的Gzip文件,解压后达到10GB:

bash dd if=/dev/zero bs=1G count=10 | gzip > 10gb.gz

这种文件被称为Gzip炸弹,因为解压后其大小会急剧膨胀(约1000倍)。将其放入网站根目录,并配置Nginx将其作为图片提供,并设置gzip内容编码:

nginx location /10gb.png { default_type image/png; add_header Content-Encoding gzip; try_files /10gb.gz =404; }

当HTTP客户端获取该文件时,会看到内容编码为gzip,通常会尝试即时解压,这意味着你只通过网络发送了10MB的数据,但客户端却要处理10GB的数据。

Firefox对此似乎没有问题,它很快识别出这不是图片,并且不会存储解压后的数据。

邮件客户端的表现如何呢?一些邮件服务使用代理来隐藏发件人的IP。发送包含以下内容的HTML邮件:

html <img src="https://YOUR_WEBSITE/10gb.png">

ThunderbirdGmail的代理会开始获取图片,但在完成10MB下载之前就放弃了。不清楚是因为它们识别出这不是图片,还是因为解压时达到了限制。

ProtonmailiCloud的代理会下载完整的10MB文件,但会丢弃它。Protonmail会警告图片加载失败,并允许你直接从浏览器加载(不使用代理)。如果选择直接加载,会泄露IP,但浏览器不会崩溃。

Fastmail的代理下载了完整的10MB文件,并发送了385MB数据后才放弃。界面保持响应,虽然它们应该更早放弃,但至少还能工作。

iOS Mail部分下载文件后崩溃。虽然体验不佳,但并非世界末日,重新登录后可以删除邮件。

Evolution Mail对此毫无防御。它下载了完整的10MB文件,并完全解压到其缓存目录中。发送包含多个图片链接的邮件后,Evolution Mail在不到一分钟内向我的笔记本电脑磁盘添加了100GB的数据。

从外部服务获取数据时,编写防御性代码总是一个好主意。始终假设某些聪明人会让你接收不合理的大量数据。

在测试中,我还注意到Evolution Mail的一个奇怪行为:它使用URL的MD5值作为缓存文件名。但如果查询字符串不符合其有限的格式,它会从MD5计算中移除查询字符串。因此,以下两个URL在Evolution Mail的缓存中被视为相同:

因此,如果你收到一封包含第一个URL的邮件,然后收到另一封包含第二个URL的邮件,第二封邮件会显示第一封邮件的缓存图片。

提示:你可以通过RSS或Mastodon关注我的博客,更多内容请访问博客索引

评论总结

  1. Zip炸弹的潜在威胁:评论1和评论2讨论了Zip炸弹的潜在威胁,特别是如何通过递归解压缩导致系统资源耗尽。评论1提到:“一个小文件解压缩后可能占用几倍于整个硬盘空间”,评论2则探讨了是否可以将Zip炸弹与图像格式结合:“JPEG和其他有损压缩图像可能允许这种情况,但取决于gzip和图像格式的兼容性。”

  2. 邮件客户端的漏洞:评论3和评论5关注邮件客户端在处理压缩文件时的潜在漏洞。评论3指出:“Evolution邮件缓存行为非常可疑,可能被用于特定场景下的攻击”,评论5则询问:“Claws Mail/Sylpheed如何处理这种情况?”

  3. 防止Zip炸弹的简单性:评论4认为防止Zip炸弹是相对简单的:“防止Zip炸弹不是很简单吗?”

  4. 远程下载的风险:评论6强调了电子邮件中远程下载的风险:“这是另一个防止电子邮件从远程服务器下载内容的理由。”

  5. AI系统的潜在风险:评论7讨论了AI系统在处理压缩文件时的潜在风险:“我最近在想,具有在线RAG功能的AI是否有足够的Zip炸弹保护措施,特别是当Perplexity下载并分析电子表格内容时。”