我怎样才能保护自己免受拉链炸弹袭击?

fly*_*ire 51 python java compression security zip

我刚看过拉链炸弹,即包含大量高度可压缩数据(00000000000000000 ...)的zip文件.

打开时,它们会填满服务器的磁盘.

解压缩之前,如何检测zip文件是拉链炸弹?

更新你能告诉我在Python或Java中是如何完成的?

Nic*_*kis 22

在Python中试试这个:

import zipfile
z = zipfile.ZipFile('c:/a_zip_file')
print 'total files size=', sum(e.file_size for e in z.infolist())
z.close()
Run Code Online (Sandbox Code Playgroud)

  • 最着名的拉链炸弹将通过这个测试,因为第一级不是很大.您还需要检查ZIP深度(ZIP内的ZIP). (13认同)
  • 至少使用gzip我认为未压缩的大小可能不在标题中(因此它可能适用于zip,但不适用于.tar.gz) (5认同)
  • IIRC,Zip标准(让我们面对它,如果你想引起DoS,你必须遵循标准)允许从中央目录和条目标题中省略某些大小. (4认同)
  • 这在多层拉链炸弹上根本不起作用 (4认同)
  • 标题是"防篡改"吗? (3认同)
  • @ZZ Coder,嗯,确实如此。Tom Hawtin - 如果您一次解压所有级别,tackline 的解决方案会更好。 (2认同)
  • @Kevin,你问解压缩程序是否确实验证了"大小"属性?好点子.如果没有,那么上面的代码当然可以"失败". (2认同)

Tom*_*ine 19

Zip是一种"有趣"的格式.一个强大的解决方案是将数据流出,并在您有足够的时间后停止.在Java中,使用ZipInputStream而不是ZipFile.后者还要求您将数据存储在临时文件中,这也不是最好的想法.


Mic*_*mlk 11

阅读维基百科上的描述 -

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


Vla*_*sny 5

首先检查一个zip标题:)

  • 查看Nick Dandoulakis的回答中的评论 (2认同)

Pet*_*ham 5

不允许上传过程写入足够的数据来填满磁盘,即解决问题,而不仅仅是问题的一个可能原因.