You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Gradle中Spring Starter Web引入的Tomcat Embed 9.0.30漏洞修复咨询

解决Spring Boot中Apache Tomcat Embed 9.0.30的Black Duck安全漏洞问题

Hey,我之前处理过一模一样的Black Duck漏洞告警,针对Spring Boot项目里Tomcat Embed的依赖问题,有几个靠谱的解决办法,按优先级给你列出来:

  • 升级Spring Boot版本(最推荐)
    Spring Boot的starter依赖本身就会统一管理所有传递依赖的版本,Tomcat Embed的版本是跟着Spring Boot版本走的。9.0.30的漏洞在后续的Spring Boot版本里已经通过升级Tomcat版本修复了。比如你可以把Spring Boot版本升级到2.2.6.RELEASE及以上(这个版本对应的Tomcat Embed是9.0.33,已经修复了相关漏洞),或者直接升到最新的稳定版。修改你的build.gradle里的Spring Boot插件版本就行:

    plugins {
        id 'org.springframework.boot' version '2.7.14' // 示例稳定版,可按需选择更高版本
        id 'io.spring.dependency-management' version '1.0.15.RELEASE'
        id 'java'
    }
    

    这样依赖管理插件会自动把Tomcat Embed的版本替换成安全的,不用手动调整单个依赖。

  • 手动强制指定Tomcat Embed的安全版本
    如果暂时没法升级Spring Boot版本,那可以在build.gradle里强制指定Tomcat Embed的版本,覆盖传递依赖的旧版本。比如:

    dependencies {
        // 你的其他依赖...
        implementation 'org.springframework.boot:spring-boot-starter-web'
        // 强制指定安全的Tomcat版本
        implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.80'
        implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.80'
        implementation 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.80'
    }
    

    或者用dependency management来统一管控版本,更优雅:

    dependencyManagement {
        dependencies {
            dependency 'org.apache.tomcat.embed:tomcat-embed-core:9.0.80'
            dependency 'org.apache.tomcat.embed:tomcat-embed-el:9.0.80'
            dependency 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.80'
        }
    }
    

    这样所有传递依赖过来的Tomcat组件都会自动使用你指定的安全版本。

  • 切换到其他嵌入式服务器(备选方案)
    如果不想用Tomcat了,Spring Boot还支持Jetty或者Undertow作为嵌入式服务器。你可以先排除Tomcat的依赖,再引入Jetty的starter:

    dependencies {
        implementation('org.springframework.boot:spring-boot-starter-web') {
            exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
        }
        implementation 'org.springframework.boot:spring-boot-starter-jetty'
    }
    

    这样项目就会用Jetty替代Tomcat,自然避开Tomcat的漏洞,但记得要测试下项目在Jetty下的兼容性,确保业务功能正常运行。

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

火山引擎 最新活动