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接口绕过黑名单检测机制:

  1. ExternalizableLite接口继承了Serializable接口
  2. 其对象可以在com.tangosol.util.ExternalizableHelper中被序列化
  3. 通过ExternalizableHelper的序列化流程绕过了ObjectInputStream的还原过程
  4. WebLogic的黑名单主要针对ObjectInputStream,因此这种绕过方式有效

漏洞分析

核心利用链

  1. ExternalizableLite接口

    • 位于coherence.jar中的com.tangosol.io.ExternalizableLite
    • 继承了Serializable接口
  2. ExternalizableHelper序列化

    • nTypewriteObject时写入,可控
    • readExternalizableLite方法会加载传入的对象(需是ExternalizableLite的实现类)
    • 直接使用class.forName还原对象
    • 调用对象的readExternal方法
  3. 关键利用类

    • com.tangosol.util.aggregator.TopNAggregator.PartialResult
    • 利用ExternalizableHelper还原m_comparator参数(Comparator类型对象)
    • 调用instantiateInternalMap方法传入m_comparator
    • 实例化SortedBag.WrapperComparator并赋值f_comparator
    • 最终返回TreeMap对象
  4. 执行流程

    • 调用add方法 → super.addSortedBag.addput方法
    • put方法中调用compare方法
    • compare方法调用WrapperComparatorcompare方法
    • f_comparator被赋值为攻击者控制的比较器(如MvelExtractor

序列化入口

  1. 入口一:AttributeHolder

    • ObjectInput转为DataInput
    • 主动调用ExternalizableHelper.readObject
    • 只需m_oValueTopNAggregator$PartialResult即可完成利用
  2. 入口二:PermissionInfo

    • readExternal方法将输入流传入readCollection方法
    • PermissionInfoExternalizableHelper的子类
    • 最终调用readObject方法
    • ObjectInput转为DataInput后流程与入口一相同

12.1.3版本的特殊问题

在WebLogic 12.1.3版本中利用存在以下限制:

  1. 类加载问题

    • loadClass方法使用class.forName加载类
    • 线程上下文类加载器是默认的AppClassLoader
    • coherence组件依赖只有coherence.jarcoherence-web.jar
    • MvelExtractor位于coherence-rest.jar中,无法加载
  2. 替代类尝试失败

    • 尝试使用ReflectionExtractor(位于coherence.jar
    • 需要反序列化Runtime.class对象
    • Runtime.class不是ExternalizableLite的实现类
    • 序列化时会调用readSerializeable方法,仍走ObjectInputStream流程
    • 修改nTypereadExternalizable会导致类型转换错误
  3. 其他不可用类

    • RemoteConstructor
    • UniversalExtractor
    • LockVersionExtractor
    • 这些类在12.1.3版本中不存在

官方修复分析

补丁主要针对实现了JEP290的JDK版本:

  1. 输入流类型检查

    • 如果是ObjectInputStream,调用checkObjectInputFilter方法
    • 方法中获取filter(在ExternalizableHelper静态代码块初始化)
  2. JEP290检测

    • 检查是否存在ObjectInputFilter判断JDK是否实现JEP290
    • 通过getObjectInputFilter/getInternalObjectInputFilter获取serialFilter
    • 调用checkInput对当前序列化的类进行检测
  3. 补丁限制

    • 对未实现JEP290的JDK版本无效
    • 低版本JDK不存在ObjectInputFilterfilter参数为null
    • checkObjectInputFilter直接返回true,仍可进行类实例化

漏洞利用总结

  1. 利用ExternalizableLite接口绕过黑名单检测
  2. 通过ExternalizableHelper的序列化流程替代ObjectInputStream
  3. 使用TopNAggregator$PartialResult作为跳板
  4. 最终通过Comparator比较器执行恶意代码
  5. 在WebLogic 12.1.3版本中利用受限
  6. 官方补丁对低版本JDK无效

防御建议

  1. 升级到最新版本的WebLogic Server
  2. 使用实现了JEP290的高版本JDK
  3. 限制T3协议的访问(通过防火墙或WebLogic配置)
  4. 监控和过滤可疑的T3协议流量
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.jar MvelExtractor 位于 coherence-rest.jar 中,无法加载 替代类尝试失败 : 尝试使用 ReflectionExtractor (位于 coherence.jar ) 需要反序列化 Runtime.class 对象 Runtime.class 不是 ExternalizableLite 的实现类 序列化时会调用 readSerializeable 方法,仍走 ObjectInputStream 流程 修改 nType 走 readExternalizable 会导致类型转换错误 其他不可用类 : RemoteConstructor UniversalExtractor LockVersionExtractor 这些类在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协议流量