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 处理。处理流程如下:

  1. 客户端提供接口名、方法名、方法参数类型列表
  2. 服务端通过反射获取对应方法
  3. 根据客户端提供的反序列化方式将参数反序列化成 POJO 对象

漏洞触发点

漏洞通过 JavaNative 实现反序列化,触发特定 Gadget,最终导致远程代码执行。关键点在于:

  1. 默认情况下 NativeJava 反序列化是被禁止的
  2. 攻击者可以通过特定方式绕过限制启用 NativeJava
  3. 利用 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 关键逻辑

  1. invoke 方法校验:

    • 方法名必须为 $invoke$invoke_async
    • 参数长度必须为 3
    • invoker 的接口不能继承自 GenericService
  2. 参数获取:

    • 第一个参数:方法名
    • 第二个参数:方法参数类型
    • 第三个参数:实际参数
  3. 反序列化类型选择:

    • DefaultGenericSerialization(true)
    • JavaGenericSerialization(nativejava)
    • BeanGenericSerialization(bean)
    • ProtobufGenericSerialization(protobuf-json)
    • GenericReturnRawResult(raw.return)

漏洞利用链

  1. 构造 genericraw.return
  2. 通过反射调用 org.apache.dubbo.common.utils.ConfigUtils.setProperties() 方法
  3. 设置 dubbo.security.serialize.generic.native-java-enableTRUE
  4. 启用 JavaNative 反序列化
  5. 利用 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

主要修复措施:

  1. 新增 CLASS_DESERIALIZE_CHECK_SERIALIZABLE 配置项

    • 配置名:dubbo.application.check-serializable
    • 默认值:true
  2. 新增序列化类检查函数 SerializeClassChecker.validateClass()

    • 校验当前类是否可序列化
    • org.apache.dubbo.common.utils 是非序列化类,直接返回错误
  3. realize0()JavaBeanSerializeUtil 中调用 validateClass 进行校验

0x05 其他潜在利用方式

raw.return 方式外,genericbean 时也可能存在利用可能,但需要进一步研究。

0x06 参考链接

  1. Dubbo 官方补丁
  2. Dubbo 配置属性文档
  3. 相关技术分析文章
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 处理请求的完整调用链: 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 利用代码示例 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 时也可能存在利用可能,但需要进一步研究。 0x06 参考链接 Dubbo 官方补丁 Dubbo 配置属性文档 相关技术分析文章