Spring Boot 内嵌的 Tomcat 是哪个版本?怎么查它中了哪些 CVE?

发布时间:2026/10/16 2:41:48
Spring Boot 内嵌的 Tomcat 是哪个版本?怎么查它中了哪些 CVE?
2026-10-15 更正:本文写于 2026-08-06,文中的数字是当天的快照,下面几处已经过时:官方安全页上 2026 年的条目从 29 条增加到51 条(8 月、9 月又各公布了一批)。官方评级和 GitHub 评级相差 2 级以上的,从 17 条变成23 条;另有 9 条 GitHub 还没评级。9.0.118 已经不是「升到位」的版本。9 月公布的CVE-2026-86350(官方 Important,仅在启用 HTTP/2 时成立)是修CVE-2026-41293时带进来的回归,影响 9.0.118–9.0.121 / 10.1.55–10.1.59 / 11.0.22–11.0.25。用 tomcat-check v0.2.0 实扫 9.0.118 的tomcat-embed-coretomcat-embed-websocket:命中 25 条,其中 22 条按机制进不了 Dependabot 告警;只扫tomcat-embed-core是命中 20 条、17 条进不了。三条版本线现在的修复版是9.0.122 / 10.1.60 / 11.0.26,Maven Central 上都能下载到。文中讲的两种「进不了告警」的机制、怎么查真实版本、怎么看两套评级,这些结论没有变。8 月、9 月这两批的逐条分析见新文:Spring Boot 3.5.16 自带的 Tomcat 10.1.55 中了哪些 CVE?Spring Boot 项目里,Tomcat 是内嵌的,而它的版本号不在你的 pom 里。想知道自己用的是哪个版本、中了哪些 CVE、要不要现在升级,这篇讲清楚三件事。一、Spring Boot 内嵌的 Tomcat 是哪个版本?为什么 pom 里查不到你的 pom 里大概只有这一行:dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencyTomcat 的版本号在spring-boot-starter-parent的tomcat.version属性里,不在你的 pom 里,所以你直接看 pom 是看不出来的。查真实版本有三个办法:# ① 看依赖树mvn dependency:tree|greptomcat-embed-core# ② 看打好的 fat jar 里到底装了什么unzip-ltarget/my-app.jar|greptomcat-embed# ③ 直接扫构建产物(文末那个工具)java-jartomcat-check.jar target/my-app.jar为什么推荐扫产物:依赖树是「应该装什么」,产物是「实际装了什么」。有dependencyManagement覆盖、有 BOM、有多模块继承的时候,这两者不一定一样。二、查出版本之后:Dependabot 全绿,不代表没有问题我升级完 Spring Boot,Dependabot 面板全绿。然后扫了一下 fat jar:构件:tomcat-embed-core 版本:9.0.118 ── 你的 Dependabot 大概率不会告警的条目:4 条 ── CVE-2026-55276 ASF 官方 Low │ GitHub critical (CVSS 9.1) 触发条件:默认配置即受影响 CVE-2026-59083 ASF 官方 Low │ GitHub critical (CVSS 9.1) CVE-2026-53404 ASF 官方 Low │ GitHub high (7.3) CVE-2026-55956 ASF 官方 Moderate │ GitHub medium (6.5) 命中 4 条,其中 4 条你的 Dependabot 大概率不会告警9.0.118 是 2026 年 5 月那批 CVE 的官方修复版 —— 写这篇时(2026-08-06),它就是「已经升到位」的状态。现在不是了:它自己落在后来公布的回归CVE-2026-86350的影响区间里,见文首更正。先说清楚:这不是谁的锅有两种机制会让一条 CVE 进不了告警面板,两种都不是失职。机制 A:advisory 还是 unreviewed。GitHub 的 advisory 有两种状态。reviewed是人工确认过受影响包范围的,unreviewed是从 NVD 自动导入、尚未人工确认的。Dependabot 只用reviewed的做告警。$ gh api /advisories?cve_idCVE-2026-59083 type: unreviewed severity: critical vulnerabilities:[]严重性给到 critical,受影响包列表却是空的。没有包就没有匹配对象,自然不会告警 —— 对所有人都不会,不只是你。这是正常流程,不是隐瞒。人工审核需要时间,这批六月底公布的条目还排在队列里。机制 B:坐标对不上。Spring Boot 的依赖树里只有这三个坐标:org.apache.tomcat.embed:tomcat-embed-core org.apache.tomcat.embed:tomcat-embed-el org.apache.tomcat.embed:tomcat-embed-websocket而有些 advisory 挂的是org.apache.tomcat:tomcat-coyote、org.apache.tomcat:tomcat—— 那是独立安装 Tomcat 用的坐标。Dependabot 按坐标匹配,匹配不上就不报。三、那这些代码到底在不在我的 jar 里这一步不能靠推测,得下真 jar 数。tomcat-embed-core-9.0.118.jar 1745 个条目 org/apache/catalina/valves/rewrite/RewriteValve.class 有 ← CVE-2026-59083 / 53404 org/apache/catalina/startup/ContextConfig.class 有 ← CVE-2026-55276 org/apache/catalina/realm/JNDIRealm.class 有 ← CVE-2026-55957 org/apache/catalina/servlets/DefaultServlet.class 有 ← CVE-2026-55956在。但反过来也必须验,不然就成了吓唬人。同一批 CVE 里,这些是真的不在内嵌版里的:CVE代码实际在哪59084 / 55955 / 29146 / 34486(EncryptInterceptor)tomcat-tribes.jar,内嵌版不含34487(CloudMembershipService)tomcat-tribes.jar53434 / 34500(FFM 连接器)tomcat-coyote-ffm,三条版本线的 embed-core 里都没有50229 / 66299示例应用webapps/examples截至 2026-08-06,2026 年 Tomcat 一共 29 条 CVE。「进不了告警」的有 16 条,扣掉本来就不在内嵌版里的 9 条,对 Spring Boot 用户真正成立的是 7 条。这 7 条里最该看的一条CVE-2026-55957 ASF 官方 Important GitHub high 7.3 unreviewed Authentication bypass with JNDIRealm and GSSAPI authentication官方自己评的是 Important。这条不需要任何「两套评级谁更准」的辩论 —— 官方和 GitHub 都认为它不轻,而它进不了告警面板。触发条件:仅当你用 JNDIRealm GSSAPI 认证。用不到就真的不受影响。四、为什么官方说 Low,扫描器说 critical 9.8截至 2026-08-06,29 条里有17 条,官方评级和 GitHub 评级差 2 级以上(10-15 更新:51 条里有 23 条,另有 9 条 GitHub 还没评级)。最极端的一条:CVE-2026-41293 ASF 官方 Low → GitHub critical CVSS 9.8不是谁报错了,是两套体系测的不是同一个东西:ASF / Tomcat 官方GitHub / NVD分级Low / Moderate / Important / CriticalCVSS 数值依据默认配置下的实际可利用性向量机械计算,不看你开没开那个功能在哪看tomcat.apache.org/security-9.htmlDependabot 直接推给你而真正决定「要不要现在升」的,是两套评级里都没有的第三样东西 —— 触发条件。比如官方对 CVE-2026-66299 的原话:Users who followed the security guidance to remove the examples web application are not affected.这句话不在任何评级里,但它才是那句该看的。五、工具把上面这些做成了一个零依赖单 jar,离线跑,需要 Java 17:java-jartomcat-check.jar target/my-app.jar# Spring Boot fat jarjava-jartomcat-check.jar /opt/tomcat# 独立安装的 Tomcatjava-jartomcat-check.jar--all--utf8target/lib对每条命中给出:两套评级 触发条件 官方描述原文 这条会不会进你的 Dependabot 告警,最后给一个能覆盖全部命中条目的升级目标。判定表从官方 security 页面和 GitHub Advisory API 两个一手源生成,一行不手抄,带 7 条断言,任一不满足就中止不生成文件。仓库(MIT):https://github.com/xiaoqiMikko/tomcat-check最后,请这样读它的输出「命中」 你的版本落在官方 Affects 区间内,不等于「已被利用」,更不等于「必然可利用」。2026 年这些条目里只有少数是默认配置即暴露,其余需要显式开启某个功能(RewriteValve、DIGEST 认证、AJP、WebDAV、集群通信)。「不会告警」不是说 GitHub 失职,unreviewed是正常流程状态。判定表只覆盖 2026 年公布的 CVE,没命中不等于你的版本没问题。工具不替你决定要不要升级。它只给你做这个决定需要的三样东西:你装的是哪个版本、官方怎么评、触发条件是什么。