
Выяснить реальную версию встроенного Tomcat в Spring Boot (в pom её нет) и для каждой CVE 2026 года одновременно указать официальную оценку ASF и оценку GitHub, условия срабатывания, а также попадёт ли эта CVE в предупреждения Dependabot: CVE-2026-41293
Определяет реально установленную версию Tomcat и для каждой CVE 2026 года приводит сразу две системы оценок и условия срабатывания.
Один jar без зависимостей, работает офлайн, не выходит в сеть и ничего не отправляет.
Во-первых, версии встроенного Tomcat в проектах Spring Boot нет в вашем pom.
Она управляется свойством tomcat.version из spring-boot-starter-parent, а в pom вы видите только
spring-boot-starter-web. Поэтому этот инструмент сканирует артефакты сборки (jar / fat jar / каталог установки), а не читает pom.
Во-вторых, некоторые записи не попадают в предупреждения Dependabot.
В 2026 году Tomcat опубликовал 29 CVE, и часть из них по двум механизмам не появляется в предупреждениях для проектов Spring Boot:
| Механизм | Пояснение |
|---|---|
advisory имеет статус unreviewed | GitHub использует для предупреждений Dependabot только advisory со статусом reviewed. unreviewed — это нормальное состояние процесса: запись автоматически импортирована из NVD, а затронутые пакеты ещё не подтверждены вручную |
| Координаты не совпадают | advisory висит на координатах вида org.apache.tomcat:tomcat-coyote, а в дереве зависимостей Spring Boot есть только tomcat-embed-core / -el / -websocket |
Практический результат: для приложения Spring Boot со встроенным Tomcat 9.0.118, у которого панель Dependabot полностью зелёная, этот инструмент сообщит о 4 совпадениях, и одно из них эксплуатируется при конфигурации по умолчанию.
В-третьих, у двух систем оценок разные критерии, а вы видите только одну из них.
| ASF / официальный Tomcat | GitHub / NVD | |
|---|---|---|
| Уровень | Low / Moderate / Important / Critical | числовое значение CVSS |
Из 29 записей у 17 расхождение между двумя системами оценок составляет 2 уровня и более; самый крайний случай — CVE-2026-41293: официально Low, на GitHub critical, CVSS 9.8.
Это не чья-то ошибка. Две системы по определению измеряют разные вещи. Но чтобы решить, «стоит ли обновляться прямо сейчас», вам нужно видеть их обе — а также то, включена ли у вас эта функция.
java -jar tomcat-check.jar <jar 或目录> ...
--all 连「不适用」的条目也列出来
--utf8 Windows 控制台中文乱码时加这个
# Spring Boot fat jar
java -jar tomcat-check.jar target/my-app.jar
# 独立安装的 Tomcat
java -jar tomcat-check.jar /opt/tomcat
# 整个依赖目录
java -jar tomcat-check.jar target/lib
Требуется Java 17+.
Для каждого совпадения вывод содержит: две системы оценок, условия срабатывания, оригинальный текст официального описания и то, появится ли эта запись в ваших предупреждениях Dependabot. В конце приводится целевая версия для обновления, которая покрывает все совпадения.
unreviewed — это нормальное состояние процесса.tools/gen_rules.py генерирует CveTable.java из двух первоисточников — ни одна строка не переписана вручную:
https://tomcat.apache.org/security-{9,10,11}.html — официальные оценки, заголовки, оригинальные описания, затронутые диапазоны версийtype, затронутые координаты MavenПроцесс генерации включает 7 утверждений (assertions): если хоть одно не выполняется, процесс останавливается и файл не записывается. Три из них стоит рассмотреть отдельно:
<strong>Moderate: The fix for <a>CVE-2025-66614</a> was incomplete</strong> <a>CVE-2026-32990</a>.
Поиск «первой CVE» во всём блоке подхватит тот старый номер, что встроен в заголовок, и последствие — не «потеряна одна запись», а подмена:
одна CVE получает заголовок и описание другой, при этом генерация, тесты и проверка на реальных артефактах все проходят как обычно.Affects: стоит непосредственно перед заголовком следующей CVE,
и её очень легко сопоставить не с той записью — если ошибиться, получится таблица, которая «выглядит совершенно нормальной, но целиком сдвинута на одну позицию».
Делается перекрёстная проверка с first_patched_version из GitHub — во время разработки это действительно помогло поймать одно смещение.tomcat-embed-*.
Основанием исключения должен быть фактический замер, а не «я помню».Перегенерировать:
python tools/gen_rules.py
mvn clean package # → target/tomcat-check.jar
34 теста. Ноль зависимостей в рантайме, JUnit только на этапе тестирования.
MIT
| Критерий | реальная эксплуатируемость при конфигурации по умолчанию | механический расчёт по вектору, без учёта того, включена ли у вас эта функция |
| Где смотреть | tomcat.apache.org/security-9.html | Dependabot присылает напрямую |