Apache Dubbo CVE-2023-23638 JavaNative 反序列化漏洞分析
字数 1604 2025-08-24 16:48:06
Apache Dubbo CVE-2023-23638 JavaNative 反序列化漏洞分析
0x01 漏洞概述
Apache Dubbo 是一款开源的高性能 Java RPC 框架,主要用于开发微服务和分布式架构。本漏洞涉及 Dubbo 的泛化调用功能中 JavaNative 反序列化机制的安全问题。
受影响版本
- 存在漏洞版本:
- 2.7.x ≤ 2.7.21
- 3.0.x ≤ 3.0.13
- 3.1.x ≤ 3.1.5
- 安全版本:
- 2.7.x ≥ 2.7.22
- 3.0.x ≥ 3.0.14
- 3.1.x ≥ 3.1.6
0x02 漏洞原理
泛化调用机制
Dubbo 默认支持泛化引用服务端 API 接口暴露的所有方法,这些调用由 GenericFilter 处理。处理流程如下:
- 客户端提供接口名、方法名、方法参数类型列表
- 服务端通过反射获取对应方法
- 根据客户端提供的反序列化方式将参数反序列化成 POJO 对象
漏洞触发点
漏洞通过 JavaNative 实现反序列化,触发特定 Gadget,最终导致远程代码执行。关键点在于:
- 默认情况下 NativeJava 反序列化是被禁止的
- 攻击者可以通过特定方式绕过限制启用 NativeJava
- 利用 JavaNative 反序列化执行恶意代码
0x03 漏洞分析
请求处理流程
Dubbo 处理请求的完整调用链:
validateClass:110, SerializeClassChecker (org.apache.dubbo.common.utils)
realize0:398, PojoUtils (org.apache.dubbo.common.utils)
realize:220, PojoUtils (org.apache.dubbo.common.utils)
realize:107, PojoUtils (org.apache.dubbo.common.utils)
invoke:96, GenericFilter (org.apache.dubbo.rpc.filter)
invoke:61, FilterNode (org.apache.dubbo.rpc.protocol)
invoke:38, ClassLoaderFilter (org.apache.dubbo.rpc.filter)
invoke:61, FilterNode (org.apache.dubbo.rpc.protocol)
invoke:41, EchoFilter (org.apache.dubbo.rpc.filter)
invoke:61, FilterNode (org.apache.dubbo.rpc.protocol)
reply:145, DubboProtocol$1 (org.apache.dubbo.rpc.protocol.dubbo)
received:152, DubboProtocol$1 (org.apache.dubbo.rpc.protocol.dubbo)
received:177, HeaderExchangeHandler (org.apache.dubbo.remoting.exchange.support.header)
received:51, DecodeHandler (org.apache.dubbo.remoting.transport)
run:57, ChannelEventRunnable (org.apache.dubbo.remoting.transport.dispatcher)
runWorker:1149, ThreadPoolExecutor (java.util.concurrent)
run:624, ThreadPoolExecutor$Worker (java.util.concurrent)
run:41, InternalRunnable (org.apache.dubbo.common.threadlocal)
run:748, Thread (java.lang)
GenericFilter 关键逻辑
-
invoke方法校验:- 方法名必须为
$invoke或$invoke_async - 参数长度必须为 3
- invoker 的接口不能继承自
GenericService
- 方法名必须为
-
参数获取:
- 第一个参数:方法名
- 第二个参数:方法参数类型
- 第三个参数:实际参数
-
反序列化类型选择:
- DefaultGenericSerialization(true)
- JavaGenericSerialization(nativejava)
- BeanGenericSerialization(bean)
- ProtobufGenericSerialization(protobuf-json)
- GenericReturnRawResult(raw.return)
漏洞利用链
- 构造
generic为raw.return - 通过反射调用
org.apache.dubbo.common.utils.ConfigUtils.setProperties()方法 - 设置
dubbo.security.serialize.generic.native-java-enable为TRUE - 启用 JavaNative 反序列化
- 利用 JavaNative 执行反序列化 payload
利用代码示例
private static void enableJavaNative(Hessian2ObjectOutput out) throws IOException {
Properties properties = new Properties();
properties.setProperty("dubbo.security.serialize.generic.native-java-enable","TRUE");
HashMap jndi = new HashMap();
jndi.put("class", "org.apache.dubbo.common.utils.ConfigUtils");
jndi.put("properties", properties);
out.writeObject(new Object[]{jndi});
HashMap map = new HashMap();
map.put("generic", "raw.return");
out.writeObject(map);
}
0x04 补丁分析
补丁提交:4f664f0a3d338673f4b554230345b89c580bccbb
主要修复措施:
-
新增
CLASS_DESERIALIZE_CHECK_SERIALIZABLE配置项- 配置名:
dubbo.application.check-serializable - 默认值:
true
- 配置名:
-
新增序列化类检查函数
SerializeClassChecker.validateClass()- 校验当前类是否可序列化
org.apache.dubbo.common.utils是非序列化类,直接返回错误
-
在
realize0()和JavaBeanSerializeUtil中调用validateClass进行校验
0x05 其他潜在利用方式
除 raw.return 方式外,generic 为 bean 时也可能存在利用可能,但需要进一步研究。