Lucifaer's Blog.

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

Word count: 1,156 / Reading time: 4 min
2020/03/10 Share

这个利用链看着很简单,实际上很难挖,值得好好研究和学习。

0x01 漏洞概述

-w1117

Oracle官方在1月补丁中修复了CVE-2020-2555漏洞,该漏洞位于Oracle Coherence组件中。该组件是业内领先的用于解决集群应用程序数据的缓存的解决方案,其默认集成在Weblogic12c及以上版本中。

该漏洞提出了一条新的反序列化gadget,未经身份验证的攻击者通过精心构造的T3请求触发可以反序列化gadget,最终造成远程命令执行的效果。

0x02 漏洞分析

ZDI已经给出了一部分的分析,根据ZDI发出的diff图,不难看出补丁是将extract的利用全部移除了,具体的代码可以在com.tangosol.util.filter.LimitFilter#toString中找到:

所以只要跟踪extract()的执行流,就能理解漏洞产生的原理。其实总体来说该漏洞应该分为两部分来分析:

  • 反射调用链
  • 反序列化触发点

2.1 反射调用链

首先先来具体看一下com.tangosol.util.filter.LimitFilter#toString的逻辑:

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

我们接着来看一下ValueExtractor的实现类:

其中ReflectionExtractorChainedExtractor值得我们关注。通过名字不难想到这两个类一个是用于完成反射相关操作的,一个是用于执行链式操作的。

ReflectionExtractor#extract中,可以很明显的看到存在反射调用的流程:

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


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

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



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

2.2 反序列化触发点

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

所以只需要设置BadAttributeValueExpException的成员变量valLimitFilter就可以完成触发。

0x03 漏洞利用

通过上面的分析,我们来梳理一下整体的构造流程:

  1. 构造能串联起来完成命令执行的多条ReflectionExtractor反射调用
  2. 利用ChainedExtractor将多条ReflectionExtractor串联起来
  3. ChainedExtractor设置为LimitFilter的成员变量m_comparator的值
  4. 为了完成链式反射调用链,将LimitFilter的成员变量m_oAnchorTop设置为相应的值(如Runtime.class
  5. 将构造完成的LimitFilter设置为BadAttributeValueExpException的成员变量val的值
  6. 序列化BadAttributeValueExpException
  7. 构造包含序列化数据的T3请求,发送请求完成攻击

攻击效果:

0x04 其他利用方式

抛砖引玉的说一个其他的利用方式。由于我并不是非常喜欢这样串联利用链的方式(因为不好理解),所以简单的看了下其他的Extractor,看看有没有更加简单的利用方式。这里找到另外一个非常好理解的利用方式。前面的流程都是一样的,唯一不同的是可以不利用ReflectionExtractorChainedExtractor这样的组合,同样能完成命令执行。

漏洞产生的原因也从链式反射调用改为表达式注入。相信一说到表达式注入各位就已经知道是用的什么链了,这里就不再过多赘述,就放一张利用效果图:

0x05 Reference

CATALOG
  1. 1. 0x01 漏洞概述
  2. 2. 0x02 漏洞分析
    1. 2.1. 2.1 反射调用链
    2. 2.2. 2.2 反序列化触发点
  3. 3. 0x03 漏洞利用
  4. 4. 0x04 其他利用方式
  5. 5. 0x05 Reference