CVE-2020-2555: Oracle Coherence&WebLogic反序列化远程代码执行分析
2020-03-09 15:08

报告编号: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协议发送构造的序列化数据,能过造成命令执行的效果

public_image

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 漏洞分析

测试版本:

  1. jdk: 8u191
  2. 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()方法,修补前的该方法如下 public_image 主要关注我标记了的地方,如果m_comparator属性是ValueExtractor的实例,那么就会去调用extract方法,并且传入m_oAnchorTop属性,这里的属性都可控,这里我们就需要明确最终的目的,造成命令执行,比较理想的就是能够调用Method.invoke(),通过反射调用任意方法,通过寻找,发现了com.tangosol.util.extractor.ReflectionExtractor类的extract方法中,存在利用点,并且该类可被序列化 public_image

我们看到他的extract方法,调用了method.invoke,两个参数都为序列化中的可控变量 public_image

直接通过构造方法进行赋值 public_image

不过我们知道,单凭这一个method.invoke是没法调用到Runtime.getRuntime().exec()的,需要再去寻找一个中间点去反复调用这个方法,这里就十分的类似Commons Collectionsgadgets,那么这个中间点就是com.tangosol.util.extractor.ChainedExtractor方法,他的extract方法

public_image 每执行一次method.invoke的结果都会return,作为下一次执行的参数。不过要注意第一次循环的时候,需要手动传入oTarget参数,也就是LimitFilter.toString()传入extractm_oAnchorTop参数,如果我们要达到命令执行的目的,就需要赋值为Runtime.class 这样就能够将一整个反射给连接起来了,通过反射来造成java.lang.Runtime.getRuntime().exec的效果

那么回到最开始,我们还没有说怎么去调用LimitFilter.toString()方法,看到BadAttributeValueExpException重写的readObject方法,这里的readObjectvalObj变量是我们可控的,在进行反序列化时,java会调用ObjectInputStream类的readObject()方法。如果被反序列化的类重写了readObject方法,那么该类在进行反序列化时,Java会优先调用重写的readObject方法

类似的gadgets也出现在CommonsCollections5里, public_image 这样,一条完整的gadget chain就被连接起来。

0x04 漏洞证明

通过t3协议将反序列化数据发送给weblogic server public_image

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 发布分析

0x07 参考链接

  1. https://www.thezdi.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server