Oracle Coherence 反序列化漏洞分析(CVE--2555)
作者:Lucifaer  
0x01 漏洞概述

Oracle官方在1月补丁中修复了CVE-2020-2555漏洞,该漏洞位于Oracle Coherence组件中。该组件是业内领先的用于解决集群应用程序数据的缓存的解决方案,其默认集成在Weblogic12c及以上版本中。
该漏洞提出了一条新的反序列化gadget,未经身份验证的攻击者通过精心构造的T3请求触发可以反序列化gadget,最终造成远程命令执行的效果。
0x02 漏洞分析
ZDI已经给出了一部分的[分析][1],根据ZDI发出的diff图,不难看出补丁是将extract的利用全部移除了,具体的代码可以在com.tangosol.util.filter.LimitFilter#toString中找到:

所以只要跟踪extract()的执行流,就能理解漏洞产生的原理。其实总体来说该漏洞应该分为两部分来分析:
- 反射调用链
 - 反序列化触发点
 
2.1 反射调用链
首先先来具体看一下com.tangosol.util.filter.LimitFilter#toString的逻辑:

红线所标注的就是漏洞触发的关键点,这里的m_comparator、m_oAnchorTop、m_oAnchorBottom是我们能通过LimitFilter的构造函数进行构造的。当m_comparator是继承于ValueExtractor接口的类时,会尝试调用m_comparator.extract()方法,并将结果放入StringBuffer中。
我们接着来看一下ValueExtractor的实现类:

其中ReflectionExtractor和ChainedExtractor值得我们关注。通过名字不难想到这两个类一个是用于完成反射相关操作的,一个是用于执行链式操作的。
在ReflectionExtractor#extract中,可以很明显的看到存在反射调用的流程:

简单来说就是获取oTarget的Method,并反射调用该对象的具体方法。具体方法由this.getMethodName()来控制:


同样,这个值也是可以通过ReflectionExtractor的构造函数来去指定的。现在我们可以指定任意一个方法通过反射调用该方法。但是想要执行代码的话并不是单次反射就能完成的,我们还需要找到一个方法将多条反射调用串起来(就如CommonCollections的利用链相同)。ChainedExtractor就完成了这个工作:

这里的ValueExtractor数组是通过this.getExtractors()获得的,同样也可以通过ChainedExtractor构造函数进行指定:



也就是说现在我们只需要构造多条ReflectionExtractor,将其置于ValueExtractor数组中,就可以触发链式反射调用流程。这一点和CommonCollections的利用链也非常像,最终的执行流可以大致简化为:

2.2 反序列化触发点
上面我们分析了具体的反射调用流程,这一切都是建立在LimitFilter#toString触发时所发生的,为了利用反射调用流程,我们还需要找到一个能够在反序列化时触发toString方法的触发点。ZDI这篇文章中说到了一个触发点——BadAttributeValueExpException#readObject:

所以只需要设置BadAttributeValueExpException的成员变量val为LimitFilter就可以完成触发。
0x03 漏洞利用
通过上面的分析,我们来梳理一下整体的构造流程:
- 构造能串联起来完成命令执行的多条
ReflectionExtractor反射调用 - 利用
ChainedExtractor将多条ReflectionExtractor串联起来 - 将
ChainedExtractor设置为LimitFilter的成员变量m_comparator的值 - 为了完成链式反射调用链,将
LimitFilter的成员变量m_oAnchorTop设置为相应的值(如Runtime.class) - 将构造完成的
LimitFilter设置为BadAttributeValueExpException的成员变量val的值 - 序列化
BadAttributeValueExpException - 构造包含序列化数据的T3请求,发送请求完成攻击
 
攻击效果:

0x04 其他利用方式
抛砖引玉的说一个其他的利用方式。由于我并不是非常喜欢这样串联利用链的方式(因为不好理解),所以简单的看了下其他的Extractor,看看有没有更加简单的利用方式。这里找到另外一个非常好理解的利用方式。前面的流程都是一样的,唯一不同的是可以不利用ReflectionExtractor加ChainedExtractor这样的组合,同样能完成命令执行。
漏洞产生的原因也从链式反射调用改为表达式注入。相信一说到表达式注入各位就已经知道是用的什么链了,这里就不再过多赘述,就放一张利用效果图:

Reference
以上是 Oracle Coherence 反序列化漏洞分析(CVE--2555) 的全部内容, 来源链接: utcz.com/p/199534.html

