编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

高危漏洞分析|CVE-2022-42920 Apache Commons BCEL 越界写漏洞

wxchong 2024-08-04 02:27:12 开源技术 31 ℃ 0 评论

项目介绍

Apache Commons BCEL 为用户提供一种方便的方法来分析、创建和操作(二进制)Java类文件(以.class结尾的文件)。 类由包含给定类的所有符号信息的对象表示:特别是方法、字段和字节码指令。

这样的对象可以从现有文件中读取,由程序(例如运行时的类加载器)转换,并再次写入文件。 一个更有趣的应用程序是在运行时从头开始创建类。

BCEL包含一个名为JustIce的字节码验证器,它通常比标准的JVM消息提供更好的代码错误信息。

项目地址

https://github.com/apache/commons-bcel
https://commons.apache.org/proper/commons-bcel/

漏洞概述

Apache Commons BCEL有许多API,通常只允许更改特定的类特征。 但是,由于存在越界写入问题,这些API可用于生成任意字节码。 在将攻击者可控制的数据传递给这些API的应用程序中,这可能会被滥用,从而使攻击者对生成的字节码拥有比预期更多的控制权。

影响版本

影响 Apache BCEL <6.6.0

环境搭建

Commons BCEL 6.5.0 https://github.com/apache/commons-bcel/releases/tag/rel%2Fcommons-bcel-6.5.0

漏洞分析

常量池介绍:

1. JVM常量池主要分为Class文件常量池、运行时常量池、全局字符串常量池和基本类型包装类对象常量池,可以理解为 class 文件之中的资源仓库,它是占用 class 文件空间最大的数据项之一。

2. 常量池是一个集合,它由两部分组成,即常量池计数器和常量池

  • 常量池计数器(constant_pool_count) 是一个 u2 的无符号数;
  • 常量池(constant_pool):紧跟在常量池计数器后面的内容就是该 .class 文件的常量池内容了,常量池中存放的数据一般分为两种类型,包括字面量和符号引用:
  • 字面量:是指文本字符串、声明为 final 的常量值等
  • 符号引用: 是一个更偏向于编译原理方面的概念,主要包括三类常量:

1)类和接口的全限定名;

2)字段的名称和描述符;

3)方法的名称和描述符

3. 在常量池中的常量共有 14 种类型,每个常量都是一个表,每一个表都有各自的组成结构。这 14 个常量有一个公共的特点,就是每个常量开始是一个用 u1 类型的无符号数表示的标志位(tag,取值见下表),表示此常量属于哪种常量类型

4.运行时编译器会将 .java 文件编译为 .class 文件, 其class文件是一组以字节为单位的二进制数据流,在代码编译期间,.java文件就被编译为 .class 文件格式的二进制数据存放在磁盘中,其中就包括class文件常量池。

Commons BCEL 通过ConstantPool、ConstantPoolGen 允许用户构建常量池及对常量池执行相关操作;如允许使用 addString、addClass 方法添加常量,或使用 getFinalConstantPool 返回建立的常量池等。

通过漏洞披露信息可知,漏洞原因是当常量大小超过常量池时,会导致越界问题。故结合issue信息定位到ConstantPool、ConstantPoolGen 相关类。

该漏洞产生的原因在于构建生成常量池时未对用户传入的cs大小进行校验,在BCEL中代码如下:

查询commit可知,ConstantPoolGen 类原 size 大小在 256 和 传入常量长度+64 取较大值,修复版本新增 CONSTANT_POOL_SIZE 并对 size 进行限制,最大不能超过 65535:

并且对于常量数组大小设置 65535 上限:

ConstantPool#dump 函数亦新增对常量池写入常量大小的冗余判断:当constantPool 长度小于ConstantPoolGen限制时,才允许导出操作:

通过以上对比分析,ConstantPoolGen并未限制其写入常量池的常量数量,当攻击者写入数量足够大时,可导致越界。

修复方式

升级到最新版本

参考链接

https://github.com/apache/commons-bcel
https://issues.apache.org/jira/browse/BCEL-363
https://lists.apache.org/thread/lfxk7q8qmnh5bt9jm6nmjlv5hsxjhrz4
https://github.com/openjdk/jdk11u/commit/13bf52c8d876528a43be7cb77a1f452d29a21492
https://github.com/apache/commons-bcel/pull/147/commits/3fdea9e63ce3a12e20ce7ccf25f65e5564578eb2
https://github.com/apache/commons-bcel/pull/147/commits/399d4e4d8559c185136f94dee67744bf6641cfe7

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表