背景
近日 Dubbo 官方报告了一个 Dubbo 远程代码执行问题(CVE-2020-1948),该问题由 Provider 反序列化漏洞引起。根据介绍,攻击者可以使用无法识别的服务名称或方法名称,并带上一些恶意参数有效载荷发送 RPC 请求。当恶意参数反序列化后,将执行一些恶意代码。
受影响的版本:
- 2.7.0 <= Dubbo Version <= 2.7.6
- 2.6.0 <= Dubbo Version <= 2.6.7
- 所有 2.5.x 版本(官方团队不再支持)
我们之前是使用的2.5.3版本的dubbo,这次需要升级到2.7.7以避免该漏洞,而由于dubbo 2.7.x之后就托管到Apache了,其包名都替换了,很多地方需要修改。
Dubbo升级
1. 修改依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.7</version>
</dependency>
另外,由于新版dubbo增加了对apache curator组件的依赖,因此参照官方文档说明,需要引入:
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.7</version>
<type>pom</type>
</dependency>
示例:
这个dubbo-dependencies-zookeeper其实就是zookeeper和curator-recipes的组合,因此也可以单独引入它们,便于灵活控制依赖版本
注意:2.7.7版本的dubbo-dependencies-zookeeper包含的是3.4.14的zookeeper和4.0.1的curator-recipes,可能会与项目中其他地方引入的产生版本冲突,需要留意这类问题。
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${recipes.version}</version>
</dependency>
如果是使用springboot starter的话,则可以直接使用:
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.7</version>
</dependency>
2. 修改dubbo的xml配置文件中的schema地址
将所有http://code.alibabatech.com/schema/dubbo
替换为 http://dubbo.apache.org/schema/dubbo
示例:
3. 修改配置
由于dubbo2.7将注册中心拆分为注册中心、配置中心和元数据中心,因此需要在服务提供者的配置文件中额外加上一行配置中心的配置,配置为zk的地址即可:
<dubbo:config-center address="${dubbo.zk.address}"/>
相关依赖升级
1. 替换AccessLogFilter
我们之前使用了dubbo-extension组件中的AccessInvokeLogFilter
类来打印日志,而这个类依赖的是老版本的dubbo,因此也不能使用,直接去掉相关依赖,并替换为使用ApacheDubbo自带的org.apache.dubbo.rpc.filter.AccessLogFilter
来记录请求。
开启方式也很简单,在dubbo protocol配置中加上accesslog属性:
<dubbo:protocol accesslog="true"/>
2. 替换sentinel-dubbo-adapter
为了使sentienl拦截到dubbo请求,需要使用sentinel-dubbo-adapter组件,而这个组件替换也很方便,直接将依赖artifactId从sentinel-dubbo-adapter
修改为 sentinel-apache-dubbo-adapter
。
示例:
其他建议
-
可以搜索项目内是否使用到了包名为
com.alibaba.dubbo
的老版本dubbo类,然后统一替换为org.apache.dubbo
,由于dubbo版本升级过程中其核心功能类名基本没有改动,所以一般直接通过修改包名即可完成升级替换。 -
@Service
注解已被标记为Deprecated,最好替换为使用@DubboService