
查出 Spring Boot 内嵌 Tomcat 的真实版本(pom 里没有),并对每条 2026 年 CVE 同时给出 ASF 官方评级与 GitHub 评级、触发条件、以及这条会不会进 Dependabot 告警 CVE-2026-41293
Find out the Tomcat version you actually have installed, and for every 2026 CVE give both rating systems and trigger conditions at the same time.
A zero-dependency single jar — runs offline, no network, nothing uploaded.
1. The embedded Tomcat version of a Spring Boot project isn't in your pom.
It is governed by the tomcat.version property of spring-boot-starter-parent; in your pom you only see
spring-boot-starter-web. So this tool scans build artifacts (jar / fat jar / installation directory) instead of reading the pom.
2. Some entries can't make it into Dependabot alerts.
Tomcat published 29 CVEs in 2026, some of which won't appear in Spring Boot project alerts due to two mechanisms:
| Mechanism | Description |
|---|---|
advisory is unreviewed | GitHub only uses reviewed advisories for Dependabot alerts. unreviewed is a normal pipeline status — auto-imported by NVD, the affected package not yet manually confirmed |
| mismatched coordinates | the advisory is attached under coordinates like org.apache.tomcat:tomcat-coyote, while Spring Boot's dependency tree only contains tomcat-embed-core / -el / -websocket |
Net effect: a Spring Boot app with embedded Tomcat 9.0.118 shows an all-green Dependabot dashboard, yet this tool reports 4 hits, one of which is exposed by default configuration.
3. The two rating systems use different criteria, and you only get to see one of them.
| ASF / Tomcat official | GitHub / NVD | |
|---|---|---|
| Rating | Low / Moderate / Important / Critical | CVSS score |
Of the 29 entries, 17 differ by 2 or more levels between the two rating systems; the most extreme is CVE-2026-41293: official Low, GitHub critical CVSS 9.8.
Nobody got it wrong. After all, the two systems measure fundamentally different things. But to decide "should I upgrade right now", you need to see both — and whether you've enabled that feature.
java -jar tomcat-check.jar <jar or directory> ...
--all also list entries marked "not applicable"
--utf8 add this if Chinese characters are garbled on the Windows console
# Spring Boot fat jar
java -jar tomcat-check.jar target/my-app.jar
# Standalone Tomcat installation
java -jar tomcat-check.jar /opt/tomcat
# Entire dependency directory
java -jar tomcat-check.jar target/lib
Requires Java 17+.
Each hit gives you: both rating systems, trigger conditions, the original official description, and whether this entry will show up in your Dependabot alerts. Finally, it gives an upgrade target covering all hits.
unreviewed is a normal pipeline status.tools/gen_rules.py generates CveTable.java from two primary sources — not a single line hand-copied:
https://tomcat.apache.org/security-{9,10,11}.html — official ratings, titles, original descriptions, affected rangestype, affected Maven coordinatesThe generation process carries 7 assertions; if any one fails, it aborts and writes no file. Three of them are worth calling out:
<strong>Moderate: The fix for <a>CVE-2025-66614</a> was incomplete</strong> <a>CVE-2026-32990</a>.
Searching the whole block for the "first CVE" picks up that old ID embedded in the title; the consequence isn't a missing entry — it's a case of mistaken identity:
one CVE ends up carrying another's title and description, while generation, tests, and verification against real artifacts all pass exactly as normal.Affects: line sits right next to the next CVE's title,
making it extremely easy to pair it with the wrong one — a mistake yields a table that "looks perfectly normal but is shifted by one slot as a whole".
Cross-validated against GitHub's first_patched_version; during development it really did catch such a misalignment once.tomcat-embed-*.
The exclusion basis must come from actual verification, not "as I remember".To regenerate:
python tools/gen_rules.py
mvn clean package # → target/tomcat-check.jar
34 tests. Zero dependencies at runtime; JUnit is test-only.
MIT
| Basis | actual exploitability under default configuration | mechanical calculation from the vector, doesn't look at whether you enabled that feature |
| Where to find it | tomcat.apache.org/security-9.html | pushed to you directly by Dependabot |