weblogic Coherence 组件漏洞总结分析
字数 3485 2025-08-05 08:19:35

WebLogic Coherence组件反序列化漏洞深度分析

前言

Coherence组件是WebLogic中的一个核心组件,内置在WebLogic中。近些年,WebLogic Coherence组件反序列化漏洞被频繁爆出。本文将对WebLogic Coherence组件历史反序列化漏洞进行全面总结和分析。

前置知识

ValueExtractor接口

com.tangosol.util.ValueExtractor是一个接口,在Coherence中很多名字以Extractor结尾的类都实现了这个接口。该接口声明了一个extract方法,这是Coherence组件历史漏洞(ValueExtractor.extract链部分)的关键。

ExternalizableLite接口

com.tangosol.io.ExternalizableLite继承了java.io.Serializable,另外声明了readExternalwriteExternal这两个方法。它与JDK原生的java.io.Externalizable类似。

ExternalizableHelper类

ExternalizableLite接口的实现类的序列化和反序列化操作,都是通过ExternalizableHelper这个类来完成的。ExternalizableHelper#readObject中会调用ExternalizableHelper#readObjectInternal方法,对于实现ExternalizableLite接口的对象,会调用其readExternal()方法。

漏洞链分析

ValueExtractor.extract利用链架构

漏洞点分析

  1. ReflectionExtractor

    • extract方法含有对任意对象方法的反射调用
    • 配合ChainedExtractorConstantExtractor可实现类似CC1中transform链的调用
    • 涉及CVE: CVE-2020-2555, CVE-2020-2883
  2. MvelExtractor

    • extract方法会执行任意MVEL表达式(RCE)
    • m_sExpr在序列化/反序列化时可控
    • 涉及CVE: CVE-2020-2883
  3. UniversalExtractor (WebLogic 12.2.1.4.0独有)

    • extract方法可调用任意类中getis开头的无参方法
    • 可配合JNDI实现RCE
    • 涉及CVE: CVE-2020-14645, CVE-2020-14825, CVE-2020-14841
  4. LockVersionExtractor

    • extract()方法可调用任意AttributeAccessorgetAttributeValueFromObject方法
    • 赋值AccessorMethodAttributeAccessor可实现任意无参方法调用
    • 涉及CVE: CVE-2020-14825, CVE-2020-14841
  5. FilterExtractor.extract

    • 存在任意AttributeAccessor.getAttributeValueFromObject(obj)调用
    • 赋值attributeAccessorMethodAttributeAccessor可导致任意无参方法调用
    • 涉及CVE: CVE-2021-2394

触发点分析

  1. LimitFilter

    • LimitFilter.toString中存在任意ValueExtractor.extract方法调用
    • m_comparator可控
    • 可利用BadAttributeValueExpException触发toString
    • 涉及CVE: CVE-2020-2555
  2. ExtractorComparator

    • compare方法中存在任意ValueExtractor.extract调用
    • 可通过PriorityQueue.readObjectBadAttributeValueExpException.readObject触发
    • 涉及CVE: CVE-2020-2883, CVE-2020-14645, CVE-2020-14825, CVE-2020-14841

ExternalizableHelper利用链架构

漏洞点分析

  1. PartialResult

    • readExternal会触发任意comparator.compare方法
    • 通过TreeMap.put触发comparator.compare()
    • 涉及CVE: CVE-2020-14756 (1月), CVE-2021-2135 (4月)
  2. filterExtractor

    • readExternal中的readAttributeAccessor()会直接new一个MethodAttributeAccessor对象
    • extract方法中调用attributeAccessor.getAttributeValueFromObject导致任意无参方法调用
    • 涉及CVE: CVE-2021-2394 (4月)

触发点分析

  1. ExternalizableHelper.readObject

    • 可利用com.tangosol.coherence.servlet.AttributeHolder触发
    • AttributeHolder实现了Externalizable接口,其readExternal调用了ExternalizableHelper.readObject
  2. ExternalizableHelper.fromBinary

    • 调用路径更复杂
    • SimpleBinaryEntry中的getKey/getValue调用了fromBinary
    • XString.equals调用toString进而调用getKey
    • ConditionalPutAll.readExternal调用ExternalizableHelper.readMap进而调用map.putequals

漏洞修复与绕过分析

  1. CVE-2020-2555修复

    • 修改了LimitFilter.toString方法
    • 绕过方式: 使用ExtractorComparator.compare作为新触发点(CVE-2020-2883)
  2. CVE-2020-2883修复

    • ReflectionExtractorMvelExtractor加入黑名单
    • 绕过方式: 使用UniversalExtractor(CVE-2020-14645)
  3. CVE-2020-14756修复

    • readExternalizable传入的DataInput检查,如果是ObjectInputStream就调用checkObjectInputFilter()
    • 绕过方式: 使用BufferInput作为参数类型(CVE-2021-2135)
  4. CVE-2021-2135修复

    • SimpleBinaryEntry添加到黑名单
    • 绕过方式: 使用filterExtractor.readExternal(CVE-2021-2394)

总结

WebLogic Coherence反序列化漏洞主要分为两类利用链架构:

  1. ValueExtractor.extract架构

    • 核心: 利用各种ValueExtractor实现类的extract方法
    • 触发点: LimitFilter.toStringExtractorComparator.compare
  2. ExternalizableHelper架构

    • 核心: 利用ExternalizableLite.readExternal方法
    • 关键: ExternalizableHelper通过loadClass加载类,不受WebLogic黑名单限制
    • 触发点: ExternalizableHelper.readObjectExternalizableHelper.fromBinary

这些漏洞之间存在关联性,很多新漏洞都是对之前漏洞补丁的绕过。理解这些漏洞需要掌握Coherence组件的核心接口和类,以及WebLogic的黑名单机制。

WebLogic Coherence组件反序列化漏洞深度分析 前言 Coherence组件是WebLogic中的一个核心组件,内置在WebLogic中。近些年,WebLogic Coherence组件反序列化漏洞被频繁爆出。本文将对WebLogic Coherence组件历史反序列化漏洞进行全面总结和分析。 前置知识 ValueExtractor接口 com.tangosol.util.ValueExtractor 是一个接口,在Coherence中很多名字以Extractor结尾的类都实现了这个接口。该接口声明了一个 extract 方法,这是Coherence组件历史漏洞(ValueExtractor.extract链部分)的关键。 ExternalizableLite接口 com.tangosol.io.ExternalizableLite 继承了 java.io.Serializable ,另外声明了 readExternal 和 writeExternal 这两个方法。它与JDK原生的 java.io.Externalizable 类似。 ExternalizableHelper类 ExternalizableLite 接口的实现类的序列化和反序列化操作,都是通过 ExternalizableHelper 这个类来完成的。 ExternalizableHelper#readObject 中会调用 ExternalizableHelper#readObjectInternal 方法,对于实现 ExternalizableLite 接口的对象,会调用其 readExternal() 方法。 漏洞链分析 ValueExtractor.extract利用链架构 漏洞点分析 ReflectionExtractor extract 方法含有对任意对象方法的反射调用 配合 ChainedExtractor 和 ConstantExtractor 可实现类似CC1中transform链的调用 涉及CVE: CVE-2020-2555, CVE-2020-2883 MvelExtractor extract 方法会执行任意MVEL表达式(RCE) m_sExpr 在序列化/反序列化时可控 涉及CVE: CVE-2020-2883 UniversalExtractor (WebLogic 12.2.1.4.0独有) extract 方法可调用任意类中 get 和 is 开头的无参方法 可配合JNDI实现RCE 涉及CVE: CVE-2020-14645, CVE-2020-14825, CVE-2020-14841 LockVersionExtractor extract() 方法可调用任意 AttributeAccessor 的 getAttributeValueFromObject 方法 赋值 Accessor 为 MethodAttributeAccessor 可实现任意无参方法调用 涉及CVE: CVE-2020-14825, CVE-2020-14841 FilterExtractor.extract 存在任意 AttributeAccessor.getAttributeValueFromObject(obj) 调用 赋值 attributeAccessor 为 MethodAttributeAccessor 可导致任意无参方法调用 涉及CVE: CVE-2021-2394 触发点分析 LimitFilter LimitFilter.toString 中存在任意 ValueExtractor.extract 方法调用 m_comparator 可控 可利用 BadAttributeValueExpException 触发 toString 涉及CVE: CVE-2020-2555 ExtractorComparator compare 方法中存在任意 ValueExtractor.extract 调用 可通过 PriorityQueue.readObject 或 BadAttributeValueExpException.readObject 触发 涉及CVE: CVE-2020-2883, CVE-2020-14645, CVE-2020-14825, CVE-2020-14841 ExternalizableHelper利用链架构 漏洞点分析 PartialResult readExternal 会触发任意 comparator.compare 方法 通过 TreeMap.put 触发 comparator.compare() 涉及CVE: CVE-2020-14756 (1月), CVE-2021-2135 (4月) filterExtractor readExternal 中的 readAttributeAccessor() 会直接new一个 MethodAttributeAccessor 对象 extract 方法中调用 attributeAccessor.getAttributeValueFromObject 导致任意无参方法调用 涉及CVE: CVE-2021-2394 (4月) 触发点分析 ExternalizableHelper.readObject 可利用 com.tangosol.coherence.servlet.AttributeHolder 触发 AttributeHolder 实现了 Externalizable 接口,其 readExternal 调用了 ExternalizableHelper.readObject ExternalizableHelper.fromBinary 调用路径更复杂 SimpleBinaryEntry 中的 getKey/getValue 调用了 fromBinary XString.equals 调用 toString 进而调用 getKey ConditionalPutAll.readExternal 调用 ExternalizableHelper.readMap 进而调用 map.put 和 equals 漏洞修复与绕过分析 CVE-2020-2555修复 修改了 LimitFilter.toString 方法 绕过方式: 使用 ExtractorComparator.compare 作为新触发点(CVE-2020-2883) CVE-2020-2883修复 将 ReflectionExtractor 和 MvelExtractor 加入黑名单 绕过方式: 使用 UniversalExtractor (CVE-2020-14645) CVE-2020-14756修复 对 readExternalizable 传入的 DataInput 检查,如果是 ObjectInputStream 就调用 checkObjectInputFilter() 绕过方式: 使用 BufferInput 作为参数类型(CVE-2021-2135) CVE-2021-2135修复 将 SimpleBinaryEntry 添加到黑名单 绕过方式: 使用 filterExtractor.readExternal (CVE-2021-2394) 总结 WebLogic Coherence反序列化漏洞主要分为两类利用链架构: ValueExtractor.extract架构 核心: 利用各种 ValueExtractor 实现类的 extract 方法 触发点: LimitFilter.toString 或 ExtractorComparator.compare ExternalizableHelper架构 核心: 利用 ExternalizableLite.readExternal 方法 关键: ExternalizableHelper 通过 loadClass 加载类,不受WebLogic黑名单限制 触发点: ExternalizableHelper.readObject 或 ExternalizableHelper.fromBinary 这些漏洞之间存在关联性,很多新漏洞都是对之前漏洞补丁的绕过。理解这些漏洞需要掌握Coherence组件的核心接口和类,以及WebLogic的黑名单机制。