Cómo asegurar un servidor MCP: checklist de blindaje para builders (con los CVE de 2026) — Cesar Ayala
← Todos los artículos

Cómo asegurar un servidor MCP: checklist de blindaje para builders (con los CVE de 2026)

Para asegurar un servidor MCP: fija y audita las versiones, enlázalo a localhost con autenticación (nunca 0.0.0.0), trata toda descripción de herramienta y dato externo como no confiable, usa allowlist con privilegios mínimos, aísla archivos y shell en sandbox, separa inquilinos y exige aprobación humana para cualquier acción de pago o datos fiscales. MCP salió antes que su seguridad: niega por defecto.

¿Por qué MCP se volvió un problema de seguridad en 2026?

El Model Context Protocol explotó en adopción este año, y su superficie de ataque explotó con él. La cifra que importa: más de 30 CVE presentados contra el ecosistema MCP en aproximadamente 60 días desde enero de 2026. No es un goteo de bugs menores; es un patrón.

Y no es teórico. El paquete mcp-remote envió CVE-2025-6514, una falla de remote code execution con CVSS 9.6, en un paquete con más de 437,000 descargas antes de la divulgación. Fue la primera vulnerabilidad MCP con alcance masivo documentado en el mundo real: un servidor malicioso podía ejecutar comandos en tu máquina con solo conectarte.

Mi opinión, etiquetada como tal: MCP es genuinamente poderoso, pero el ecosistema salió antes que su historia de seguridad. Y aquí está la parte que cambia todo para quienes construimos en producción: si conectas servidores a un agente que puede tocar pagos o datos fiscales, tú eres ahora la frontera de seguridad. No el proveedor, no la especificación. Tú.

Este post no es un MCP 101. Es el checklist operativo, hazlo-hoy, que los blogs de lanzamiento y la documentación se saltan. Si todavía estás en la etapa de conectar un agente a sus datos y herramientas, vuelve aquí antes de exponer cualquier scope sensible.

CVE en ~60 días30+ contra el ecosistema MCP (desde ene 2026)
mcp-remoteCVE-2025-6514 — CVSS 9.6 RCE, 437K+ descargas
MCPJam InspectorCVE-2026-23744 — 0.0.0.0 sin auth, RCE sin clics
Servers con file ops82% vulnerables a path traversal (confirmar vigencia 2026)

¿Cuáles son las peores vulnerabilidades reales de MCP hasta ahora?

Tres incidentes concretos, con CVE y números exactos, dejan claro el tipo de bug que estamos enfrentando.

mcp-remote — CVE-2025-6514 (CVSS 9.6). Un servidor MCP malicioso puede incrustar un comando durante la fase de conexión y autorización que se ejecuta en el sistema operativo del cliente. Afecta las versiones 0.0.5 a 0.1.15; corregido en 0.1.16. Compromiso total del sistema con solo conectarte a un servidor no confiable.

MCPJam Inspector — CVE-2026-23744. Las versiones ≤ 1.4.2 escuchan en 0.0.0.0 sin autenticación en un endpoint crítico. Una petición HTTP diseñada a propósito puede instalar servidores MCP y ejecutar código arbitrario sin ninguna interacción del usuario: cero clics, explotable por cualquier atacante en la misma red — o desde internet si el host expone una IP pública. Corregido en 1.4.3.

OX Security — vulnerabilidad de MCP-core. OX Security divulgó una vulnerabilidad sistémica de command injection que abarca más de 150 millones de descargas acumuladas a través de los cuatro SDKs oficiales de MCP (Python, TypeScript, Java, Rust) y productos afectados, exponiendo datos, bases de datos internas, API keys e historial de chat.

El patrón salta a la vista: los bugs peligrosos no son exóticos. Son endpoints sin autenticación, confianza ciega en input que envía el servidor, y cadenas de suministro sin fijar. Cosas aburridas. Cosas prevenibles.

¿Qué tan grave es a gran escala? ¿Qué muestran los escaneos?

Si crees que son unos cuantos paquetes malos, los escaneos cuentan otra historia. Un análisis de 2,614 implementaciones MCP encontró que el 82% de las que manejan operaciones de archivos eran vulnerables a path traversal. El 67% de las implementaciones escaneadas cargaban riesgo de code injection. Y de 518 servidores MCP registrados oficialmente, entre el 38% y el 41% no ofrecían autenticación significativa.

(Estos números son de escaneos publicados en 2026; trátalos como una foto del momento y confirma la cifra vigente antes de citarla en algo formal.)

La conclusión operativa es brutal pero simple: asume que un servidor es vulnerable hasta que verifiques lo contrario. La tasa base de auth rota y acceso a archivos sin sandbox es demasiado alta para confiar por defecto. Esto, justamente, es lo que justifica un checklist en lugar de arreglos caso por caso. No estás cazando una excepción rara; estás endureciendo contra la norma.

¿Cuáles son las 5 familias de ataque (y la defensa de cada una)?

Antes del checklist, el modelo mental. Casi todo lo que verás cae en cinco familias, y cada una tiene una defensa directa.

1. Tool poisoning. Instrucciones maliciosas escondidas en la descripción o el schema de una herramienta dirigen al agente. Defensa: trata toda descripción de herramienta como no confiable; no dejes que la metadata de una tool maneje acciones de forma silenciosa.

2. Prompt injection vía datos externos. Texto del atacante en contenido recuperado o en la salida de una tool secuestra al agente. Defensa: nunca dejes que la salida de una tool auto-ejecute acciones de alto riesgo; mantén una frontera de confianza explícita.

3. Trust bypass. Endpoints sin autenticación, binds a 0.0.0.0 y persistencia vía configs de servidor manipuladas (el patrón de MCPJam, y también de MCPoison — CVE-2025-54136 en Cursor). Defensa: localhost más auth en cada servidor, y trata cualquier cambio de config de un servidor MCP como un evento de seguridad.

4. Supply-chain. Un paquete MCP comprometido o con typosquatting (los patrones de mcp-remote y de las 150M de descargas). Defensa: fija y audita versiones.

5. Cross-tenant. Un tenant lee o actúa sobre los datos de otro. Defensa: aislamiento duro entre tenants y credenciales con scope. Como ejemplos reales del ecosistema MCP, el abanico de incidentes abarca WhatsApp MCP, GitHub MCP, Cursor IDE (MCPoison) e incluso los propios servidores de Anthropic, según The Hacker News.

Familia de ataque

  • Tool poisoning — schema/descripción maliciosa
  • Prompt injection — texto del atacante en datos externos
  • Trust bypass — endpoint sin auth, bind 0.0.0.0, config manipulada
  • Supply-chain — paquete comprometido o typosquat
  • Cross-tenant — un tenant lee datos de otro

Defensa directa

  • Tratar toda descripción de tool como no confiable
  • No auto-ejecutar acciones desde salida de tool
  • localhost + auth; cambio de config = evento de seguridad
  • Fijar y auditar versiones
  • Aislamiento entre tenants + credenciales con scope

El checklist de blindaje: ¿qué cierro y en qué orden?

Este es el núcleo del post. Un orden, no una lista de buenos deseos. Hazlo de arriba hacia abajo.

1. Fija y audita las versiones de los paquetes MCP (supply chain). Nada de rangos flotantes. Revisa el changelog antes de subir de versión. Un rango sin fijar jala de forma automática una versión futura comprometida.

2. Nunca enlaces un servidor o inspector MCP a 0.0.0.0 — localhost más auth. Exige autenticación en cada servidor, no solo en los públicos. El “está en mi red interna” no es una defensa.

3. Trata toda descripción de herramienta y todo dato externo como no confiable (tool poisoning más prompt injection). No dejes que la salida de una tool maneje acciones en silencio.

4. Usa allowlist y otorga scopes de privilegio mínimo. Default-deny; habilita por herramienta, una por una.

5. Aísla en sandbox el acceso a archivos y shell (path traversal). Chroot o contenedor; nada de filesystem crudo.

6. Aísla tenants y dale scope a las credenciales para que ningún servidor pueda leer de forma cruzada.

7. Exige human-in-the-loop para acciones de alto riesgo: cualquier cosa que toque pagos, reembolsos o datos de cliente o fiscales.

Así se ve un bind correcto y un allowlist de privilegio mínimo, en concreto:

# mcp-server.toml — enlaza a loopback, nunca a 0.0.0.0
[server]
host = "127.0.0.1"        # localhost only; NO exponer a la red
port = 8765
require_auth = true        # auth obligatoria, incluso en local

[auth]
type = "bearer"
token_env = "MCP_SERVER_TOKEN"   # secreto vía env, no hardcodeado
# allowlist default-deny: solo corren las tools listadas, con scope mínimo
ALLOWED_TOOLS = {
    "buscar_factura":  {"scopes": ["facturas:read"]},        # solo lectura
    "leer_cliente":    {"scopes": ["clientes:read"]},        # sin write
    # "emitir_reembolso" NO está aquí: pagos = aprobación humana aparte
}

def autorizar(tool_name: str) -> list[str]:
    if tool_name not in ALLOWED_TOOLS:
        raise PermissionError(f"tool no permitida (default-deny): {tool_name}")
    return ALLOWED_TOOLS[tool_name]["scopes"]

Si vienes migrando, revisa también la migración al spec stateless MCP 2026-07-28: varios de estos defaults de sesión y transporte cambiaron ahí.

  1. Fijar y auditar versionesSin rangos flotantes; lee el changelog antes de subir
  2. localhost + auth (no 0.0.0.0)Auth en cada servidor, no solo en los públicos
  3. Tool descriptions + datos externos = no confiablesLa salida de una tool no maneja acciones sola
  4. Allowlist + privilegio mínimoDefault-deny; habilita por herramienta
  5. Sandbox de archivos y shellChroot o contenedor; nada de filesystem crudo
  6. Aislar tenantsCredenciales con scope; sin lecturas cruzadas
  7. Human-in-the-loop para pagosReembolsos, datos de cliente o fiscales = pausa humana

¿Cómo se ve realmente una petición blindada?

Junta el checklist en un solo camino y deja de ser una lista para convertirse en una ruta de petición. El agente llega a una tool del allowlist (la compuerta default-deny), entra a un scope en sandbox (archivo y shell contenidos), pasa por un chequeo de auth en el servidor, y para acciones de alto riesgo o de pago llega a una compuerta de aprobación humana.

Cada salto es un checkpoint, no un trámite. Una tool no listada nunca corre. Una tool en sandbox no puede hacer path traversal. Una llamada sin autenticar se rechaza. Y un reembolso o una escritura fiscal se pausa para un humano.

La conexión con pagos, desde mi propio trabajo con Stripe y LATAM: la compuerta de human-in-the-loop no es negociable. Un agente que puede emitir un reembolso o leer el RFC de un cliente está a una prompt injection de un chargeback o de un incidente de fuga de datos. No es paranoia; es el peor caso esperado.

Límite honesto: este blindaje reduce el riesgo, no lo elimina. Un compromiso decidido de supply chain o una inyección novedosa todavía pueden colarse por una capa. Por eso se ponen capas; no confíes en una sola. Y si quieres el contexto de fondo sobre qué es un agente de IA que usa estas herramientas, ahí está la base.

AgenteEmite la petición de la herramienta
Tool del allowlistCompuerta default-deny: lo no listado no corre
Scope en sandboxArchivo y shell contenidos; sin path traversal
Chequeo de authLa llamada sin autenticar se rechaza
Aprobación humanaPago, reembolso o dato fiscal: pausa para un humano

Preguntas frecuentes sobre seguridad MCP

¿Es seguro conectarme a un servidor MCP público? Trátalo como ejecutar código no confiable. Fija la versión, ponlo en sandbox y nunca le des scopes de pago sin una compuerta humana. CVE-2025-6514 probó que un servidor malicioso, por sí solo, puede adueñarse de tu máquina.

¿De verdad necesito auth en un servidor localhost? Sí. El patrón de CVE-2026-23744 (MCPJam) fue un bind a 0.0.0.0 sin auth, explotable desde la red o desde internet si el host tiene IP pública; localhost-only más autenticación cierra ambos huecos a la vez.

¿Fijar versiones de verdad ayuda? Es tu principal defensa de supply chain. Los rangos sin fijar jalan de forma automática una versión futura comprometida. Fija, y audita antes de subir.

¿Los Structured Outputs o los schemas hacen segura una herramienta? No. Un schema restringe la forma, no la intención. En la API de Claude, output_config.format con type: "json_schema" te garantiza la estructura del JSON, pero una descripción de tool envenenada sigue dirigiendo al agente. Valida el comportamiento, no solo el JSON.

No soy contador, ¿dónde está la línea fiscal? Como ingeniero, mi regla: cualquier acción que toque datos fiscales o de cliente va detrás de un humano. No dejes que un agente escriba registros fiscales de forma autónoma. La decisión contable es de tu contador; la compuerta técnica es tuya.

En resumen

MCP salió antes que su historia de seguridad. Conecta de forma deliberada, niega por defecto, y pon un humano frente a cualquier cosa que mueva dinero o toque datos fiscales.

Corre el checklist antes de tu próxima conexión a un servidor, no después del incidente. Si quieres seguir profundizando, tengo más guías de agentes de IA con este mismo enfoque operativo.