高危漏洞分析|CVE-2022-42920ApacheCommonsBCEL越界写漏洞(2)
2023-05-03 来源:飞速影视
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中代码如下:
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号