打开微信扫一扫
漏洞编号和级别
CVE编号:CVE-2020-2555,危险级别:严重,CVSS分值:9.8
影响版本
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
漏洞概述
近日,包含在1月份Oracle关键补丁程序更新CPU(Critical Patch Update)的漏洞,Oracle Coherence反序列化远程代码执行漏洞(CVE-2020-2555)的细节已被公开。
Oracle Coherence为Oracle融合中间件中的产品,是业界领先的内存数据网格解决方案,它能为公司和组织提供对常用数据的快速访问。在WebLogic 12c及以上版本中默认集成到WebLogic安装包中。Oracle Coherence中的反序列化远程代码执行漏洞允许未经身份验证的攻击者通过精心构造的T3网络协议请求进行攻击。成功利用该漏洞的攻击者可以在目标主机上执行任意代码。
漏洞验证
漏洞细节详见:https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server。
通过补丁找到漏洞利用点
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库,并且攻击者可以投递恶意序列化对象,那么攻击者就能实现远程代码执行。
修复建议
官方已经针对此漏洞发布补丁,请受影响的用户参考以下链接安装补丁更新:https://www.oracle.com/security-alerts/cpujan2020.html。
临时修复建议
若相关用户暂时无法安装修复补丁,可通过控制T3协议的访问来临时阻断针对利用T3协议漏洞的攻击。
1. 进入weblogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。
2. 在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则中输入127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * * deny t3 t3s(t3 和t3s 协议的所有端口只允许本地访问)。
3. 保存并重启服务器即可生效。