
CVE-2025-55752 CVE-2025-55754 CVE-2025-48988 CVE-2025-52520 CVE-2025-53506 CVE-2025-61795 CVE-2025-66614:Tomcat 8.5 достиг EOL, финальная версия 8.5.100. Apache по пунктам заявляет, что «8.5 также затронут» для 14 CVE 2025 года, из которых 10 не находятся в NVD при проверке по 8.5.100. Офлайн-одиночный jar, читает conf/, чтобы определить, какие именно из них затрагивают вас.
Всё ещё крутите Tomcat 8.5?Этот инструмент покажет вам, какие именно CVE 2025 года вас касаются — потому что на официальных страницах, в NVD и у сканеров вы не получите полного ответа на этот вопрос.
Один jar без зависимостей, работает офлайн, без интернета и без загрузки куда-либо данных.
Tomcat 8.5 достиг EOL 2024-03-31, финальная версия — 8.5.100 (выпущена 2024-03-19). После этого Apache продолжает в записях CVE указывать, что «8.5 тоже затронут», но это написано там, куда меньше всего заглядывают.
На официальной странице безопасности Apache для 9.x перечислено 17 записей CVE-2025-*, из которых 14 дословно содержат:
The following versions were EOL at the time the CVE was created but are known to be affected: 8.5.x though 8.5.100
(так в оригинале — в 8 из 14 записей
throughнаписано с ошибкой какthough; нижняя граница в основном8.5.0, но встречаются8.5.6/8.5.44/ / )
8.5.608.5.90Эти 14 записей в трёх местах выглядят по-разному:
| Где вы обычно смотрите | Что вы увидите |
|---|---|
Официальная страница безопасности Apache для 8.5 (security-8.html) | Ноль записей за 2025 год — страница заканчивается на 2024-02-19 Fixed in Apache Tomcat 8.5.99 |
| NVD | Если искать 8.5.100 по cpe, из этих 14 вернутся только 4; в конфигурации cpe остальных 10 записей 8.5 вообще отсутствует |
| GitHub advisory | Все 14 на месте, но first_patched_version для 8.5 везде null |
Единственное место, где всё это описано полностью — оригинальные записи на CVE.org, где Apache выступает как CNA — то есть тот слой, который меньше всего кто-либо открывает. Этот инструмент берёт информацию именно оттуда и сопоставляет её с реально установленной у вас версией.
🔴 Этот инструмент описывает расхождения между источниками данных, а не поведение какого-либо продукта. «Сообщит ли ваш сканер об этих 10 записях» зависит от того, какую базу он читает и как объединяет данные — это не проверялось, поэтому здесь об этом не написано.
Если сообщать только по номеру версии, то 12 записей, требующих особой конфигурации, тоже будут помечены как «вы затронуты» — это заставит вас делать то, что не нужно.
Поэтому при указании каталога установки инструмент читает все XML из conf/ (включая conf/Catalina/<host>/),
удаляет блоки комментариев и затем ищет маркеры условий срабатывания. Удаление комментариев — не опция:
в официальном server.xml текстовый поиск UpgradeProtocol даёт 1 совпадение, а после удаления комментариев — 0, потому что весь фрагмент закомментирован.
Для официальной чистой установки 8.5.100 результат выглядит так:
Затронуто по умолчанию: 2 · Конфигурация подтверждена: 0 · Требуется ручная проверка: 11 · Не применимо: 1
Из них 10 записей отсутствуют в конфигурации cpe в NVD
Если в той же конфигурации включить HTTP/2, RewriteValve и CGIServlet, «конфигурация подтверждена» становится 5.
java -jar tomcat85-check.jar <каталог установки | jar | war> ...
--all также выводить записи, где «версия вне диапазона»
--utf8 добавляйте при кракозябрах в китайской консоли Windows
# Распакованный Tomcat — передайте уровень, содержащий conf/, чтобы сильно сократить ручную работу
java -jar tomcat85-check.jar /opt/tomcat
# Можно сканировать и один jar / war
java -jar tomcat85-check.jar /opt/app/lib/catalina.jar
В именах jar из lib/ нет ни одного номера версии (это catalina.jar, а не catalina-8.5.100.jar).
Инструменты, определяющие версию только по имени файла, в таких установках не распознают ничего —
а «ничего не найдено» выглядит точно так же, как «вы в безопасности».
Этот инструмент определяет версию в таком порядке:
server.number из catalina.jar!/org/apache/catalina/util/ServerInfo.properties
— именно его выводит собственный version.sh от TomcatImplementation-Version из META-INF/MANIFEST.MFЕсли два источника не совпадают (ServerInfo.properties можно переопределить, это часто используют для скрытия версии),
выводятся оба значения, выбор за вами.
Первое: подтвердить включение можно, подтвердить отсутствие — нельзя.
«Не найдено» в отчёте означает «не найдено в просмотренных мной файлах», а не «у вас не включено».
Конфигурация может находиться там, куда инструмент не смотрит: WEB-INF/web.xml внутри war, внешний CATALINA_BASE, параметры запуска.
Поэтому категории «не затронут» не существует — всё, что не найдено, попадает в требует ручной проверки.
Второе: даже если найдено, это не всегда означает именно то.
Например, в официальном server.xml по умолчанию AprLifecycleListener уже включён,
но он лишь пытается загрузить нативную библиотеку — если библиотеки нет, APR-коннектор не активируется.
Поэтому это «слабый маркер»: при совпадении сообщается только «возможно», а не «подтверждено».
Третье: версии 8.5, на которую можно обновиться, не существует.
first_patched_version для всех 14 записей со стороны 8.5 — null.
Это не «ещё не исправили», а «для 8.5 исправлять не будут». Единственный выход — перейти на другую ветку (9.0 / 10.1 / 11.0).
Этот инструмент отвечает на вопрос «чем вы затронуты» и не делает вид, что может ответить «до какой версии 8.5 обновляться».
Возьмём CVE-2025-55754 — все четыре числа настоящие:
| Кто присвоил | Значение |
|---|---|
| Apache (четырёхуровневая шкала ASF) | low |
| GitHub advisory | low |
| CVSS v3.1 (именно его берёт NVD) | 9.6 critical |
| CVSS v4.0 | 2.1 |
Если смотреть только на NVD, можно решить, что это самая серьёзная запись; только на Apache — что можно игнорировать. Оба не ошибаются — Apache оценивает реальную эксплуатируемость при конфигурации по умолчанию, а CVSS считается механически по вектору, не учитывая, включена ли у вас эта функция.
Поэтому инструмент печатает все четыре числа и явно сообщает, когда две стороны расходятся в оценке.
Apache использует low / moderate / important / critical, GitHub — low / medium / high / critical.
Основание для выравнивания —原文 с официальной security-impact.html от Tomcat:
Important / High — A vulnerability rated as Important (or High) impact is one which could result in the compromise of data or availability of the server.
→ Important и High — это два названия одного уровня, так написано самим проектом.
🔴 А вот официального заявления о соответствии moderate и medium нет, и инструмент сам их не приравнивает —
Moderate от ASF описывает условия эксплуатируемости вроде «есть существенные смягчающие факторы / не влияет на типовую конфигурацию / требуется аутентификация»,
а medium от GitHub — это диапазон баллов CVSS; это разные вещи. В таком случае сообщается «официально эти два уровня не объявлены равными» и приводятся оба.
По такой методике из 14 записей 5 имеют существенно разные оценки (самый большой разрыв — CVE-2025-52520: Apache low / GitHub high),
2 не выравниваются, 7 совпадают.
Таблица判定 CveTable.java генерируется, ни одна строка не вписана вручную:
python -u tools/fetch_sources.py # загрузить три первоисточника → tools/sources.json
python -u tools/gen_table.py # сгенерировать CveTable.java (5 утверждений; файл не записывается, если хоть одно не прошло)
| Источник | Для ответа на вопрос |
|---|---|
| CVE.org (оригинальные записи Apache как CNA) | Заявил ли сам Apache, что «затронут 8.5», и каков диапазон |
| NVD | Есть ли запись для 8.5 в конфигурации cpe |
| GitHub advisory | severity, затронутые координаты Maven, есть ли исправленная версия для 8.5 |
Перед публикацией/релизом дополнительно запускается проверка по независимой методике — она не читает указанный выше sources.json,
а разбирает сгенерированный CveTable.java и затем ещё раз запрашивает NVD по cpe:
python -u tools/recheck_before_publish.py
Этот шаг не для галочки: при первом же запуске он поймал настоящую ошибку. Генерирующий скрипт при определении «есть ли 8.5 в NVD» учитывал только случаи, где «нижняя граница диапазона начинается с
8.5», а вCVE-2025-24813указаноversionStartIncluding=None .. versionEndExcluding=9.0.99— нижняя граница открыта, значит, 8.5 покрывается. Из-за этого разность посчитала на одну запись больше. Построчная проверка поcveIdэтого никогда бы не выявила; помогло только переключение на пользовательский подход «запросить 8.5.100 по cpe».
mvn package # → target/tomcat85-check.jar
mvn test # 59 тестов
Требуется JDK 17+. Во время выполнения ноль зависимостей, JUnit только для тестов.
MIT — см. LICENSE