El DNS rebinding convierte los servidores MCP en localhost en superficie de ataque remota
Una oleada de divulgaciones coordinadas 2025–2026 alcanzó a todos los grandes SDK de MCP por una misma causa raíz: servidores HTTP en localhost que no validan la cabecera Host/Origin. La más reciente, CVE-2026-11624 en el MCP Toolbox de Google (13 de junio de 2026), se califica como Crítica 9,4.
¿Qué es esto?
En unos siete meses, una misma clase de vulnerabilidad se divulgó contra casi todos los SDK oficiales del Model Context Protocol (MCP) y varios servidores MCP construidos sobre ellos. La causa raíz es idéntica en cada caso: un servidor MCP basado en HTTP, a la escucha en localhost, que no validaba la cabecera Host (u Origin), quedando expuesto a un ataque de DNS rebinding. La especificación MCP ya lo advertía: su nota de seguridad sobre transportes indica que «los servidores DEBEN validar la cabecera Origin en todas las conexiones entrantes para prevenir ataques de DNS rebinding» (especificación MCP, 2025-06-18) — pero los SDK no lo aplicaban por defecto.
Estas divulgaciones, atribuidas en gran parte al investigador Jonathan Leitschuh, abarcan el SDK de TypeScript (CVE-2025-66414, 2 dic. 2025), el SDK de Java (CVE-2026-35568, 7 abr. 2026), la crate de Rust rmcp (CVE-2026-42559, 29 abr. 2026), además de los SDK de Python y Go. La más reciente — CVE-2026-11624 en el MCP Toolbox for Databases de Google, publicada el 13 de junio de 2026 y calificada como CVSS 4.0 9,4 (Crítica) — demuestra que el patrón sigue apareciendo en herramientas de producción (CIRCL Vulnerability-Lookup).
Cómo funciona
El DNS rebinding es un antiguo ataque de red-navegador, reutilizado aquí contra la pila de agentes. El mecanismo está bien documentado y no requiere ningún exploit inédito:
- Un desarrollador ejecuta un servidor MCP enlazado a
localhostsobre Streamable HTTP o SSE — habitual en herramientas de agente local — generalmente sin autenticación. - La víctima visita una página web controlada por el atacante. El dominio del atacante resuelve primero a su propio servidor y luego se reasigna (rebind) a
127.0.0.1(un cambio con un TTL muy corto). - El navegador de la víctima, que sigue tratando la página como «same-origin» para el nombre de host del atacante, ahora envía solicitudes al servidor MCP local. Si el servidor solo comprueba que llegó una solicitud, sin verificar con qué nombre de host creía hablar el navegador, responde.
Como el navegador no puede falsificar la cabecera Host real enviada a la dirección reasignada, validar esa cabecera (contra una lista de permitidos como localhost, 127.0.0.1, ::1) es lo que bloquea el ataque. Los servidores que omitían esta comprobación permitían a una página web remota enumerar e invocar cualquier herramienta expuesta. Forma conceptual de la solicitud abusada:
# Una solicitud que el navegador es engañado para enviar en cross-origin (valores ilustrativos)
POST /mcp HTTP/1.1
Host: attacker-rebound.example # nunca verificado por el servidor vulnerable
Content-Type: application/json
{ "method": "tools/call", "params": { "name": "[REDACTED_TOOL]", ... } }
Según el aviso de Rust, el radio de impacto es amplio: un atacante puede «enumerar e invocar cualquier herramienta», leer recursos y prompts, y «desencadenar efectos secundarios (escrituras de archivos, ejecución de shell, llamadas a API)» — así que para servidores que exponen herramientas de sistema de archivos, shell o control del navegador, esto puede escalar a ejecución de código arbitrario en la máquina del desarrollador.
Por qué importa
Los servidores MCP se están convirtiendo discretamente en el componente más privilegiado de un despliegue de agentes: se ejecutan con los permisos del usuario y median el acceso a herramientas reales. Un enlace «solo localhost» parece seguro, y eso es precisamente lo que hace peligrosa esta clase — la interfaz de loopback no es una frontera de seguridad frente a un navegador que la víctima ya está ejecutando. Cualquier servidor MCP HTTP sin autenticar en el portátil de un desarrollador es alcanzable por cualquier sitio web que abra.
La amplitud es la noticia. No es el error de un solo proveedor, sino una brecha entre especificación e implementación replicada en todo un ecosistema: la especificación decía MUST, los SDK enviaron valores por defecto inseguros (la falla de TypeScript se clasifica como CWE-1188, inicialización por defecto insegura), y los servidores derivados heredaron el defecto. El ritmo constante, desde diciembre de 2025 hasta la CVE Crítica del Toolbox de Google el 13 de junio de 2026, sugiere que más servidores MCP con este patrón siguen sin parchear en circulación. A tener en cuenta: los transportes stdio no se ven afectados — solo los servidores HTTP/SSE.
Defensas
Actualice a las versiones corregidas de los SDK. TypeScript @modelcontextprotocol/sdk ≥ 1.24.0, Java mcp-core ≥ 1.0.0, Rust rmcp ≥ 1.4.0 (actual 1.5.1) y las versiones parcheadas de Python/Go. Para el MCP Toolbox de Google, actualice a ≥ 0.25.0, que añade las opciones --allowed-hosts/--allowed-origins (atención: ambas siguen con * por defecto y solo emiten una advertencia de inicio; defínalas explícitamente).
Imponga listas de permitidos de Host/Origin. Las correcciones validan la cabecera Host contra una lista loopback (localhost, 127.0.0.1, ::1) y devuelven HTTP 403 en caso contrario; el SDK de TypeScript expone un middleware hostHeaderValidation(). Actívelo; no confíe en el valor por defecto de las versiones antiguas.
Coloque un proxy inverso por delante. Si no puede actualizar, ejecute el servidor tras nginx, Caddy o HAProxy configurado para rechazar cualquier solicitud cuyo Host/Origin no sea un valor esperado. Los frameworks que ya imponen validación estricta de CORS/Origin (p. ej. Spring AI) no eran vulnerables.
Añada autenticación y evite 0.0.0.0. No ejecute servidores MCP HTTP sin autenticar en interfaces compartidas. Enlace solo al loopback, exija un token y prefiera stdio para herramientas puramente locales.
Audite lo que pueden hacer sus herramientas. Trate cada herramienta MCP expuesta localmente como alcanzable desde un navegador hasta que se demuestre lo contrario, y minimice las herramientas de alto impacto (shell, sistema de archivos sin restricciones) en cualquier servidor expuesto por HTTP.
Estado
| Componente | Identificador | Divulgación | Corregido en | Severidad |
|---|---|---|---|---|
| Google MCP Toolbox for Databases | CVE-2026-11624 | 2026-06-13 | 0.25.0 | CVSS 4.0 9,4 (Crítica) |
SDK de Rust (rmcp) | CVE-2026-42559 | 2026-04-29 | 1.4.0 | CVSS 3.1 8,8 (Alta) |
SDK de Java (mcp-core) | CVE-2026-35568 | 2026-04-07 | 1.0.0 | CVSS 4.0 7,6 (Alta) |
| SDK de TypeScript | CVE-2025-66414 | 2025-12-02 | 1.24.0 | CVSS 4.0 7,6 (Alta) |
| SDK de Python / Go | GHSA-9h52-p55h-vw2f / GHSA-xw59-hvm2-8pj6 | 2025–2026 | corregido | Alta |
| Debilidad común | CWE-346 (Origin Validation Error) / CWE-1188 | — | — | — |
| No afectados | transportes stdio; frameworks con CORS estricto (p. ej. Spring AI) | — | — | — |
Sources
- → https://vulnerability.circl.lu/vuln/cve-2026-11624
- → https://github.com/modelcontextprotocol/rust-sdk/security/advisories/GHSA-89vp-x53w-74fx
- → https://github.com/modelcontextprotocol/java-sdk/security/advisories/GHSA-8jxr-pr72-r468
- → https://github.com/modelcontextprotocol/typescript-sdk/security/advisories/GHSA-w48q-cv73-mx4w
- → https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#security-warning