CVE-2020-14756 漏洞利用以及分析
字数 2714 2025-08-10 08:28:55
CVE-2020-14756 WebLogic T3协议反序列化漏洞分析与利用
漏洞概述
CVE-2020-14756是WebLogic Server中的一个高危反序列化漏洞,影响WebLogic的T3协议。该漏洞通过利用WebLogic Coherence组件中的特定类,绕过了黑名单机制的限制,允许攻击者构造恶意序列化数据实现远程代码执行。
漏洞背景
WebLogic的T3协议反序列化漏洞一直是安全研究的热点。WebLogic的防御措施主要包括:
- 不断填充反序列化黑名单
- 高版本JDK下配合JEP290机制
- 低版本JDK下配合
resolveClass进行防御
漏洞利用思路
该漏洞的巧妙之处在于利用了com.tangosol.io.ExternalizableLite接口绕过黑名单检测机制:
ExternalizableLite接口继承了Serializable接口- 其对象可以在
com.tangosol.util.ExternalizableHelper中被序列化 - 通过
ExternalizableHelper的序列化流程绕过了ObjectInputStream的还原过程 - WebLogic的黑名单主要针对
ObjectInputStream,因此这种绕过方式有效
漏洞分析
核心利用链
-
ExternalizableLite接口:
- 位于
coherence.jar中的com.tangosol.io.ExternalizableLite - 继承了
Serializable接口
- 位于
-
ExternalizableHelper序列化:
nType在writeObject时写入,可控readExternalizableLite方法会加载传入的对象(需是ExternalizableLite的实现类)- 直接使用
class.forName还原对象 - 调用对象的
readExternal方法
-
关键利用类:
com.tangosol.util.aggregator.TopNAggregator.PartialResult- 利用
ExternalizableHelper还原m_comparator参数(Comparator类型对象) - 调用
instantiateInternalMap方法传入m_comparator - 实例化
SortedBag.WrapperComparator并赋值f_comparator - 最终返回
TreeMap对象
-
执行流程:
- 调用
add方法 →super.add→SortedBag.add→put方法 - 在
put方法中调用compare方法 compare方法调用WrapperComparator的compare方法f_comparator被赋值为攻击者控制的比较器(如MvelExtractor)
- 调用
序列化入口
-
入口一:AttributeHolder
- 将
ObjectInput转为DataInput - 主动调用
ExternalizableHelper.readObject - 只需
m_oValue是TopNAggregator$PartialResult即可完成利用
- 将
-
入口二:PermissionInfo
readExternal方法将输入流传入readCollection方法PermissionInfo是ExternalizableHelper的子类- 最终调用
readObject方法 - 将
ObjectInput转为DataInput后流程与入口一相同
12.1.3版本的特殊问题
在WebLogic 12.1.3版本中利用存在以下限制:
-
类加载问题:
loadClass方法使用class.forName加载类- 线程上下文类加载器是默认的
AppClassLoader coherence组件依赖只有coherence.jar和coherence-web.jarMvelExtractor位于coherence-rest.jar中,无法加载
-
替代类尝试失败:
- 尝试使用
ReflectionExtractor(位于coherence.jar) - 需要反序列化
Runtime.class对象 Runtime.class不是ExternalizableLite的实现类- 序列化时会调用
readSerializeable方法,仍走ObjectInputStream流程 - 修改
nType走readExternalizable会导致类型转换错误
- 尝试使用
-
其他不可用类:
RemoteConstructorUniversalExtractorLockVersionExtractor- 这些类在12.1.3版本中不存在
官方修复分析
补丁主要针对实现了JEP290的JDK版本:
-
输入流类型检查:
- 如果是
ObjectInputStream,调用checkObjectInputFilter方法 - 方法中获取
filter(在ExternalizableHelper静态代码块初始化)
- 如果是
-
JEP290检测:
- 检查是否存在
ObjectInputFilter判断JDK是否实现JEP290 - 通过
getObjectInputFilter/getInternalObjectInputFilter获取serialFilter - 调用
checkInput对当前序列化的类进行检测
- 检查是否存在
-
补丁限制:
- 对未实现JEP290的JDK版本无效
- 低版本JDK不存在
ObjectInputFilter,filter参数为null checkObjectInputFilter直接返回true,仍可进行类实例化
漏洞利用总结
- 利用
ExternalizableLite接口绕过黑名单检测 - 通过
ExternalizableHelper的序列化流程替代ObjectInputStream - 使用
TopNAggregator$PartialResult作为跳板 - 最终通过
Comparator比较器执行恶意代码 - 在WebLogic 12.1.3版本中利用受限
- 官方补丁对低版本JDK无效
防御建议
- 升级到最新版本的WebLogic Server
- 使用实现了JEP290的高版本JDK
- 限制T3协议的访问(通过防火墙或WebLogic配置)
- 监控和过滤可疑的T3协议流量