反序列化漏洞已经逐渐成为攻击者/研究人员在面对Java Web应用安全研究侧重点。这些漏洞通常能进行远程代码执行(RCE),并且修复起来比较困难。在本文中,我们将分析CVE-2020-2555漏洞影响,并提供相应的解决方案。该漏洞存在于Oracle Coherence库中,从而影响使用该库的Oracle WebLogic服务器等常见产品(涉及多个Weblogic版本)。
2020年3月5日,Zero0day公布了关于Weblogic(CVE-2020-2555)详细分析文章,Oracle Coherence为Oracle融合中间件中的产品,在WebLogic 12c及以上版本中默认集成到WebLogic安装包中,攻击者通过t3协议发送构造的序列化数据,能过造成命令执行的效果。影响版本(包含Coherence包):
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
在分析CVE-2020-2555的补丁引入了一处修改,涉及LimitFilter类的toString()方法:下图为打补丁前的相关代码
补丁在toString()中会将this.m_oAnchorTop和this.m_oAnchorBottom
作为参数传入ValueExtractor.extract(),补丁移除了extractor.extract()操作,跟进extract()看下,发现extract()只是一个抽象方法,并没有实现,那说明extract()在ValueExtractor的子类中可以利用。因为是反序列化,所以我们只需要在ValueExtractor子类中找到实现了Serializable或者ExternalizableLite反序列化接口并且有extract()的方法。
最终在com.tangosol.util.extractor.ReflectionExtractor#extract()找到了反射任意方法调用。
执 行 过 程
1、通过调用FileOutputStream.write()实现任意文件创建;2、通过调用Runtime.exec()实现任意命令执行;
3、通过调用Method.invoke()实现任意方法调用。对于该漏洞,我们主要关注的是Method.invoke(),该调用能通过反射来调用任意Java方法。了解该信息后,我们开始查找具备extract()方法的所有实例(根据前文分析,该方法正是补丁分析后我们得出的根源点),并且最终会调用Method.invoke()。在Coherence库中提供了这样一个类(ChainedExtractor),可以让我们串接extract()调用:只要反序列化执行了chainedExtractor.extract()就可以造成rce。
测试如下:
处 置 建 议
防护建议
部署捷普入侵防御系统(IPS)的用户,更新相应规则升级包,开启Weblogic防护规则,配置相关安全策略,即可达到防护效果。
临 时 缓 解 措 施
1、升级补丁,参考oracle官网发布的补丁
https://www.oracle.com/security-alerts/cpujan2020.html
2、如果不依赖T3协议进行JVM通信,禁用T3协议。或配置相关筛选器保存生效(需重启)127.0.0.1 * * allow t3 t3s
0.0.0.0/0 * * deny t3 t3s
相关检测T3协议命令
nmap.exe -p 7001 --script=weblogic-t3-info.nse XXX.XXX.XXX.XXX
参考:
https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server
https://y4er.com/post/weblogic-cve-2020-2555/