【问题标题】:How to detect a zip-bomb with Java 10如何使用 Java 10 检测拉链炸弹
【发布时间】:2018-03-31 08:38:11
【问题描述】:

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

在 Java 9 之前,它可以通过反射使用一些变通方法将 count-InputStream 注入 ZipFile/ZipEntry 以检测扩展数据的爆炸,从而防止 zip-bombs。

但是在 Java 10 中,这不再可能,因为 ZipFile 的实现被更改为防止这种情况发生(在 ZipFile 中硬转换为 ZipFile$ZipFileInputStream)。

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

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

【问题讨论】:

  • 为什么不使用ZipInputStream预先检查文件将文件提供给POI?
  • 您确定“zip-bomb-detection”将成为您 (apache poi's) 的任务吗?我相信大多数用户对此感到满意,并将MinInflateRatio 设置为一个值,使您的整个“zip-bomb-detection”工作受阻。所以,在我看来,这是不必要的努力。
  • @AxelRichter,是的,我们希望“默认安全”,否则如果公司未能启用此类检查,开源软件始终是第一个受到指责的人。我认为 Apache POI 只有几个相关问题,如果不需要,很容易禁用检查。
  • @Andreas,我想在这里修复 Apache POI 本身,所以如果其他人有类似的要求并且已经以某种巧妙的方式解决了这个问题,我很感兴趣。
  • 您是否查看过其他 zip 库?自己做似乎比依赖 Sun/Oracle 提供的功能的内部特性更好的选择。快速搜索发现an Apache library(哈哈,就在你身边)。为什么不使用/改进它?

标签: java security zip apache-poi


【解决方案1】:

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

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

【讨论】:

  • 太棒了!有链接吗?
【解决方案2】:

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

如果你有一个文件(或者可以先保存到一个文件),那么你可以在将它交给易受攻击的库之前先检查 zip 文件条目的大小(甚至不解压缩)。即使您需要传递一个 zipfie,您也可以将 zipfile 类扩展为代理调用。

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

【讨论】:

  • 读取/解压缩内置在大型库的核心中,因此如果有 InputStream 进入,则不容易简单地处理文件。如果您必须打开/扫描文件,也会影响性能多次。然而,我们同时将 zip-functoinality 切换为 commons-compress,这允许在所有 Java 版本上很好地做到这一点。在重写方法上,您显然没有查看 Java 10 中的实际更改,因为据我所知,它们会积极阻止您这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多