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

cen*_*tic 9 java security zip apache-poi

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

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

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

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

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

cen*_*tic 4

经过一番调查后,我们使用了 Apache commons-compress 中的 zip 功能,它允许执行此类检查而无需求助于反射,因此我们现在可以使用任何版本的 Java 来执行这些检查。

有关Apache POI 中的最终实现,尤其是ZipArchiveThresholdInputStream.