
A proof-of-concept for CVE-2026-39987
Descargo de responsabilidad Este script es SOLO para fines educativos y de pruebas autorizadas. El uso no autorizado de esta herramienta contra sistemas sin permiso explícito es ILEGAL. El autor no es responsable de ningún uso indebido de esta información.
Las versiones de Marimo anteriores a 0.23.0 tienen una vulnerabilidad crítica de ejecución remota de comandos (RCE) sin autenticación previa. El endpoint /terminal/ws no implementa controles de acceso adecuados, lo que permite a un atacante no autenticado obtener acceso completo a un shell interactivo del sistema.
| Detalles | Información |
|---|---|
| CVE | CVE-2026-39987 |
| Gravedad | CRÍTICA |
| Puntuación CVSS | 9.3 (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| Tipo | Ejecución remota de código (RCE) sin autenticación previa |
| Vector | WebSocket (/terminal/ws) |
| Producto afectado | Marimo < 0.23.0 |
| Parche | Marimo ≥ 0.23.0 |
http.favicon.hash:-1864630356
services.http.response.favicons.hashes: -1864630356
-1864630356/api/versionRequiere Python 3.10+. Las dependencias se gestionan con uv, de Astral.
# install uv (skip if already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
uv pip install -r requirements.txt
uv run poc.py -t <target_url>
-t, --target_url (obligatorio): URI WebSocket del endpoint /terminal/ws del objetivo.uv run poc.py -t wss://<target-host>/terminal/ws
Una vez conectado, obtienes una sesión pty interactiva sin procesar. Comandos adicionales disponibles localmente (nunca se envían al shell remoto tal como se escriben):
Pulsa Ctrl+C para interrumpir/salir.
>= 0.23.0, que corrige la falta de control de acceso en /terminal/ws.localhost o a una interfaz interna y colócale delante una VPN/bastión para el acceso remoto./terminal/ws y de otras rutas de API./terminal/ws y la actividad de shell no autenticada en los registros del servidor; los dorks de Shodan/Censys anteriores también pueden usarse de forma defensiva para encontrar tus propias instancias expuestas y sin parchear.| Comando | Descripción |
|---|
.upload | Abre un prompt local para una ruta de archivo local y un destino remoto, y luego sube el archivo. |
!upload <local_path> <remote_path> | Igual que lo anterior, en una sola línea. |
!download <remote_path> <local_path> | Descarga un archivo del objetivo a tu máquina local. |
/exit, /bye | Finaliza la sesión localmente. |