Gradle中Spring Starter Web引入的Tomcat Embed 9.0.30漏洞修复咨询
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




