You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.7.14下替代Netty/Jetty降低漏洞风险方案咨询

问题背景

我使用Spring Boot 2.7.14且无法升级至新版本,当前依赖的reactor-netty-core 1.1.9存在多个严重、高危及中等CVE漏洞;尝试替换为最新版Netty或Jetty后,仍检测到包括严重级在内的漏洞。需要一种ClientHttpConnector实现,寻求降低漏洞风险的方案或替代库建议。

漏洞列表

依赖包版本类型CVE编号风险等级
reactor-netty-core1.1.9java-archiveCVE-2019-20445严重
reactor-netty-core1.1.9java-archiveCVE-2019-20444严重
reactor-netty-core1.1.9java-archiveCVE-2022-41881高危
reactor-netty-core1.1.9java-archiveCVE-2021-37137高危
reactor-netty-core1.1.9java-archiveCVE-2021-37136高危
reactor-netty-core1.1.9java-archiveCVE-2019-16869高危
reactor-netty-core1.1.9java-archiveCVE-2015-2156高危
reactor-netty-core1.1.9java-archiveCVE-2023-34462中等
reactor-netty-core1.1.9java-archiveCVE-2022-24823中等
reactor-netty-core1.1.9java-archiveCVE-2021-43797中等
reactor-netty-core1.1.9java-archiveCVE-2021-21409中等
reactor-netty-core1.1.9java-archiveCVE-2021-21295中等
reactor-netty-core1.1.9java-archiveCVE-2021-21290中等
reactor-netty-core1.1.9java-archiveCVE-2014-3488中等
解决方案

1. 升级Reactor Netty至Spring Boot 2.7.x兼容的最高版本

Spring Boot 2.7.x系列兼容Reactor Netty 1.1.x分支的所有版本,无需升级Spring Boot主版本,可通过依赖管理强制升级Reactor Netty以修复已知CVE漏洞。

Maven配置

在pom.xml的dependencyManagement中添加:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.projectreactor.netty</groupId>
            <artifactId>reactor-netty-core</artifactId>
            <version>1.1.18</version>
        </dependency>
        <dependency>
            <groupId>io.projectreactor.netty</groupId>
            <artifactId>reactor-netty-http</artifactId>
            <version>1.1.18</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Gradle配置

在build.gradle中添加:

dependencyManagement {
    imports {
        mavenBom 'io.projectreactor:reactor-bom:2020.0.34'
    }
}

注:2020.0.34 Bom对应Reactor Netty 1.1.18,是1.1.x分支的最新稳定版,已修复上述绝大多数CVE。

2. 替换为Apache HttpClient作为ClientHttpConnector

如果升级Reactor Netty仍无法解决漏洞问题,可以切换到Apache HttpClient实现ClientHttpConnector,完全替换Reactor Netty的客户端功能。

步骤1:排除Reactor Netty依赖

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.projectreactor.netty</groupId>
            <artifactId>reactor-netty-http</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Gradle:

implementation('org.springframework.boot:spring-boot-starter-webflux') {
    exclude group: 'io.projectreactor.netty', module: 'reactor-netty-http'
}

步骤2:引入Apache HttpClient依赖

Maven:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-httpclient</artifactId>
</dependency>

Gradle:

implementation 'org.apache.httpcomponents.client5:httpclient5'
implementation 'org.springframework.boot:spring-boot-starter-httpclient'

步骤3:配置HttpClient的ClientHttpConnector

创建配置类,替换默认的Reactor Netty连接器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient() {
        return WebClient.builder()
                .clientConnector(new HttpComponentsClientHttpConnector())
                .build();
    }
}

3. 临时漏洞规避措施(应急方案)

如果上述方案暂时无法落地,可以针对特定CVE配置Reactor Netty参数缓解风险:

  • CVE-2022-41881(HTTP请求走私):启用严格的HTTP解析模式
import reactor.netty.http.client.HttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class ReactorNettyConfig {

    @Bean
    public WebClient webClient() {
        HttpClient httpClient = HttpClient.create()
                .httpResponseDecoder(spec -> spec.maxInitialLineLength(4096)
                        .maxHeaderSize(8192)
                        .strict(true)); // 启用严格解析
        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .build();
    }
}
  • 内存泄漏相关CVE:配置连接池超时和最大连接数,避免资源耗尽
HttpClient httpClient = HttpClient.create()
        .poolResources(pool -> pool.maxConnections(100)
                .pendingAcquireTimeout(Duration.ofSeconds(10)));

内容的提问来源于stack exchange,提问作者babicsp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:18:11