Apache Dubbo是一种基于Java的高性能RPC框架。该项目于2011年开源,并于2018年2月进入Apache孵化器,目前已经成为了广大开发者最常使用的微服务框架之一。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

漏洞详情

腾讯安全玄武实验室研究员发现,Dubbo 2.7.6或更低版本采用的默认反序列化方式存在代码执行漏洞,当Dubbo服务端暴露时(默认端口:20880),攻击者可以发送未经验证的服务名或方法名的RPC请求,同时配合附加恶意的参数负载。当恶意参数被反序列化时,它将执行恶意代码。
经验证该反序列化漏洞需要服务端存在可以被利用的第三方库,而研究发现极大多数开发者都会使用的某些第三方库存在能够利用的攻击链,攻击者可以利用它们直接对Dubbo服务端进行恶意代码执行,影响广泛。

漏洞发现者

Ruilin

风险等级

高风险

漏洞风险

远程代码执行等

影响版本

  • Apache Dubbo 2.7.0 ~ 2.7.6
  • Apache Dubbo 2.6.0 ~ 2.6.7
  • Apache Dubbo 2.5.x 所有版本 (官方不再提供支持)

安全建议

修复方案

升级至Apache Dubbo 2.7.7 或更高版本,同时不要对外开启telnet功能。

临时防护方案

  1. 出网限制
    经研究当前存在的反序列化利用链大多需要远程加载恶意类,如果没有特殊需求,建议在不影响业务的情况下将服务器配置出外网限制。

  2. IP白名单
    建议用户将能够连接至Dubbo服务端的消费端IP加入到可信IP白名单里,并在服务端配置可信IP白名单,以防止攻击者在外部直接发起连接请求。

  3. 更换默认的反序列化方式
    Dubbo协议默认采用Hessian作为序列化反序列化方式,而Hessian存在危险的反序列化漏洞。用户可以在考虑不影响业务的情况下更换协议以及反序列化方式,如:rest,grpc,thrift等。

  4. 关闭公网端口
    不要将Dubbo服务端的开放端口暴露在公网,但需要注意这种场景若攻击者在内网环境仍然可以进行攻击。

运维资产自查建议

因无法直接通过与该服务交互来判断Dubbo的版本,所以建议用户通过排查Dubbo所使用的注册中心(如:zookeeper, redis, nacos等)中所标示的Dubbo服务端版本号来确定,由此来做对应的防护以及修复处理。

流量监控报警建议

用户可以在IDS上进行流量监测来,对到达Dubbo服务端的危险流量进行报警。一个可行的方案是判断流量中的二进制数据是否包含危险类的关键词(如:org.apache.xbean.naming.context.ContextUtil.ReadOnlyBinding, org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor, com.rometools.rome.feed, com.caucho.naming.QName等)
在此我们也给出可供参考的针对常见攻击方法的 Snort IDS 报警规则。

1
2
3
4
alert tcp any any -> any any (content:"|da bb|";depth: 2; content:"org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor"; msg: "Dubbo RCE CVE-2020-1948";)
alert tcp any any -> any any (content:"|da bb|";depth: 2; content:"org.apache.xbean.naming.context.ContextUtil.ReadOnlyBinding"; msg: "Dubbo RCE CVE-2020-1948";)
alert tcp any any -> any any (content:"|da bb|";depth: 2; content:"com.rometools.rome.feed"; msg: "Dubbo RCE CVE-2020-1948";)
alert tcp any any -> any any (content:"|da bb|";depth: 2; content:"com.caucho.naming.QName"; msg: "Dubbo RCE CVE-2020-1948";)