0x01 概述
Apache Commons Compress 是一个 Java 库,旨在提供用于压缩和解压缩各种压缩格式的功能。它是 Apache 软件基金会的一个项目,为 Java 开发人员提供了处理压缩文件和流的通用接口和工具。
笔者通过对数百个真实项目引入组件的分析选出了Commons Compress组件的常见漏洞进行分析。本次分析的是CVE-2021-35515,Commons Compress对7z压缩文件解压时造成的无限循环漏洞。
0x02 组件使用场景
Apache Commons Compress 是一个功能强大的 Java 库,专注于处理多种压缩格式,包括 ZIP、Tar、GZIP、BZIP2、XZ 等,适用于文件压缩、解压缩、数据存档、网络通信等多个场景。无论是创建自定义的压缩工具、优化数据传输速度,还是在有限存储空间下进行资源压缩,该库提供了一致的 API 和工具,方便开发人员处理不同压缩格式的需求,从而节省存储空间、提高效率,并简化数据处理过程。
0x03 漏洞信息
3.1 漏洞简介
漏洞名称:拒绝服务漏洞
漏洞编号:CVE-2021-35515
漏洞类型:CWE-835 无限循环
CVSS评分:CVSS v3.1:7.5
漏洞危害等级:高危
3.2 漏洞概述
当读取一个特别精心构造的7Z压缩文件时,解压缩条目的编解码器列表的构建可能会导致无限循环。这可能被用来对使用Compress的sevenz包的服务发动拒绝服务攻击。
3.3 漏洞利用条件
使用的Apache Commons Compress为漏洞影响版本。
3.4 漏洞影响版本
Apache Commons Compress 1.6 ~ 1.20
3.5 漏洞分析
查看漏洞修复补丁
从该补丁得出列表l检查是否存在重复元素便修复了该漏洞,因而结合漏洞描述可以猜测该漏洞的成因就是添加同一元素导致的无限循环,并且添加元素的时候current无增加。
查看交叉引用,发现其会被readEncodedHeader函数调用,其函数是解析7z压缩包的编码的文件头,该文件头通过NextHeader标识位置。
因此我们需要通过设计一个可以无限循环的NextHeader让程序解析,其设计有几个需要满足的条件:
1. Folder中的coder属性有Is Complex Coder标识
2. NumBindPair > 0
3. 且NumBindPair的0号元素的InIndex和OutIndex均为0
构造文件可参考7z文件标准。
3.6 漏洞复现
首先先改一下压缩文件的NextHeader,最后读取的kFolder与此相关。
然后配置一下kFolder的数据,
按照这下面首先要满足Is Complex Coder,其次保证numbindpairs的两个数据为0,这也就满足了无限循环的条件。
代码中pair为从bindpairs中取出的数据,所以如果其为0,那么就会从第一个pair中取数据,然后取的还是0,这也就无线循环了,current永续为0。
结果符合推测。l的size已经很大了,但是程序没什么推进,bindpairs也就只有6个元素。
注:由于修改文件会造成CRC的变动,在调试过程中可以PatchCommons Compress源码以跳过CRC校验。
3.7 修复方法
升级Apache Commons Compress至已修复版本
升级Apache Commons Compress > 1.20
由于1.6-1.20版本出现了许多漏洞,不建议只针对7z文件进行过滤,而是选择将组件升级到漏洞不存在的版本。
作者:hu1y40
2023年11月3日
洞源实验室