
Proof-of-concept di exploit per CVE-2026-39987, un RCE pre-autenticazione nell'endpoint WebSocket /terminal/ws di Marimo che fornisce una shell interattiva senza credenziali.
CVSS 4.0: 9.3 (Critico) · AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H
Interessa: marimo <= 0.20.4 · Corretto: 0.23.0 · CWE-306 (Autenticazione Mancante)
Advisory: GHSA-2679-6mx9-h9xc · Fix: marimo-team/marimo@c24d480
L'endpoint WebSocket /terminal/ws (marimo/_server/api/endpoints/terminal.py)
controlla solo la modalità di sessione (EDIT) e il supporto della piattaforma prima di accettare la
connessione e chiamare pty.fork(). Non porta né un decoratore @requires(...)
né una chiamata a validate_auth().
Confronto misurato nella 0.20.4:
@requires(...) su 18 endpoint./ws (notebook) -> 2 chiamate a .validate_auth()terminal.py -> 0 @requires, 0 validate_auth. <-- il difetto.Il middleware AuthBackend protegge HTTP e il websocket /ws, ma
/terminal/ws accetta la connessione senza cookie e senza token e avvia una
shell PTY con i privilegi del processo marimo.
marimo edit ...), che è la modalità predefinita dell'editor.pty (Linux/macOS; Windows e Pyodide non sono interessati).Un attaccante che può raggiungere un server marimo edit attraverso la rete (comune in
deployment remoti / container, spesso in esecuzione come root) ottiene una shell
interattiva senza autenticarsi: furto di credenziali (cat .env), movimento laterale,
distribuzione di malware. Sfruttato in the wild < 10 h dopo la divulgazione; aggiunto al catalogo
KEV di CISA il 2026-04-23.
pip install "marimo==0.20.4" websockets
marimo edit demo.py --headless --port 2718 --token --token-password SECRET
python exploit.py ws://127.0.0.1:2718 "id; cat /etc/passwd"
exploit.py non invia token, cookie né header Authorization. Invia il
comando come testo grezzo + "\r" (Invio), esattamente come un utente lo digiterebbe nel terminale.
/ws -> 403 (l'autenticazione FUNZIONA)./terminal/ws SENZA token -> ACCETTATO. Eseguito sul server:
uid=1000() gid=1000() ...
Linux ...
e ha scritto /tmp/cve_2026_39987_proof.txt -> RCE confermato.Aggiornare a marimo >= 0.23.0. Mitigazione temporanea: non esporre marimo edit
a reti non attendibili; mettere l'editor dietro un proxy autenticato; eseguirlo
senza privilegi / in un container senza segreti.
Solo per test di sicurezza autorizzati e uso educativo. Eseguirlo solo contro sistemi di tua proprietà o per i quali hai esplicita autorizzazione al test.