码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 高危漏洞分析|CVE-2022-42920 Apache Commons BCEL 越界写漏洞


    项目介绍

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

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

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

    项目地址

     GitHub - apache/commons-bcel: Apache Commons BCEL
     Apache Commons BCEL™ – Home

    漏洞概述

    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. 常量池是一个集合,它由两部分组成,即常量池计数器和常量池

    1. 常量池计数器(constant_pool_count) 是一个 u2 的无符号数;
    2. 常量池(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并未限制其写入常量池的常量数量,当攻击者写入数量足够大时,可导致越界。

    修复方式

    升级到最新版本

    参考链接

    GitHub - apache/commons-bcel: Apache Commons BCEL
    [BCEL-363] ConstantPoolGen can generate constant pools that are too large - ASF JIRA
    https://lists.apache.org/thread/lfxk7q8qmnh5bt9jm6nmjlv5hsxjhrz4
    https://github.com/openjdk/jdk11u/commit/13bf52c8d876528a43be7cb77a1f452d29a21492
    BCEL-363 Enforce MAX_CP_ENTRIES in ConstantPoolGen and ConstantPool.dump by rjatkins · Pull Request #147 · apache/commons-bcel · GitHub
    https://github.com/apache/commons-bcel/pull/147/commits/399d4e4d8559c185136f94dee67744bf6641cfe7

  • 相关阅读:
    基于YOLOv8模型和UA-DETRAC数据集的车辆目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    Chaes恶意软件的新Python变种以银行和物流业为目标
    sass内置函数汇总
    Oracle P6 -SQLServer数据库乱码案例分享
    我参加NVIDIA Sky Hackathon 后端修改
    【obs】obsqsv11 硬编 及与metartc codec对比
    Android SDK使用教程(Windows)
    读书笔记 如何阅读一本书
    8、Docker-compose容器编排
    云e办(后端)——导入导出员工数据(EasyPoi注解使用)
  • 原文地址:https://blog.csdn.net/LJQClqjc/article/details/127774911
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号