我该如何保护自己免受zip炸弹攻击?

58

我刚读到关于zip炸弹的内容,即包含大量高度可压缩数据(00000000000000000...)的zip文件。

一旦解压缩,它们会填满服务器硬盘。

如何在解压缩前检测zip文件是否为zip炸弹?

更新 你能告诉我这在Python或Java中如何实现吗?


1
压缩比可以达到 1000:1 这样的比例 - 不仅会占用大量磁盘空间,还需要很长时间才能写出输出结果。 - sharptooth
1
关于gzip和bzip2的相关问题 - Joachim Breitner
7个回答

27

在Python中尝试这个:

import zipfile

with zipfile.ZipFile('a_file.zip') as z
    print(f'total files size={sum(e.file_size for e in z.infolist())}')

7
至少在gzip中,我认为未压缩的大小可能不在头文件中(因此它可能适用于zip,但不适用于.tar.gz)。 - tonfa
4
据我所知,Zip标准(让我们面对现实,如果你想造成DoS,你必须遵循标准)允许从中央目录和条目头省略某些大小。 - Tom Hawtin - tackline
21
最著名的压缩炸弹将通过这个测试,因为第一层并不是很大。你还需要检查 ZIP 的深度(即 ZIP 内部的 ZIP)。 - ZZ Coder
2
@ZZ Coder,嗯,那是真的。Tom Hawtin - tackline的解决方案更好,如果您一次解压所有级别。 - Nick Dandoulakis
2
@Kevin,你问解压过程是否实际上验证“size”属性?好问题。如果没有,那么上面的代码当然可能会“失败”。 - Nick Dandoulakis
显示剩余5条评论

25

ZIP 是一种“有趣”的格式。一个可靠的解决方案是将数据流输出,并在需要时停止。在 Java 中,使用 ZipInputStream 而不是 ZipFile。后者还需要你将数据存储在临时文件中,这也不是最好的想法。


这可能有点老了,但仍然存在疑问:为什么读取文件或输入流会有所区别?据我理解,你可以使用迭代的方式读取两种类型的数据,当读取到一定数量的字节或达到一定次数时停止。 - Asger Skov Velling
1
@AsgerSkovVelling 这是相当老的东西。ZipFile 要求您下载整个文件才能读取位于末尾的目录。(Zip 的设计是用于存档而不是检索。文件可以被流式传输,然后在所有索引都已知的情况下,写入目录。)也许最糟糕的问题是您需要一次性拥有整个归档文件。还有一个额外的检查,您需要确保整个压缩文件不会太大。此外,如果您读取目录,则可能会指示您重复读取相同的文件数据。文件甚至可能重叠。 - Tom Hawtin - tackline
1
@AsgerSkovVelling 噢,还有Gifar的问题,它跟随IE和Flash中的一系列漏洞而来。如果您浏览目录,文件的前面可能是其他内容。ZipInputStream将检查本地头的魔数以确定文件的开头。https://en.wikipedia.org/wiki/Gifar - Tom Hawtin - tackline

13

阅读维基百科上的描述 -

拒绝包含压缩文件的压缩文件。
     使用ZipFile.entries()来检索文件列表,然后使用ZipEntry.getName()查找文件扩展名。
拒绝包含超过设定大小或者在启动时无法确定大小的文件的压缩文件。
     在遍历文件时,使用ZipEntry.getSize()来检索文件大小。


1
getSize 是个骗子。目录中声称的大小、本地头文件中的大小以及实际解压缩时的大小都不同。此外,我不知道哪些文件类型被压缩了(图片?),通常文件会在压缩链接上发送(HTTP 经常使用 gzip 压缩)。 - Tom Hawtin - tackline

6

不要让上传过程写入足够的数据来填满磁盘,即解决问题,而不仅仅是问题可能的原因之一。


5

首先检查Zip文件头部 :)


4
请查看Nick Dandoulakis的回答中的评论。 - n611x007

4

如果您使用的ZIP解压缩程序可以提供原始和压缩大小的数据,则可以使用该数据。否则,请开始解压缩并监视输出大小 - 如果增长过快,请将其切断。


1

请确保您不要使用系统驱动器作为临时存储。如果病毒扫描程序遇到它,我不确定它是否会检查它。

此外,您可以查看压缩文件中的信息并检索内容列表。如何执行此操作取决于用于提取文件的实用程序,因此您需要在此处提供更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接