Apache Commons Compress拒绝服务漏洞 CVE-2021-35515

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日

洞源实验室

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: org.apache.commons commons-lang3-3.1是一个Apache软件基金会中的一个实用程序库。它包含了大量的实用工具类和方法,使Java开发人员可以更快、更方便地编写Java代码。在这个库中,开发人员可以找到很多常用的功能,例如字符串操作、日期和时间处理、随机数生成、数组操作、文件操作、数学计算等等。通过这个库,我们可以快速地实现各种功能,提高我们的开发效率。 下载org.apache.commons commons-lang3-3.1非常简单。可以在Apache官网上进行下载,也可以在Maven中央仓库中下载。只需要将对应的jar包加入到我们的工程中即可使用。通过使用Org.apache.commons commons-lang3-3.1这个工具集,我们可以在Java开发中更加得心应手,更加高效地完成开发任务,为我们的项目赢得更多的成功。 ### 回答2: org.apache.commons commons-lang3-3.1是一个Apache软件基金会提供的开源Java类库,主要提供了一系列通用的工具类和方法,用于字符串处理、日期处理、基本类型转换等常用操作,简化了Java开发过程中的一些常见任务。 下载这个类库可以到Apache官网的下载页面进行下载,并且也可在Maven仓库中通过依赖的方式引入。使用时只需要将其添加到Java项目的classpath中即可。 这个版本的commons-lang3包含了很多实用的工具类和方法,比如StringUtils类可以方便地处理字符串的格式化、剪切、替换、分割等操作;DateUtils类提供了对日期和时间的各种处理,包括格式化、加减、比较等等;ArrayUtils类提供了对数组的各种操作,包括复制、添加、查找等等。这些工具类的使用可以大大简化Java开发的工作量,提高代码的可读性和可维护性。 总的来说,org.apache.commons commons-lang3-3.1是一个非常实用的Java类库,推荐给Java开发者使用。 ### 回答3: org.apache.commons commons-lang3-3.1是一个基于Java语言编写的开源软件库。它包含了一系列通用的工具类、方法和实用函数,可以帮助开发者更加高效地完成各种Java应用程序的开发工作。 这个开源软件库主要包含了字符串处理、文件处理、日期时间处理、随机数生成、对象操作、反射等多个方面的功能模块。在实际开发中,我们可以直接引入这个软件库,并调用其中封装好的方法和函数,来完成一些常规性的编码任务。 org.apache.commons commons-lang3-3.1的下载方式是在Apache官网上进行下载。我们可以在官网上找到相应的下载链接,并选择适用于当前开发环境的版本进行下载。下载后,我们需要将其集成到当前的Java应用程序中,并在代码中引入相关的依赖库和包,才能顺利使用其中的功能模块。 总之,org.apache.commons commons-lang3-3.1是一个常用的Java开源软件库,封装了多种常用的工具类、方法和实用函数,可以大大简化Java程序的开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值