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调用了fromBinaryXString.equals调用toString进而调用getKeyConditionalPutAll.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的黑名单机制。