
Prueba de concepto de exploit para CVE-2026-39987, un RCE de preautenticación en el endpoint WebSocket /terminal/ws de Marimo que proporciona una shell interactiva sin credenciales.
CVSS 4.0: 9.3 (Crítico) · AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H
Afecta a: marimo <= 0.20.4 · Parcheado: 0.23.0 · CWE-306 (Autenticación Faltante)
Aviso: GHSA-2679-6mx9-h9xc · Corrección: marimo-team/marimo@c24d480
El endpoint WebSocket /terminal/ws (marimo/_server/api/endpoints/terminal.py)
solo verifica el modo de sesión (EDIT) y el soporte de la plataforma antes de aceptar la
conexión y llamar a pty.fork(). No lleva ni un decorador @requires(...)
ni una llamada a validate_auth().
Contraste medido en 0.20.4:
@requires(...) en 18 endpoints./ws (notebook) -> 2 llamadas a .validate_auth()terminal.py -> 0 @requires, 0 validate_auth. <-- el fallo.El middleware AuthBackend protege HTTP y el websocket /ws, pero
/terminal/ws acepta la conexión sin cookie y sin token y bifurca un
shell PTY con los privilegios del proceso de marimo.
marimo edit ...), que es el modo por defecto del editor.pty (Linux/macOS; Windows y Pyodide no se ven afectados).Un atacante que pueda alcanzar un servidor marimo edit a través de la red (común en
despliegues remotos / en contenedores, a menudo ejecutándose como root) obtiene un shell
interactivo sin autenticarse: robo de credenciales (cat .env), movimiento lateral,
despliegue de malware. Explotado en la naturaleza < 10 h después de la divulgación; añadido al
catálogo KEV de CISA el 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 no envía token, ni cookie, ni cabecera Authorization. Envía el
comando como texto plano + "\r" (Enter), exactamente como lo escribiría un usuario en la terminal.
/ws -> 403 (la autenticación SÍ funciona)./terminal/ws SIN token -> ACEPTADO. Ejecutado en el servidor:
uid=1000() gid=1000() ...
Linux ...
y escribió /tmp/cve_2026_39987_proof.txt -> RCE confirmado.Actualizar a marimo >= 0.23.0. Mitigación temporal: no exponer marimo edit
a redes no confiables; colocar el editor detrás de un proxy autenticado; ejecutarlo
sin privilegios / en un contenedor sin secretos.
Solo para pruebas de seguridad autorizadas y uso educativo. Ejecútalo únicamente contra sistemas que poseas o para los que tengas permiso explícito de probar.