报告编号:B6-2020-030901
报告来源:360-CERT
报告作者:Hu3sky
更新日期:2020-03-09
0x01 漏洞背景
2020年3月6日,Oracle Coherence 反序列化远程代码执行漏洞(CVE-2020-2555)的细节被公开,Oracle Coherence为Oracle融合中间件中的产品,在WebLogic 12c及以上版本中默认集成到WebLogic安装包中,攻击者通过t3协议发送构造的序列化数据,能过造成命令执行的效果
0x02 影响版本
Oracle Coherence 3.7.1.17
Oracle Coherence 12.1.3.0.0
Oracle Coherence 12.2.1.3.0
Oracle Coherence 12.2.1.4.0
0x03 漏洞分析
测试版本:
- jdk: 8u191
- weblogic: 12.2.1.4.0
Gadget chain:
ObjectInputStream.readObject()
BadAttributeValueExpException.readObject()
LimitFilter.toString()
ChainedExtractor.extract()
ReflectionExtractor.extract()
Method.invoke()
Class.getMethod()
ReflectionExtractor.extract()
Method.invoke()
Runtime.getRuntime()
ReflectionExtractor.extract()
Method.invoke()
Runtime.exec()
官方修补了LimitFilter.toString()
方法,修补前的该方法如下
主要关注我标记了的地方,如果m_comparator
属性是ValueExtractor
的实例,那么就会去调用extract
方法,并且传入m_oAnchorTop
属性,这里的属性都可控,这里我们就需要明确最终的目的,造成命令执行,比较理想的就是能够调用Method.invoke()
,通过反射调用任意方法,通过寻找,发现了com.tangosol.util.extractor.ReflectionExtractor
类的extract
方法中,存在利用点,并且该类可被序列化
我们看到他的extract
方法,调用了method.invoke
,两个参数都为序列化中的可控变量
直接通过构造方法进行赋值
不过我们知道,单凭这一个method.invoke
是没法调用到Runtime.getRuntime().exec()
的,需要再去寻找一个中间点去反复调用这个方法,这里就十分的类似Commons Collections
的gadgets
,那么这个中间点就是com.tangosol.util.extractor.ChainedExtractor
方法,他的extract
方法
每执行一次method.invoke
的结果都会return
,作为下一次执行的参数。不过要注意第一次循环的时候,需要手动传入oTarget
参数,也就是LimitFilter.toString()
传入extract
的m_oAnchorTop
参数,如果我们要达到命令执行的目的,就需要赋值为Runtime.class
这样就能够将一整个反射给连接起来了,通过反射来造成java.lang.Runtime.getRuntime().exec
的效果
那么回到最开始,我们还没有说怎么去调用LimitFilter.toString()
方法,看到BadAttributeValueExpException
重写的readObject
方法,这里的readObject
的valObj
变量是我们可控的,在进行反序列化时,java会调用ObjectInputStream
类的readObject()
方法。如果被反序列化的类重写了readObject
方法,那么该类在进行反序列化时,Java
会优先调用重写的readObject
方法
类似的gadgets
也出现在CommonsCollections5里,
这样,一条完整的gadget chain
就被连接起来。
0x04 漏洞证明
通过t3协议将反序列化数据发送给weblogic server
0x05 修复建议
升级补丁,参考oracle官网发布的补丁https://www.oracle.com/security-alerts/cpujan2020.html 如果不依赖T3协议进行JVM通信,禁用T3协议。
进入WebLogic
控制台,在base_domain
配置页面中,进入安全选项卡页面,点击筛选器,配置筛选器。 在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl
,在连接筛选器规则框中输入 7001 deny t3 t3s 保存生效(需重启)
0x06 时间线
2020-03-06 漏洞细节被公开
2020-03-06 360-CERT 发布预警
2020-03-09 360-CERT 发布分析