如何使用Java 10检测拉链炸弹

时间:2018-03-31 08:38:11

标签: java security zip apache-poi

Apache POI定期打开zip文件,因为Microsoft Excel / Word / ...文件是较新格式的zip文件。为了防止某些类型的拒绝服务攻击,它在打开Zip文件时不具有扩展大量扩展的文件的功能,因此可以通过提供一个小的恶意文件来淹没主内存未压缩到内存中。 Apache POI称这种拉链炸弹保护。

在Java 9之前,它可以通过反射使用一些解决方法将计数InputStream注入ZipFile / ZipEntry以检测扩展数据中的爆炸,这样就可以防止拉链炸弹。

然而,在Java 10中,这是不可能的,因为ZipFile的实现以一种阻止这种方式的方式改变了(在ZipFile中硬编译为ZipFile $ ZipFileInputStream)。

因此,我们正在寻找一种不同的方法来计算提取过程中提取的字节数,以便在压缩率达到某个限制时立即停止。

有没有办法在不诉诸反射的情况下以不同方式进行拉链炸弹检测?

2 个答案:

答案 0 :(得分:0)

我无法想象您为什么首先需要反射/注入hack。您似乎传递的不是文件名,而是zipfile或zipinputstream之类的实例。

如果您有文件(或可以先保存到文件),则可以先检查zip文件条目的大小(甚至不解压缩),然后再将其交给易受攻击的库。即使您需要传递zipfie,也可以将zipfile类扩展为代理调用。

如果您具有zip流,但实际上无法将其临时保存到磁盘,并且必须以某种方式作为zipinputstream读取,则覆盖zipinputstream的方法(getnextentry,read等)。

答案 1 :(得分:0)

经过一番调查,我们使用了来自Apache commons-compress的zip功能,该功能无需执行反射即可执行这种检查,因此我们现在可以使用任何版本的Java进行这些检查。