事件背景

2020是庚子年,是不平凡的一年,据2020年6月25日Apache官方安全团队通过邮件公开报告显示,Tomcat版本8.5.0 至 8.5.55,9.0.0.M1 至 9.0.35,10.0.0-M1 至10.0.0-M5爆出了一个高危漏洞, 主要涉及HTTP/2拒绝服务漏洞的细节及解决方案。

漏洞细节如下图所示:
安全漏洞

  • 漏洞名称:Apache Tomcat HTTP/2 拒绝服务漏洞
  • 漏洞编号:CVE-2020-11996
  • 严重程度: 重要
  • 软件提供商: Apache 软件基金会
  • 受影响的版本:
    Apache Tomcat 10.0.0-M1 ~ 10.0.0-M5

    Apache Tomcat 9.0.0.M1 ~ 9.0.35

    Apache Tomcat 8.5.0 ~ 8.5.55
  • 漏洞描述:一个特别制作的 HTTP/2 请求序列,在短短数秒内能导致 CPU 满负载率,如果有足够数量多的此类请求连接(HTTP/2)并发放在服务器上,服务器可能会失去响应。
    如果条件允许,可以通过升级到Tomcat新版本来解决漏洞。下面为受影响版本对应的安全版本:
    Apache Tomcat 10.0.0-M6+
    Apache Tomcat 9.0.36+
    Apache Tomcat 8.5.56+

    SpringCloud/SpringBoot框架影响

Apache Tomcat HTTP/2 拒绝服务漏洞给SpringCloud /SpringBoot框架带来了一定的影响。下面是所有受影响的版本列表,大家可以查看并对照下自己的代码,看看是否受到影响。

Spring Cloud Edgware / Spring Boot 1.5.x
Spring Cloud [Edgware.RELEASE - Edgware.SR6] 版本受到影响。

Spring Boot [1.5.0.RELEASE - 1.5.22.RELEASE] 版本受到影响。

Spring Cloud Finchley / Spring Boot 2.0.x
Spring Cloud [Finchley.RELEASE - Finchley.SR4] 版本受到影响。

Spring Boot [2.0.0.RELEASE - 2.0.9.RELEASE] 版本受到影响。

Spring Cloud Greenwich / Spring Boot 2.1.x
Spring Cloud [Greenwich.RELEASE - Greenwich.SR6] 版本受到影响。

Spring Boot [2.1.0.RELEASE - 2.1.14.RELEASE] 版本受到影响。

Spring Boot [2.1.15.RELEASE] 版本已修复。

Spring Cloud Hoxton / Spring Boot 2.2.x
Spring Cloud [Hoxton.RELEASE - Hoxton.SR6] 版本受到影响。

Spring Boot [2.2.0.RELEASE - 2.2.7.RELEASE] 版本受到影响。

Spring Boot [2.2.8.RELEASE] 版本已修复。

Spring Boot 2.3.x
Spring Boot [2.3.0.RELEASE] 版本受到影响。

Spring Boot [2.3.1.RELEASE] 版本已修复。

解决方案

为了解决上述漏洞,我和我们团队的小伙伴摸索出两种升级方案:

  • 直接升级Spring Boot版本。
  • 手动升级Tomcat版本。

升级 Spring Cloud Edgware / Spring Boot 1.5.x

Edgware无法通过升级Spring Boot版本解决问题。

<properties>
<tomcat.version>8.5.56</tomcat.version>
</properties>


升级SpringCloud Finchley / SpringBoot 2.0.x

Finchley无法通过升级Spring Boot版本解决问题。

<properties>
<tomcat.version>8.5.56</tomcat.version>
</properties>

升级SpringCloud Greenwich / SpringBoot 2.1.x

  1. 升级Spring Boot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.15.RELEASE</version>
</parent>
  1. 升级Tomcat
<properties>
<tomcat.version>9.0.37</tomcat.version>
</properties>

升级Spring Cloud Hoxton / Spring Boot 2.2.x

  1. 升级SpringBoot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.8.RELEASE</version>
</parent>
  1. 升级Tomcat
<properties>
<tomcat.version>9.0.37</tomcat.version>
</properties>

升级Spring Boot 2.3.x

  1. 升级SpringBoot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
</parent>

  1. 升级Tomcat
<properties>
<tomcat.version>9.0.37</tomcat.version>
</properties>

后记

我们有个现有的服务SpringBoot的版本是2.1.10.RELEAS,SpringCloud的版本是Greenwich.SR3,还集成了很多其他微服务组件,我们考虑到升级SpringBoot版本带来的兼容风险,我们采取了直接升级Tomcat版本的方式,建议由同样担忧的小伙伴也可以采取类似方案。
升级Tomcat解决安全漏洞