Oracle Coherence组件介绍
Coherence是Oracle为了建立一种高可靠和高扩展集群计算的一个关键部件,集群指的是多于一个应用服务器参与到运算里。Coherence的主要用途是共享一个应用的对象(主要是java对象,比如Web应用的一个会话java对象)和数据(比如数据库数据,通过OR-MAPPING后成为Java对象)。
漏洞描述
Zerodayinitiative公布的一篇博客中公布了一个Coherence反序列化漏洞,CVE编号为CVE-2020-2555,CVSS评分9.8分,危害性高。下面内容来源于博客中的分析资料。
通过补丁找到漏洞利用点
CVE-2020-2555漏洞是由于攻击者可以传入可控参数并调用java方法。在Java中,类中的readObject()或readExternal()方法可以被自动调用。这两种方法以及从它们内部可获得的任何其他方法都可以视为反序列化gadget的来源。
CVE-2020-2555的补丁中更改了LimitFilter类中的toString()方法,如图:
补丁在toString()中删除了对extract()方法的所有调用语句,下文将介绍extract()方法的重要性。此处修改特别有趣,因为我们可以通过各种标准JRE类(例如BadAttributeValueExpException)的readObject()方法访问toString()
如上面的代码所示,BadAttributeValueExpException类的序列化实例可以用于调用任意类的toString()方法。 此方法可用于访问受此补丁影响的LimitFilter类的toString()方法。
有关使用toString()作为入口点的gadget 的示例,请参见ysererial项目的CommonsCollections5 gadget 。
Sink点的寻找
Sink点指的是具有各种副作用的Java方法调用,这类副作用包括:
-通过调用FileOutputStream.write()任意创建文件。
-通过调用Runtime.exec()任意执行命令。
-通过调用Method.invoke()的任意方法调用。
对于此漏洞,我们的重点是对Method.invoke()的调用,此方法的调用可以通过反射来调用任意Java方法。了解该信息后,我们可以查找所有存在extract()方法的实例,并且最终会调用Method.invoke()。在Coherence库中,似乎只有这样一个可序列化类的实例(实现Serializable或Externalizable接口)。
查看ReflectionExtractor类后,我们可以确认前面的猜测:
ReflectionExtractor提供危险的原语,允许攻击者调用任意方法,并且攻击者可以控制其中的方法和参数。
实现RCE
通常,利用远程代码执行漏洞需要多个方法调用。例如,在流行的Apache Commons Collections的gadget,攻击者需要使用ChainedTransformer将任意方法调用串接起来,从而实现RCE。与此类似,Coherence库中也提供了这样一个类(ChainedExtractor),可以让我们串接extract()调用:
将以上信息结合起来,我们可以使用如下调用链,最终实现远程代码执行:
如果目标环境使用了Coherence库,并且攻击者可以投递恶意序列化对象,那么攻击者就能实现远程代码执行。
总结
自Chris Frohoff和Gabriel Lawrence在AppSecCali上的演讲引出了2015年和2016年的所谓的Java反序列化启示之后,研究人员就一直在寻找反序列化错误以实现可靠的代码执行。 我们已经看到许多此类的错误已提交给程序,并在针对SCADA应用程序的Pwn2Own Miami事件中使用。 这也是我们在《 2020年趋势科技安全预测》报告中特别关注反序列化错误的原因之一。 再次感谢VNPT ISC的Jang向程序提交了此错误,我们希望以后能收到他的更多报告。
影响范围
目前受影响的Oracle Coherence版本:
Oracle Coherence 12.2.1.4.0
Oracle Coherence 12.2.1.3.0
Oracle Coherence 12.1.3.0.0
Oracle Coherence 3.7.1.17
修复建议
官方已经针对此漏洞发布补丁,请受影响的用户参考以下链接安装补丁更新:
https://www.oracle.com/security-alerts/cpujan2020.html
临时修复建议
对T3服务进行控制
控制T3服务的方法:
在上图这个weblogic界面中选择安全-筛选器,在下方出现的界面中找到“连接筛选器”,在里面输入
security.net.ConnectionFilterImpl
然后在连接筛选器规则中输入
127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * * deny t3 t3s
最后保存并重启服务器即可生效。