
Prueba de concepto de exploit para CVE-2026-39987, una RCE de pre-autenticación en el endpoint WebSocket /terminal/ws de Marimo, que proporciona acceso a un shell PTY sin autenticación.
Marimo <= 0.20.4 se ve afectado por una vulnerabilidad de RCE previa a la autenticación en el endpoint WebSocket /terminal/ws.
El endpoint verifica el modo de la aplicación y la compatibilidad con terminal, pero no valida la autenticación antes de aceptar la conexión WebSocket. Luego crea un shell PTY, lo que permite a un atacante no autenticado ejecutar comandos con los privilegios del proceso de Marimo.
A diferencia de otros endpoints WebSocket que llaman a validate_auth(), el endpoint vulnerable de terminal acepta la conexión directamente:
if app_state.mode != SessionMode.EDIT:
await websocket.close(...)
return
if not supports_terminal():
await websocket.close(...)
return
await websocket.accept()
child_pid, fd = pty.fork()
La falta de verificación de autenticación permite el acceso no autenticado al PTY.
<= 0.20.4El cliente incluido CVE-2026-39987.py se conecta a:
/terminal/ws
Modo interactivo:
python3 CVE-2026-39987.py -i
Comando único:
python3 CVE-2026-39987.py "id"
Configure el objetivo reemplazando DEFAULT_HOST en el script.
Una explotación exitosa puede proporcionar un shell PTY no autenticado y la ejecución arbitraria de comandos como el usuario del servidor de Marimo.