01 事件背景
6月25日, Apache 官方安全團隊通過郵件公開報告了一個高危漏洞,郵件中介紹了 HTTP/2 拒絕服務漏洞的細節及解決方案。如下圖所示:
漏洞詳情鏈接:
http://mail-archives.apache.org/mod_mbox/www-announce/202006.mbox/%3Cfd56bc1d-1219-605b-99c7-946bf7bd8ad4@apache.org%3E
翻譯
- 漏洞名稱: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+
02 Spring Cloud / Boot 框架影響
Apache Tomcat HTTP/2 拒絕服務漏洞也給Spring Cloud / Boot 框架帶來了一定的影響。下面是所有受影響的版本列表,大家可以查看并對照下自己的代碼,看看是否受到影響。
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] 版本已修復。
03 升級方案
為了避免上述漏洞,現有兩種升級方案:
- 直接升級Spring Boot版本。
- 手動升級Tomcat版本。
升級 Spring Cloud Edgware / Spring Boot 1.5.x
Edgware無法通過升級Spring Boot版本解決問題。
<properties>
<tomcat-embed.version>8.5.56</tomcat-embed.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
升級Spring Cloud Finchley / Spring Boot 2.0.x
Finchley無法通過升級Spring Boot版本解決問題。
<properties>
<tomcat-embed.version>8.5.56</tomcat-embed.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
升級Spring Cloud Greenwich / Spring Boot 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>
2. 升級Tomcat
<properties>
<tomcat-embed.version>9.0.36</tomcat-embed.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
升級Spring Cloud Hoxton / Spring Boot 2.2.x
1. 升級Spring Boot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.8.RELEASE</version>
</parent>
2. 升級Tomcat
<properties>
<tomcat-embed.version>9.0.36</tomcat-embed.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
升級Spring Boot 2.3.x
1. 升級Spring Boot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
2. 升級Tomcat
<properties>
<tomcat-embed.version>9.0.36</tomcat-embed.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat-embed.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat-embed.version}</version>
</dependency> </dependencies></dependencyManagement>