
CVE-2025-55752 CVE-2025-55754 CVE-2025-48988 CVE-2025-52520 CVE-2025-53506 CVE-2025-61795 CVE-2025-66614:Tomcat 8.5 ha llegado a su fin de vida útil (EOL), versión final 8.5.100. Apache ha declarado individualmente que «8.5 también está afectado» en 14 CVEs de 2025, de las cuales 10 no se pueden encontrar en NVD consultando 8.5.100. Un único jar sin conexión, lee conf/ para determinar exactamente cuáles te afectan.
¿Todavía ejecutas Tomcat 8.5? Esta herramienta te dice exactamente qué CVE de 2025 te afectan — porque esta pregunta no tiene respuesta completa ni en las páginas oficiales, ni en NVD, ni en los escáneres.
Un único jar sin dependencias, funciona sin conexión, sin red y sin subir nada.
Tomcat 8.5 llegó a su EOL el 2024-03-31, y su versión final fue la 8.5.100 (publicada el 2024-03-19). Después de eso, Apache siguió declarando en los registros CVE, uno a uno, que «8.5 también está afectado», y el lugar donde lo dice es el que menos gente consulta.
La página de seguridad oficial de Apache para 9.x lista 17 CVE-2025-*, de los cuales 14 dicen textualmente:
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
(texto original — en 8 de las 14 entradas,
throughestá escrito comothough; el límite inferior suele ser8.5.0, aunque también hay8.5.6/8.5.44/ / )
8.5.608.5.90Esas 14 entradas, en los tres sitios donde la gente las consulta, se ven así:
| Dónde lo consultas | Lo que ves |
|---|---|
Página de seguridad oficial de Apache para 8.5 (security-8.html) | Cero entradas de 2025 — la página se detiene en 2024-02-19 Fixed in Apache Tomcat 8.5.99 |
| NVD | Si buscas 8.5.100 por cpe, de esas 14 solo devuelve 4; las otras 10 no tienen 8.5 en su configuración cpe |
| GitHub advisory | Las 14 están, pero en el lado de 8.5 el first_patched_version es null en todas |
El único sitio que documenta esto completo es el registro original que Apache, como CNA, envía a CVE.org — es decir, la capa que menos gente revisa. Lo que hace esta herramienta es confrontar la información de esa capa con la versión realmente instalada en tu máquina.
🔴 Esta herramienta expone diferencias entre fuentes de datos, no el comportamiento de un producto. «Si tu escáner reporta o no esas 10 entradas» depende de qué base lea y cómo la combine — eso no se ha probado, así que aquí no se escribe.
Reportar solo por número de versión equivale a decir que también «te afectan» las 12 entradas que solo se cumplen con una configuración específica — eso te haría hacer algo innecesario.
Por eso, cuando se le pasa un directorio de instalación, la herramienta lee todos los XML de conf/ (incluido conf/Catalina/<host>/),
elimina los bloques de comentarios y luego busca los marcadores de las condiciones que activan cada vulnerabilidad. Quitar comentarios no es opcional:
en el server.xml oficial, una búsqueda de texto de UpgradeProtocol da 1 coincidencia, pero tras quitar comentarios da 0 — el bloque entero está comentado.
Con una instalación limpia de la 8.5.100 oficial, el resultado es:
2 afectadas por defecto · 0 confirmadas por configuración · 11 requieren confirmación manual · 1 no aplica
de las cuales 10 no aparecen en la configuración cpe de NVD para 8.5
Si en esa misma configuración se activan HTTP/2, RewriteValve y CGIServlet, las «confirmadas por configuración» pasan a ser 5.
java -jar tomcat85-check.jar <directorio de instalación | jar | war> ...
--all incluye también las entradas «versión fuera del rango»
--utf8 añádelo si la consola de Windows muestra caracteres chinos corruptos
# Tomcat desplegado desde un directorio — pasa el nivel que contiene conf/, ahorrarás mucho trabajo manual
java -jar tomcat85-check.jar /opt/tomcat
# Con un solo jar / war también se puede escanear
java -jar tomcat85-check.jar /opt/app/lib/catalina.jar
Los jars de lib/ no llevan ningún número de versión en el nombre del archivo (son catalina.jar, no catalina-8.5.100.jar).
Las herramientas que solo extraen la versión del nombre de archivo no reconocen ni una sola en este tipo de despliegues —
y «no se ha escaneado nada» se ve exactamente igual que «estás seguro».
Esta herramienta obtiene la versión en este orden:
server.number de catalina.jar!/org/apache/catalina/util/ServerInfo.properties
— es lo que reporta el propio version.sh de TomcatImplementation-Version del META-INF/MANIFEST.MFCuando las dos fuentes no coinciden (ServerInfo.properties se puede sobrescribir, y se usa a menudo para ocultar la versión),
se reportan ambas, sin elegir por ti.
Uno: se puede confirmar que está activado, no que no lo esté.
Que el informe diga «no encontrado» significa «no lo he encontrado en los archivos que he revisado», no «no lo tienes activado».
La configuración puede estar en sitios que esta herramienta no ve: WEB-INF/web.xml dentro de un war, un CATALINA_BASE externo, parámetros de arranque.
Por eso no existe la categoría «no afectado» — lo que no se encuentra cae siempre en requiere confirmación manual.
Dos: que se encuentre no siempre significa que sea eso.
Por ejemplo, en el server.xml oficial por defecto, AprLifecycleListener ya viene activado,
pero solo intenta cargar la librería nativa — si la librería no existe, el conector APR no se activa.
Así que es un «marcador débil»: si coincide, solo se reporta «posible», no «confirmado».
Tres: no hay ninguna versión 8.5 a la que actualizar.
El first_patched_version de las 14 entradas es null en el lado de 8.5.
No es que «aún no esté corregido», es que «no se corregirá para 8.5». La única salida es cambiar de línea (9.0 / 10.1 / 11.0).
Esta herramienta responde «qué te afecta», no pretende responder «a qué 8.5 actualizar».
Tomemos CVE-2025-55754 como ejemplo; los cuatro números son reales:
| Quién lo asigna | Valor |
|---|---|
| Apache (escala ASF de cuatro niveles) | low |
| GitHub advisory | low |
| CVSS v3.1 (el que adopta NVD) | 9.6 critical |
| CVSS v4.0 | 2.1 |
Si solo miras NVD, pensarás que es de lo más grave; si solo miras Apache, pensarás que puedes ignorarlo. Ninguno de los dos está equivocado — Apache califica la explotabilidad real en la configuración por defecto, mientras que CVSS se calcula mecánicamente según el vector, sin mirar si tienes o no activada esa función.
Por eso esta herramienta imprime los cuatro números y, cuando las dos partes no coinciden, lo dice explícitamente.
Apache usa low / moderate / important / critical, y GitHub usa low / medium / high / critical.
La base de la equiparación está en el texto original de security-impact.html de 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 y High son dos nombres para el mismo nivel; es el propio Apache quien los escribe juntos.
🔴 En cambio, Apache no ha dicho oficialmente que moderate y medium sean equiparables, y esta herramienta tampoco lo hace por él —
el Moderate de ASF define condiciones de explotabilidad como «tiene factores de mitigación significativos / no afecta a configuraciones comunes / requiere autenticación»,
mientras que el medium de GitHub es un rango de puntuación CVSS; no son lo mismo. En ese caso se reporta «Apache no ha dicho que estos dos niveles sean iguales» y se te muestran ambos.
Con este criterio, de las 14 entradas, 5 tienen valoraciones sustancialmente distintas entre ambas partes (la más extrema es CVE-2025-52520: Apache low / GitHub high),
2 no se pueden equiparar y 7 coinciden.
La tabla de decisión CveTable.java está generada, sin una sola línea copiada a mano:
python -u tools/fetch_sources.py # descarga las tres fuentes primarias → tools/sources.json
python -u tools/gen_table.py # genera CveTable.java (5 aserciones; si alguna falla, no escribe el archivo)
| Fuente | Sirve para responder |
|---|---|
| CVE.org (registro original de Apache como CNA) | si el propio Apache ha declarado «afecta a 8.5» y con qué rango |
| NVD | si la configuración cpe incluye 8.5 |
| GitHub advisory | severity, coordenadas Maven afectadas, si hay versión corregida en el lado de 8.5 |
Antes de publicar o anunciar, se ejecuta además una verificación con criterio independiente — no lee el sources.json anterior,
sino que analiza el CveTable.java generado y vuelve a consultar NVD por cpe:
python -u tools/recheck_before_publish.py
Este paso no es un mero trámite: en su primera ejecución ya detectó un error real. El script de generación, al decidir si «NVD tiene 8.5», solo reconocía los rangos cuyo límite inferior empezaba por
8.5, peroCVE-2025-24813declaraversionStartIncluding=None .. versionEndExcluding=9.0.99— con el límite inferior abierto, sí cubre 8.5. Por eso la diferencia se calculó con una entrada de más. ConsultarcveIduna a una jamás habría revelado ese fallo; solo lo destapó cambiar al criterio del usuario, «buscar 8.5.100 por cpe».
mvn package # → target/tomcat85-check.jar
mvn test # 59 pruebas
Requiere JDK 17+. Sin dependencias en tiempo de ejecución; JUnit solo para pruebas.
MIT — ver LICENSE