
Preuve de concept d'exploitation pour CVE-2026-39987, une RCE pré-authentification dans le point de terminaison WebSocket /terminal/ws de Marimo, offrant un accès shell PTY non authentifié.
Marimo <= 0.20.4 est affecté par une vulnérabilité RCE pré-authentification dans le point de terminaison WebSocket /terminal/ws.
Le point de terminaison vérifie le mode de l'application et la prise en charge du terminal, mais ne valide pas l'authentification avant d'accepter la connexion WebSocket. Il crée ensuite un shell PTY, permettant à un attaquant non authentifié d'exécuter des commandes avec les privilèges du processus Marimo.
Contrairement à d'autres points de terminaison WebSocket qui appellent validate_auth(), le point de terminaison vulnérable du terminal accepte la connexion directement :
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()
Le contrôle d'authentification manquant permet un accès non authentifié au PTY.
<= 0.20.4Le client CVE-2026-39987.py inclus se connecte à :
/terminal/ws
Mode interactif :
python3 CVE-2026-39987.py -i
Commande unique :
python3 CVE-2026-39987.py "id"
Configurez la cible en remplaçant DEFAULT_HOST dans le script.
Une exploitation réussie peut fournir un shell PTY non authentifié et une exécution arbitraire de commandes en tant qu'utilisateur du serveur Marimo.