Dubbo从2.5.3升级到2.7.7记录(避免Dubbo远程代码执行漏洞)

背景

近日 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>

示例:image-20200705181911232
这个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

示例:
image-20200705170021990

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

示例:
image-20200705171710155

其他建议

  • 可以搜索项目内是否使用到了包名为com.alibaba.dubbo的老版本dubbo类,然后统一替换为org.apache.dubbo,由于dubbo版本升级过程中其核心功能类名基本没有改动,所以一般直接通过修改包名即可完成升级替换。

  • @Service注解已被标记为Deprecated,最好替换为使用@DubboService

猜你喜欢

转载自blog.csdn.net/wk52525/article/details/107141844
今日推荐