Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-39987-Lab — # Lokale Docker-Umgebung zur Reproduktion von CVE-2026-39987, einer Pre-Auth-RCE in marimos Terminal-WebSocket. Vergleicht verwundbare und gepatchte Versionen mit PoC-Skripten mit geringstmöglichem Schadenspotenzial für die sicherheitstechnische Ausbildung. | Kitploit
Tools/GitHubGitHub/rootdirective-sec/cve-2026-39987-lab
Container-SicherheitSchwachstellenanalyseExploitationWebsicherheitLernen & BildungLabs & Praxis
GitHubrootdirective-sec/cve-2026-39987-lab

CVE-2026-39987-Lab

# Lokale Docker-Umgebung zur Reproduktion von CVE-2026-39987, einer Pre-Auth-RCE in marimos Terminal-WebSocket. Vergleicht verwundbare und gepatchte Versionen mit PoC-Skripten mit geringstmöglichem Schadenspotenzial für die sicherheitstechnische Ausbildung.

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
1vor 3 MonatenNoch nicht geprüft

CVE-2026-39987 — marimo Pre-Auth Terminal WebSocket RCE Lab

Lokales Docker-Lab nur für lokale Zwecke zur Reproduktion und zum Verständnis von CVE-2026-39987 in marimo. Dieses Projekt vergleicht einen verwundbaren marimo-Dienst mit einem gepatchten marimo-Dienst nebeneinander und demonstriert dann den Unterschied mit einem Proof-Skript mit minimalem Schaden.


Zusammenfassung

CVE-2026-39987 ist eine kritische Remote-Codeausführungsschwachstelle vor der Authentifizierung in marimo, einem reaktiven Python-Notebook-Framework.

Das verwundbare Verhalten existiert im Terminal-WebSocket-Endpunkt:

root@kitploit:~
/terminal/ws

In betroffenen Versionen kann dieser Endpunkt ohne gültige Authentifizierung erreicht werden und eine interaktive Terminalsitzung erstellen. Ein nicht authentifizierter Angreifer, der einen verwundbaren marimo-Edit-Server erreichen kann, kann Befehle mit den Rechten des marimo-Prozesses ausführen.

Dieses Lab reproduziert die Schwachstelle in einer kontrollierten lokalen Docker-Umgebung:

DienstVersionURLErwartetes Verhalten
vulnmarimo 0.20.4http://127.0.0.1:8081/terminal/ws akzeptiert nicht authentifizierte WebSocket-Verbindung
patchedmarimo 0.23.0http://127.0.0.1:8082/terminal/ws lehnt nicht authentifizierte WebSocket-Verbindung mit 403 Forbidden ab

Das Ziel ist nicht, einen einsatzbereiten Exploit bereitzustellen. Das Ziel ist, den beobachtbaren Sicherheitsunterschied zwischen verwundbaren und gepatchten Versionen mit lokalen, reproduzierbaren Beweisen zu zeigen.


Überblick über die Schwachstelle

Betroffene Komponente

Die betroffene Komponente ist der Terminal-WebSocket-Endpunkt von marimo:

root@kitploit:~
/terminal/ws

Dieser Endpunkt wird von der marimo-Edit-Umgebung verwendet, um Terminalfunktionen über eine browserverbundene WebSocket-Sitzung bereitzustellen.

Grundursache

Der verwundbare Endpunkt akzeptierte WebSocket-Verbindungen, ohne dieselben Authentifizierungsprüfungen durchzusetzen, die für geschützte marimo-Edit-Funktionen erwartet werden.

Der wichtige Unterschied ist:

root@kitploit:~
verwundbares Verhalten:
  nicht authentifizierter Client kann sich mit /terminal/ws verbinden
  Terminalsitzung wird erstellt
  Befehle können über den WebSocket gesendet werden

gepatchtes Verhalten:
  nicht authentifizierter Client wird abgelehnt
  WebSocket-Handshake schlägt mit 403 Forbidden fehl
  Terminalsitzung wird nicht erstellt

Der Patch fügt dem Terminal-WebSocket-Flow eine Authentifizierungsvalidierung hinzu, bevor eine Terminalsitzung eingerichtet werden darf.

Auswirkungen

Wenn ein verwundbarer marimo-Edit-Server in einem erreichbaren Netzwerk exponiert ist, kann ein nicht authentifizierter Angreifer Befehle als der Benutzer ausführen, der den marimo-Prozess ausführt.

In diesem Lab wird der marimo-Prozess absichtlich als Benutzer mit niedrigen Rechten und ohne Root-Rechte ausgeführt:

root@kitploit:~
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)

Dies hält die Demonstration sicherer, während die Schwachstelle dennoch bewiesen wird.


Ziele des Labs

Dieses Lab soll drei Dinge beweisen:

  1. Die verwundbare Version akzeptiert nicht authentifizierte WebSocket-Verbindungen zu /terminal/ws.
  2. Ein harmloser Befehl kann über diesen nicht authentifizierten Terminal-WebSocket ausgeführt werden.
  3. Die gepatchte Version lehnt denselben nicht authentifizierten WebSocket-Versuch mit 403 Forbidden ab.

Das Lab vermeidet absichtlich destruktive Befehle, Persistenz, Reverse Shells, Credential-Dumping oder jedes internetzugängliche Ziel.


Repository-Struktur

root@kitploit:~
.
├── docker-compose.yml
├── vuln/
│   ├── Dockerfile
│   └── notebook.py
├── patched/
│   ├── Dockerfile
│   └── notebook.py
├── poc/
│   ├── poc.py
│   ├── rce_poc.py
│   └── requirements.txt
├── SAFETY.md
├── README.md
└── .gitignore

Wichtige Dateien


Laborarchitektur

root@kitploit:~
Host-Maschine

127.0.0.1:8081  ─────►  vuln-Container
                         marimo 0.20.4
                         /terminal/ws akzeptiert nicht authentifizierten WebSocket

127.0.0.1:8082  ─────►  patched-Container
                         marimo 0.23.0
                         /terminal/ws lehnt nicht authentifizierten WebSocket ab

Beide Dienste exponieren den internen Port 2718 von marimo, aber die Host-Ports sind unterschiedlich:

root@kitploit:~
vuln    -> 127.0.0.1:8081
patched -> 127.0.0.1:8082

Die Dienste sind nur an 127.0.0.1 gebunden. Sie sind nicht dafür vorgesehen, einem LAN oder dem Internet ausgesetzt zu werden.


Hinweise zur Docker-Härtung

Die Container sind, wo möglich, mit mehreren Schutzmaßnahmen konfiguriert:

root@kitploit:~
- Ports nur an 127.0.0.1 binden
- als Nicht-Root-Benutzer ausführen
- Linux-Capabilities entfernen
- no-new-privileges aktivieren
- schreibgeschütztes Root-Dateisystem verwenden
- nur begrenzte tmpfs-Schreiborte bereitstellen
- Dienste in einem dedizierten Docker-Bridge-Netzwerk isolieren

Diese Kontrollen entfernen die Schwachstelle nicht vom verwundbaren Dienst. Sie reduzieren den Schadensradius der lokalen Demonstration.


Voraussetzungen

Getestete Annahmen:

root@kitploit:~
- Linux x86_64 oder macOS mit Docker Desktop
- Docker Compose v2
- Python 3.9+
- Nur Localhost-Tests

Erforderliche Tools:

root@kitploit:~
docker --version
docker compose version
python3 --version

Einrichtung

In das Projektverzeichnis wechseln oder es öffnen:

root@kitploit:~
cd cve-2026-39987

Beide Dienste bauen und starten:

root@kitploit:~
docker compose up -d --build

Prüfen, dass beide Container laufen:

root@kitploit:~
docker compose ps

Erwartete Dienste:

root@kitploit:~
cve-2026-39987-vuln
cve-2026-39987-patched

Versionen überprüfen

Version des verwundbaren Dienstes prüfen:

root@kitploit:~
docker compose exec vuln marimo --version

Erwartet:

root@kitploit:~
0.20.4

Version des gepatchten Dienstes prüfen:

root@kitploit:~
docker compose exec patched marimo --version

Erwartet:

root@kitploit:~
0.23.0

PoC-Abhängigkeiten installieren

Eine Python-Virtual-Environment erstellen:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate

Abhängigkeiten installieren:

root@kitploit:~
python -m pip install -r poc/requirements.txt

PoC mit minimalem Schaden

Das primäre Proof-Skript ist:

root@kitploit:~
poc/poc.py

Es versucht, sich mit folgendem zu verbinden:

root@kitploit:~
/terminal/ws

Dann sendet es nur harmlose Proof-Befehle:

root@kitploit:~
id
whoami
hostname

Es werden keine Reverse Shell, kein Dateischreiben, keine Persistenz, kein Credential-Zugriff und keine destruktiven Befehle verwendet.

Verwundbaren Dienst testen

Ausführen:

root@kitploit:~
python poc/poc.py --base-url http://127.0.0.1:8081

Erwartetes Ergebnis:

root@kitploit:~
[*] Target WebSocket: ws://127.0.0.1:8081/terminal/ws
[*] Sending benign proof command only: id; whoami; hostname
[+] websocket connected without credentials
[result] VULNERABLE: unauthenticated command execution observed
[proof]
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
marimo
<container-hostname>

Wenn das Skript rohe Terminalausgabe ausgibt, aber diesen Block enthält, ist die Schwachstelle weiterhin bestätigt:

root@kitploit:~
CVE39987_PROOF_START
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
marimo
<container-hostname>
CVE39987_PROOF_END

Das bedeutet, dass die WebSocket-Verbindung erfolgreich war und die Befehlsausgabe von der Terminalsitzung zurückkam.

Gepatchten Dienst testen

Ausführen:

root@kitploit:~
python poc/poc.py --base-url http://127.0.0.1:8082

Erwartetes Ergebnis:

root@kitploit:~
[*] Target WebSocket: ws://127.0.0.1:8082/terminal/ws
[*] Sending benign proof command only: id; whoami; hostname
[-] websocket connection rejected/failed: Handshake status 403 Forbidden
[result] not exploitable by this unauthenticated check

Dies zeigt, dass der gepatchte Dienst nicht authentifizierten Zugriff ablehnt, bevor eine Terminalsitzung erstellt wird.


Echtzeit-Lernclient

Die folgende Datei ist nur für lokales Lernen gedacht:

root@kitploit:~
poc/rce_poc.py

Sie demonstriert dasselbe Problem in einer eher Echtzeit-Weise, indem sie sich mit dem verwundbaren Terminal-WebSocket verbindet und Terminalinteraktion ermöglicht.

Verwenden Sie dies nur gegen das lokale Docker-Lab.

Gegen den verwundbaren Dienst ausführen

root@kitploit:~
python poc/rce_poc.py --base-url http://127.0.0.1:8081

Erwartetes Verhalten:

root@kitploit:~
[+] Connected successfully (Pre-Auth RCE)
✓ Interactive shell is ready to use!

Sichere Befehle zum Ausprobieren:

root@kitploit:~
id
whoami
hostname
pwd
python -c 'import marimo; print(marimo.__version__)'
exit

Gegen den gepatchten Dienst ausführen

root@kitploit:~
python poc/rce_poc.py --base-url http://127.0.0.1:8082

Erwartetes Verhalten:

root@kitploit:~
[-] Connection Failed: 403 Forbidden
[!] This is likely the PATCHED version.
    The WebSocket endpoint is now protected.

Sicherheitshinweis für den Echtzeitmodus

Der Echtzeitclient existiert, um zu verstehen, wie sich der verwundbare WebSocket verhält. Er sollte nicht gegen ein System außerhalb dieses lokalen Labs verwendet werden.

Für die Portfolio-Veröffentlichung ist der empfohlene primäre Beweis weiterhin poc/poc.py, da er begrenzt, wiederholbar und mit minimalem Schaden ist.


Erwarteter Sicherheitsunterschied

Das Hauptergebnis des Labs sollte wie folgt zusammengefasst werden:

root@kitploit:~
vuln / marimo 0.20.4:
  nicht authentifizierter WebSocket-Handshake zu /terminal/ws gelingt
  Ausgabe harmloser Befehle ist beobachtbar

patched / marimo 0.23.0:
  nicht authentifizierter WebSocket-Handshake zu /terminal/ws schlägt fehl
  Server gibt 403 Forbidden zurück
  keine Terminalsitzung wird erstellt

Dies ist der Kernbeweis für die CVE-Reproduktion.


Manuelle WebSocket-Prüfung

Wenn Sie das Verhalten manuell überprüfen möchten, verwenden Sie einen WebSocket-fähigen Client und verbinden Sie sich mit:

root@kitploit:~
ws://127.0.0.1:8081/terminal/ws
ws://127.0.0.1:8082/terminal/ws

Erwartet:

root@kitploit:~
8081 -> Verbindung akzeptiert
8082 -> 403 Forbidden

Die PoC-Skripte werden bevorzugt, da sie klarere Beweise liefern.


Erkennungs- und Überwachungsideen

In einer realen Umgebung sind nützliche Indikatoren:

root@kitploit:~
- WebSocket-Anfragen an /terminal/ws
- nicht authentifizierte Zugriffsversuche auf marimo-Edit-Server
- unerwartete Terminalsitzungen, die von marimo erzeugt werden
- Befehle, die vom marimo-Prozess gestartet werden
- Zugriff auf .env, SSH-Schlüssel, Cloud-Credentials oder Notebook-Geheimnisse
- ausgehender Netzwerkverkehr kurz nach /terminal/ws-Verbindungen

Beispielhafte lokale Artefakte zur Überprüfung:

root@kitploit:~
docker compose logs vuln
docker compose logs patched
docker compose ps
docker compose exec vuln ps aux

Bereinigung

Container stoppen und entfernen:

root@kitploit:~
docker compose down

Auch Volumes entfernen:

root@kitploit:~
docker compose down -v

Lokale Python-Virtual-Environment bei Bedarf entfernen:

root@kitploit:~
rm -rf .venv

Sicherheitsregeln

Dieses Repository dient nur der lokalen Sicherheitsforschung und Portfolio-Demonstration.

Erlaubt:

root@kitploit:~
- Localhost-Tests
- Nur-Docker-Reproduktion
- harmlose Proof-Befehle wie id, whoami, hostname
- Vergleich von verwundbarem und gepatchtem Verhalten
- Dokumentation von Grundursache und Erkennungsideen

Nicht erlaubt:

root@kitploit:~
- Tests gegen öffentliche marimo-Server
- Tests von Systemen, die Sie nicht besitzen oder verwalten
- Reverse Shells
- Persistenz
- Credential-Diebstahl
- destruktive Befehle
- laterale Bewegung
- Botnet- oder Malware-Verhalten

Haftungsausschluss

Dieses Projekt ist nur für autorisierte lokale Tests und defensive Sicherheitsschulung gedacht. Verwenden Sie diese Skripte nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche Erlaubnis zum Testen haben.


Referenzen

  • GitHub Security Advisory — GHSA-2679-6mx9-h9xc:
    https://github.com/advisories/GHSA-2679-6mx9-h9xc

  • NVD — CVE-2026-39987:
    https://nvd.nist.gov/vuln/detail/CVE-2026-39987

  • marimo-Upstream-Repository:
    https://github.com/marimo-team/marimo

  • Patch-Commit — Authentifizierungsvalidierung zum Terminal-WebSocket hinzufügen:
    https://github.com/marimo-team/marimo/commit/c24d4806398f30be6b12acd6c60d1d7c68cfd12a

  • Patch-PR — marimo PR #9098:
    https://github.com/marimo-team/marimo/pull/9098

Tool herunterladen
DateiZweck
docker-compose.ymlDefiniert verwundbare und gepatchte marimo-Dienste
vuln/DockerfileErstellt den verwundbaren marimo-Dienst
patched/DockerfileErstellt den gepatchten marimo-Dienst
vuln/notebook.pyMinimale marimo-Notebook-Datei, die vom verwundbaren Dienst verwendet wird
patched/notebook.pyMinimale marimo-Notebook-Datei, die vom gepatchten Dienst verwendet wird
poc/poc.pyProof-Skript mit minimalem Schaden, das nur harmlose Befehle ausführt
poc/rce_poc.pyEchtzeit-Lernclient zur Beobachtung des Terminalverhaltens im lokalen Lab
poc/requirements.txtPython-Abhängigkeiten für PoC-Skripte
SAFETY.mdSicherheitsregeln und Scope-Grenzen