oracle coherence远程代码执行漏洞
  • cnnvd编号:未知
  • 危害等级: 高危 
  • cve编号:cve-2020-2555
  • 漏洞类型: 代码执行
  • 威胁类型:未知
  • 厂       商:未知
  • 漏洞来源:深信服
  • 发布时间:2021-01-12
  • 更新时间:2021-01-13

漏洞简介

1、oracle coherence组件介绍

coherence是oracle为了建立一种高可靠和高扩展集群计算的一个关键部件,集群指的是多于一个应用服务器参与到运算里。coherence的主要用途是共享一个应用的对象(主要是java对象,比如web应用的一个会话java对象)和数据(比如数据库数据,通过or-mapping后成为java对象)。

2、漏洞分析

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类后,我们可以确认前面的猜测:


实现rce

通常,利用远程代码执行漏洞需要多个方法调用。例如,在流行的apache commons collections的gadget,攻击者需要使用chainedtransformer将任意方法调用串接起来,从而实现rce。与此类似,coherence库中也提供了这样一个类(chainedextractor),可以让我们串接extract()调用:


将以上信息结合起来,我们可以使用如下调用链,最终实现远程代码执行,
如果目标环境使用了coherence库,并且攻击者可以投递恶意序列化对象,那么攻击者就能实现远程代码执行。


参考网站

暂无

受影响实体

目前受影响的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

补丁

官方已经针对此漏洞发布补丁,请受影响的用户参考以下链接安装补丁更新: