How to detect a zip-bomb with Java 10
Apache POI定期打开zip文件,因为Microsoft Excel / Word / ...文件是较新格式的zip文件。为了防止某些类型的拒绝服务攻击,它在打开Zip文件时不具有扩展大量扩展的文件的功能,因此可以通过提供一个小的恶意文件来淹没主内存未压缩到内存中。 Apache POI称这种zip-bomb保护。
在Java 9之前,它可以通过反射使用一些解决方法将计数InputStream注入ZipFile / ZipEntry以检测扩展数据中的爆炸,这样就可以防止压缩炸弹。
但是在Java 10中,这是不可能的,因为ZipFile的实现以一种阻止这种方式的方式改变了(在ZipFile中硬编译为ZipFile $ ZipFileInputStream)。
因此,我们正在寻找一种不同的方法来计算提取期间提取的字节数,以便在压缩率达到某个限制时能够立即停止。
有没有办法在不诉诸反射的情况下以不同的方式进行拉链炸弹检测?
经过一些调查后,我们使用了Apache commons-compress的zip功能,它允许执行这种检查而无需借助反射,因此我们现在可以使用任何版本的Java进行这些检查。
我无法想象为什么你首先需要反射/注入黑客。 你似乎传递的不是文件名,而是像zipfile或zipinputstream这样的实例。
如果您有一个文件(或者可以先保存到文件中),那么您可以先将zip文件条目大小(甚至不解压缩)检查,然后再将其传递给易受攻击的库。 即使您需要传递zipfie,也可以将zipfile类扩展为代理调用。
如果你有zip流并且真的无法临时保存到磁盘并且必须以某种方式读取为zipinputstream,那么覆盖zipinputstream的方法(getnextentry,read等)。