java - 如何使用 Java 10 检测 zip-bomb

标签 java security zip apache-poi

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

在 Java 9 之前,它可以通过反射使用一些变通方法将计数输入流注入(inject) ZipFile/ZipEntry 以检测扩展数据中的爆炸,并通过这种方式防止压缩炸弹。

但是在 Java 10 中,这不再是可能的,因为 ZipFile 的实现以防止这种情况发生的方式发生了变化(在 ZipFile 中硬转换为 ZipFile$ZipFileInputStream)。

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

有没有一种方法可以在不诉诸反射的情况下以不同的方式进行 zip-bomb-detection?

最佳答案

经过一些调查,我们使用了 Apache commons-compress 的 zip 功能,它允许执行这种检查而无需诉诸反射,因此我们现在可以使用任何版本的 Java 进行这些检查。

https://github.com/apache/poi/tree/trunk/src/ooxml/java/org/apache/poi/openxml4j/util对于 Apache POI 中的最终实现,尤其是 ZipArchiveThresholdInputStream

关于java - 如何使用 Java 10 检测 zip-bomb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585900/

相关文章:

c# - 在 C# 中比较 zip 文件以进行集成测试

java - 在哪里可以了解 Java 中的文本压缩?

java - 如果未输入任何内容,则应用崩溃

java - 如何在 JBoss 7 下为 war 指定安全域?

swift - SecIdentity + Force Cast 违规 : Force casts should be avoided. (force_cast)

linux - 验证 NAT 后面的设备公共(public) IP 地址的可靠(加密)方式

hadoop - ZlibDecompressor引发不正确的 header 检查异常

java - 如何在 JPasswordField 中启用剪切、复制?

java - GWT 中的 JOptionPane.showInputDialog()

java - Android登录远程MySQL数据库鉴权