Dubbo反序列化漏洞详细分析

Dubbo反序列化漏洞详细分析
最新回答
不归鸟

2026-10-29 16:25:04

Dubbo反序列化漏洞(CVE-2019-17564)是由于HTTP协议处理用户POST数据时未对序列化内容进行过滤,导致恶意对象反序列化触发远程代码执行(RCE)。 以下为详细分析:

一、漏洞背景与影响范围
  • Dubbo简介:Apache Dubbo是阿里巴巴开源的高性能Java RPC框架,支持多种协议(如Dubbo、HTTP、RMI),提供远程方法调用、负载均衡和服务发现功能。
  • 漏洞成因:使用HTTP协议通信时,Dubbo未对POST请求中的序列化数据进行过滤,直接反序列化用户输入,导致恶意代码执行。
  • 影响版本:

    2.7.0 ≤ Apache Dubbo ≤ 2.7.4

    2.6.0 ≤ Apache Dubbo ≤ 2.6.7

    Apache Dubbo 2.5.x

二、漏洞复现环境搭建
  1. 依赖服务:

    下载并启动Zookeeper(作为注册中心),启动成功后客户端显示“Welcome to ZooKeeper!”。

  2. Dubbo样例修改:

    使用官方样例dubbo-samples-http,修改pom.xml将Dubbo版本改为漏洞版本(如2.7.3)。

    添加Commons Collections4的Gadget链依赖。

    修改spring/http-provider.xml中的IP和端口配置。

  3. 启动服务:

    依次启动HttpProvider和HttpConsumer,确认服务正常运行。

  4. 生成Payload:

    使用ysoserial生成恶意序列化数据:

    java -jar ysoserial.jar CommonsCollections4 calc > dubbo.ser
  5. 触发漏洞:

    通过Burp Suite发送POST请求,携带恶意序列化数据,成功触发计算器弹出。

三、漏洞详细分析
  1. 请求处理流程:

    DispatcherServlet#service():接收HTTP请求,调用handler.handle(request, response)。

    handleRequest():根据URI获取处理对象skeletonMap,失败则报错;成功则调用handleRequest。

    readRemoteInvocation():读取请求中的序列化数据,封装为ObjectInputStream对象ois。

    doReadRemoteInvocation():直接调用ois.readObject()反序列化数据,未进行任何过滤。

  2. 漏洞触发条件:

    用户输入未经验证直接反序列化。

    存在可用的Gadget链(如Commons Collections4)。

四、修复方案
  1. 升级版本:

    升级到Dubbo最新版本(≥2.7.5或≥2.6.8),修复了未过滤序列化数据的逻辑。

  2. 修复机制:

    新版本中,获取skeleton对象后调用JsonRpcBasicServer.handle()处理请求,替代原有的危险反序列化流程。

五、总结与建议
  • 漏洞本质:对用户输入缺乏过滤,盲目信任导致反序列化攻击。
  • 防御措施:

    升级Dubbo至安全版本。

    避免使用不安全的序列化协议(如Java原生序列化),改用JSON等安全格式。

    部署Web应用防火墙(WAF)拦截恶意序列化数据。

  • 漏洞挖掘方向:关注用户输入处理、危险方法调用(如readObject()、deserialize())等环节。