【发布时间】: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