hutool 解压缩读取源文件和压缩文件大小失败导致报错

news2024/9/22 2:46:53

前言

最近处理老项目中的问题,升级安全jar,发现hutool的jar在解压缩的时候报错了,实际上是很简单的防御zip炸弹攻击的手段,但是却因为hutool的工具包取文件大小有bug,造成了解压缩不能用,报错:invalid sizes: compressed -1, uncompressed -1,理论上使用这个API的所有方法都有问题。影响范围hutool 5.8.11~5.8.16,5.8.17修复。

Exception in thread "main" cn.hutool.core.exceptions.UtilException: Zip bomb attack detected, invalid sizes: compressed -1, uncompressed -1, name /Users/huahua/Downloads/zip-demo/1.exe
	at cn.hutool.core.compress.ZipReader.checkZipBomb(ZipReader.java:247)
	at cn.hutool.core.compress.ZipReader.readFromStream(ZipReader.java:224)
	at cn.hutool.core.compress.ZipReader.read(ZipReader.java:188)
	at cn.hutool.core.compress.ZipReader.readTo(ZipReader.java:148)
	at cn.hutool.core.compress.ZipReader.readTo(ZipReader.java:135)
	at cn.hutool.core.util.ZipUtil.unzip(ZipUtil.java:665)
	at cn.hutool.core.util.ZipUtil.unzip(ZipUtil.java:650)

demo准备

构建一个demo吧:JDK8+hutool 5.8.16

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("/Users/huahua/Downloads/zip-demo/1.exe");
        File zipFile = new File("/Users/huahua/Downloads/zip-demo/zip-demo.zip");
        ZipUtil.zip(zipFile, "/Users/huahua/Downloads/zip-demo/1.exe", new FileInputStream(file));

        ZipUtil.unzip(new FileInputStream(zipFile), new File("/Users/huahua/Downloads/zip-demo/2.exe"), null);

        System.out.println("Hello world!");
    }
}

没考虑流关闭问题,实际生产中使用try with resource即可

运行报错invalid sizes: compressed -1, uncompressed -1,这里的-1是文件大小,明显是取值不对

但是使用文件方式,确可以成功

从而确定是通过流的方式取文件大小是有问题的。 

原因

hutool实际上在5.8.10之前是没有检验zip炸弹的,从安全漏洞网站,可以看到出现:Hutool资源消耗漏洞 CVE-2022-4565Hutool资源消耗漏洞 CVE-2022-4565 - FreeBuf网络安全行业门户

为了解决这个漏洞,实际上就说zip炸弹攻击会消耗很多CPU资源,因为解压缩后要写文件,要存储,很可能造成DDOS和磁盘爆满。

引入了检查,默认是100倍的压缩比率,超过了也会报错,认为是zip炸弹,这个有点武断了,所以有个参数控制跳过,但是没有参数设置比率。直接从源码cn.hutool.core.compress.ZipReader分析

5.8.10版本,并没有检查zip压缩的比率,直接读取zip文件对象去解压了

	/**
	 * 读取并处理Zip流中的每一个{@link ZipEntry}
	 *
	 * @param consumer {@link ZipEntry}处理器
	 * @throws IORuntimeException IO异常
	 */
	private void readFromStream(Consumer<ZipEntry> consumer) throws IORuntimeException {
		try {
			ZipEntry zipEntry;
			while (null != (zipEntry = in.getNextEntry())) {
				consumer.accept(zipEntry);
			}
		} catch (IOException e) {
			throw new IORuntimeException(e);
		}
	}

升级5.8.11,按照100倍检查,超过100倍认为是zip炸弹,但是万一确实100倍怎么办,在5.8.21版本之前是没办法的,5.8.21做了跳过处理

	// size of uncompressed zip entry shouldn't be bigger of compressed in MAX_SIZE_DIFF times
	private static final int MAX_SIZE_DIFF = 100;
	/**
	 * 检查Zip bomb漏洞
	 *
	 * @param entry {@link ZipEntry}
	 * @return 检查后的{@link ZipEntry}
	 */
	private static ZipEntry checkZipBomb(ZipEntry entry) {
		if (null == entry) {
			return null;
		}
		final long compressedSize = entry.getCompressedSize();
		final long uncompressedSize = entry.getSize();
		if (compressedSize < 0 || uncompressedSize < 0 ||
				// 默认压缩比例是100倍,一旦发现压缩率超过这个阈值,被认为是Zip bomb
				compressedSize * MAX_SIZE_DIFF < uncompressedSize) {
			throw new UtilException("Zip bomb attack detected, invalid sizes: compressed {}, uncompressed {}, name {}",
					compressedSize, uncompressedSize, entry.getName());
		}
		return entry;
	}

 那么为什么5.8.16取文件流的文件大小都是-1呢,在5.8.17修复

因为文件构建的zipentry是有大小属性设置的,而从文件流读取的却丢失了大小属性

 

解决办法也很简单,从文件读取完成信息再检查,反正zip文件还没解压缩,这样zipentry就有文件大小属性了 

超过100倍大小

那么如果zip文件压缩比率超过100倍怎么办,只能升级hutool包,升级5.8.21试试,可以自定义大小倍数,且可以设置<0关闭检查

检查逻辑,以前的常亮改成了变量,且可自定义

但是,缺点依然明显,因为这个设置方法是对象方法,并没有开放配置的API,需要我们自己new 

ZipReader

来自定义设置,原来的API就不能使用了

 

总结

其实hutool工具包很方便,但是在笔者实际项目中经常会出现安全漏洞升级,笔者在分析完源码后在github也找到了相同的问题项:https://github.com/dromara/hutool/issues/3018

实际上很多人都遇到了,相似的jar还有guava经常出现API不兼容啥的,还有安全漏洞升级,不过还是感谢作者提供的开源便利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

山东潍坊戴尔存储服务器维修 md3800f raid恢复

山东戴尔存储故障维修 存储型号&#xff1a;DELL PowerVault md3800f 故障问题&#xff1a;存储除尘后通电开机&#xff0c;发现有物理硬盘没有插到位&#xff0c;用户带电拔插了多块物理盘&#xff0c;导致关连的磁盘阵列掉线&#xff0c;卷失败&#xff1b; 处理方式&#xf…

Python基于Django、大数据的北极星招聘数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

[JavaEE] TCP协议

目录 一、TCP协议段格式 二、TCP确保传输可靠的机制 2.1 确认应答 2.2 超时重传 2.3 连接管理 2.3.1 三次握手 2.3.2 四次挥手 2.4 滑动窗口 2.4.1 基础知识 2.4.2 两种丢包情况 2.4.2.1 数据报已经抵达&#xff0c;ACK丢包 2.4.2.2 数据包丢包 2.5 流量控制…

国标GB28181视频融合监控汇聚平台的方案实现及场景应用

Liveweb国标视频融合云平台基于端-边-云一体化架构&#xff0c;部署轻量简单、功能灵活多样&#xff0c;平台可支持多协议&#xff08;GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等&#xff09;、多类型设备接入(IPC/NVR/监控平台)&#xff0c;在视频能力上&#xff0…

图解 | 消息认证码(MAC)到底解决了什么问题?还有什么问题是它解决不了的?

消息认证码&#xff08;Message Authentication Code&#xff0c;MAC&#xff09;是一种用于验证数据完整性和来源可信性&#xff08;对消息进行认证&#xff09;的技术。它通常由一个密钥和被保护的消息通过特定算法计算得出&#xff0c;接收方可以使用相同的密钥&#xff08;…

C++类之set与get理解

在类中&#xff0c;我们尝尝将一些变量设置为private或者protect里面&#xff0c;而我们经常会遇到在主函数&#xff08;main.cpp&#xff09;使用到这些private变量&#xff0c;而往往我们会下意识地在主函数直接调用在private里面的变量&#xff0c;但现实比较残酷&#xff0…

20240921解决使用PotPlayer在WIN10电脑播放4K分辨率10bit的视频出现偏色的问题

20240921解决使用PotPlayer在WIN10电脑播放4K分辨率10bit的视频出现偏色的问题 2024/9/21 10:40 缘起&#xff1a;常见的问题&#xff0c;你下载视频的时候&#xff0c;4K分辨率的视频播放的时候出现偏色异常&#xff0c;但是1080p分辨率的正常呀&#xff01; 偏色的识别&…

re题(32)BUUCTF-[MRCTF2020]hello_world_go

BUUCTF在线评测 (buuoj.cn) 查壳&#xff0c;无壳&#xff0c;64位elf文件 ida打开是go语言写的&#xff0c;shiftF12看字符串 ctrlF搜索字符串&#xff0c;得到flag 本题是go语言写的&#xff0c;可以用linux打开go语言文件&#xff0c;本题直接把flag放到了字符串表&#xf…

数据结构---二叉搜索树(二叉排序树)

什么是二叉排序树 二叉搜索树又是二叉排序树&#xff0c;当我们的是一颗空树或者具有以下性质时&#xff1a; 左子树不为空&#xff0c;左子树上的值都小于我们的根节点上的值。右子树不为空时&#xff0c;右子树上的值都大于我们的根节点上的值左右子树都是二叉搜索树&#…

我的AI工具箱Tauri版-VideoDuplication视频素材去重

本教程基于自研的AI工具箱Tauri版进行VideoDuplication视频素材去重。 该项目是基于自研的AI工具箱Tauri版的视频素材去重工具&#xff0c;用于高效地处理和去除重复视频内容。用户可以通过搜索关键词"去重"或通过路径导航到"Python音频技术/视频tools"模…

封装的例题

答案A 解析&#xff1a; 选项B说法也正确&#xff0c;但是不如A更有效 选项C 不管采用什么方法&#xff0c;文档是必须要写的 选项D 说法太绝对了&#xff0c;如果封装的内容不适合&#xff0c;开发者可能做软件开发反而难度系数加大

芯片开发(1)---BQ76905---底层参数配置

主要开发思路:AFE主要是采集、保护功能、均衡&#xff0c;所以要逐一去配置芯片的寄存器 采集、均衡功能主要是配置引脚 保护功能主要是参数寄存器配置&#xff0c;至于如何使用命令修改寄存器参数该系列芯片提供了子命令和直接命令两种方式 BQ76905的管脚配置 I、参数配置 …

ubuntu 执行定时任务crontab -e 无法输入的问题

界面显示 GNU nano 4.8 /tmp/crontab.l0A1HJ/crontab # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined t…

全国职业院校技能大赛(大数据赛项)-平台搭建hive笔记

在大数据时代&#xff0c;数据量呈爆炸性增长&#xff0c;传统的数据处理工具已难以满足需求。Hive作为一个开源的数据仓库工具&#xff0c;能够处理大规模数据集&#xff0c;提供了强大的数据查询和分析能力&#xff0c;是大数据学习中的关键工具。在全国职业院校技能大赛&…

【图像检索】基于Gabor特征的图像检索,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Gabor特征的图像检索&#xff0c;用matlab实现。 一、案例背景和算法介绍 这次博…

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用&#xff0c; clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

您可能一直在寻找的 10 个非常有用的前端库

文章目录 前言正文1.radash2.dayjs3.driver4.formkit/drag-and-drop5.logicflow6.ProgressBar7.tesseract8.zxcvbn9.sunshine-track10.lottie 前言 前端开发中&#xff0c;总有一些重复性的工作让我们疲于奔命。为了提高开发效率&#xff0c;我们精心挑选了10个功能强大、易于…

【油猴脚本】00010 案例 Tampermonkey油猴脚本,动态渲染表格-添加提示信息框,HTML+Css+JavaScript编写

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【油…

Ubuntu 22.04 源码下载、编译

Kernel/BuildYourOwnKernel - Ubuntu Wikihttps://wiki.ubuntu.com/Kernel/BuildYourOwnKernel 一、查询当前系统内核版本 rootubuntu22:~# uname -r 5.15.0-118-generic 二、查询本地软件包数据库中的内核源码信息 rootubuntu22:~# apt search linux-source Sorting... Do…

Unity实现原始的发射子弹效果

1 创建一个炮塔&#xff0c;按下空格-坦克会发射一个小球2.小球会掉在地上滚下来-添加组件3 间隔几秒后自动销毁程序逻辑&#xff1a;1.在场景中创建一个炮塔\子弹拿到代码里的变量里程序逻辑&#xff1a; 2.if语句检测用户有没有按下空格程序逻辑&#xff1a; 3.在炮塔坐标的位…