笔者通过对数百个真实项目引入组件的分析选出了Hutool组件的常见漏洞进行分析。本次分析的是CVE-2022-4565,Hutool-core执行unzip操作时的资源消耗漏洞。
漏洞编号:CVE-2022-4565
漏洞类型:CWE-400 不受控制的资源消耗
CVSS评分:CVSS v3.1:7.5
漏洞危害等级:高危
该类漏洞可能造成DoS(Denial of Sevice,DoS)攻击,导致系统崩溃或死机。另外,在资源耗尽的情况下系统性能会下降,因此可能无法处理其他重要的安全事件或阻止攻击者使用其他已知的漏洞。
Hutool-core组件产生该漏洞的原因在于默认的unzip传入的limit参数(限制解压后的大小)为-1。
ZipBomb的原理是创建一个文件,该文件包含相同的符号并被压缩,由于文件包含了相同的信息,所以其压缩的文件会比自己小许多。对于无限长度的重复字节来说,使用DEFLATE 压缩算法的压缩器有接近1032的压缩率(压缩率=压缩前大小/压缩后大小),对于部分恶意构造的Zip,压缩比甚至能达到28000000:1,也就是说10MB的压缩文件最后能解压出281TB的文件。
笔者仅作测试,故而构造约为1024压缩率的Zip Bomb。
制作Zip Bomb文件的代码如下:
1.08MB的压缩文件成功解压出0.97GB的文件。
1.升级Hutool至5.8.11版本
其修复原理是在解压时调用了checkZipBomb的方法,计算文件的压缩率,如果压缩率大于100则视解压的文件为Zip Bomb文件。
2.手动修改源码
第一种修复方案的本质是代码的Patch,对解压文件内的压缩率进行了校验,所以也可以通过自己实现相关校验代码避免漏洞的产生。
该修复方案可通过下载组件源码,手动Patch实现修复,不整体升级组件可保证项目的其余部分不受影响。
3.设置磁盘配额
对用户和进程设置合理的磁盘配额,限制其使用的磁盘空间,防止恶意使用。
以Ubuntu为例。
sudo mount -o remount,usrquota,grpquota /dev/sda1 /mnt
sudo apt-get install quota
sudo setquota -u user1 1048576 1048576 0 0 /mnt
其中,参数含义依次为:用户,硬限制(1KB为单位),软限制(1KB为单位),索引节点的软限制,索引节点的硬限制,以及文件系统路径。
sudo quotacheck -cum /mnt
sudo quotaon /mnt
该修复方案可以在代码存在资源消耗漏洞时防止恶意压缩文件对其他用户和系统造成影响。
安全工程师:hu1y40
2023 年 8 月 4 日晚
作者:洞源实验室