sistema: OPERATIVO
← volver a todos los hacks
AGENTS MEDIUM NEW

CSRF en el SDK de Go de MCP: una web puede ejecutar tus herramientas locales (CVE-2026-33252)

El SDK oficial de Go de MCP aceptaba POST entre sitios del navegador sin validar la cabecera Origin. En un servidor local sin autenticación, cualquier web visitada podía invocar tus herramientas. Corregido en 1.4.1.

2026-06-19 // 6 min affects: mcp-go-sdk, local-mcp-servers, tool-calling-agents

¿Qué es esto?

CVE-2026-33252 es una falsificación de petición entre sitios (CSRF, CWE-352) en el SDK de Go oficial del Model Context Protocol (github.com/modelcontextprotocol/go-sdk). El aviso de seguridad de GitHub GHSA-89xv-2j6f-qhc8 se publicó el 19 de marzo de 2026 y la CVE quedó registrada en la NVD el 24 de marzo de 2026, con una puntuación de 7,1 (alta). La corrección llegó en la v1.4.1; la vulnerabilidad fue reportada por Lê Minh Quân.

En resumen: antes de la v1.4.1, el transporte Streamable HTTP del SDK aceptaba peticiones POST entre sitios generadas por el navegador sin validar la cabecera Origin y sin exigir Content-Type: application/json. En un servidor MCP local que se ejecuta sin autorización —una configuración muy común en desarrollo y en agentes de escritorio—, cualquier sitio web que el usuario visite podía enviar peticiones MCP a ese servidor y potencialmente desencadenar la ejecución de herramientas. Lo cubrimos porque es un ejemplo claro y ya corregido de un problema sistémico de 2026: los servidores MCP locales tratan la interfaz loopback como frontera de confianza, y el navegador la atraviesa en silencio.

Cómo funciona

La política del mismo origen del navegador normalmente impide que una página de evil.example lea las respuestas de 127.0.0.1. Pero las peticiones «simples» —aquellas con un Content-Type de la lista segura de CORS, como text/plain— se envían sin comprobación previa (preflight) de CORS. El atacante nunca necesita leer la respuesta; solo necesita que la petición llegue.

La víctima abre la página         ──►  fetch("http://127.0.0.1:<puerto>/mcp",
del atacante (navegador normal)        { method: "POST",
                                         headers: { "Content-Type": "text/plain" },
                                         body: <MCP JSON-RPC: tools/call ...> })

Servidor MCP local (antes de 1.4.1):
  - sin comprobación de Origin    ──►  petición aceptada
  - Content-Type no exigido       ──►  cuerpo interpretado como mensaje MCP
  - sin autorización requerida    ──►  herramienta invocada

Como el servidor no comprobaba la procedencia, un POST entre sitios era indistinguible de un cliente local legítimo. El impacto se califica como integridad alta, confidencialidad nula (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L): el atacante puede provocar acciones (llamadas a herramientas) pero no puede leer directamente la respuesta entre orígenes. La interacción del usuario requerida se reduce a «visitar una página». Aquí no se reproduce ningún payload: el mecanismo es la lección, y tiene exactamente la forma de un CSRF web clásico aplicado a la capa de herramientas de un agente.

No es un fallo aislado. El mismo patrón de validación de origen ausente produjo CVE-2026-34742 (DNS rebinding en el mismo SDK de Go), CVE-2026-35568 (SDK de Java de MCP) y, antes, CVE-2025-9611 en el servidor Playwright MCP de Microsoft. Distintos transportes, misma causa raíz: véase nuestra nota sobre el DNS rebinding contra servidores MCP en localhost.

Por qué importa

Un servidor MCP local rara vez es un juguete vacío. Está conectado a un sistema de archivos, a una shell, a una CLI de nube, a un repositorio de código o a una base de datos: ese es justamente el sentido de dotar de herramientas a un agente. Cuando un sitio web puede alcanzar ese servidor y llamar a esas herramientas, el navegador se convierte en un canal de exfiltración y de acción hacia la máquina. Las condiciones previas son banales: el servidor escucha en loopback, se ejecuta sin autenticación (común en configuraciones de «solo está en mi máquina») y el desarrollador navega por la web en la misma sesión. Esa combinación describe una parte amplia de los puestos de desarrollo de agentes en 2026.

La conclusión más general, para quien despliegue u opere MCP, es que loopback no es autenticación. 127.0.0.1 mantiene fuera a los pares de red remotos, pero no hace nada contra el navegador que se ejecuta en la misma máquina, que es un cliente HTTP plenamente capaz apuntado a donde la página del atacante le indique. Súmese a esto los datos de campo sobre la exposición de MCP —el 40 % de los servidores MCP remotos se ejecutan sin autenticación— y la validación de origen deja de ser un detalle.

Defensas

El parche es necesario, pero es la arquitectura la que te protege.

  1. Actualiza y activa la protección. Pasa a go-sdk v1.4.1+ (que exige Go 1.25+). La corrección añade la validación del Content-Type para las peticiones POST y una verificación de origen configurable: actívala. Exige Content-Type: application/json y rechaza las peticiones cuyo Origin/Host no coincida con una lista blanca de valores locales esperados.

  2. Autentica incluso en localhost. No ejecutes servidores MCP sin estado ni sesión y sin autorización. Un token portador o un secreto de sesión que el navegador no pueda adivinar convierte una llamada de herramienta por drive-by en una petición fallida.

  3. Valida Host además de Origin. La validación de la cabecera Host (rechazar cualquier Host distinto del valor loopback esperado) neutraliza las variantes emparentadas de DNS rebinding: el servidor devuelve 403 incluso cuando se engaña al navegador para que llegue a 127.0.0.1.

  4. Trata el navegador como un atacante adyacente. Aísla en red los servidores MCP de desarrollo, escucha en un puerto alto aleatorio y coloca las herramientas de alto impacto (shell, escritura de archivos, despliegue, pagos) detrás de una aprobación humana explícita. Una llamada de herramienta del «delegado confundido» debe chocar contra un muro antes de tocar algo irreversible.

Estado

ElementoValor
CVECVE-2026-33252 (GHSA-89xv-2j6f-qhc8)
ComponenteSDK de Go oficial de MCP, transporte Streamable HTTP
Afectado< 1.4.1
Corregido1.4.1 (exige Go 1.25+); commit a433a83
Severidad7,1 alta — CWE-352 (CSRF)
DivulgaciónAviso 2026-03-19 · NVD 2026-03-24
RelacionadoCVE-2026-34742 (DNS rebinding Go), CVE-2026-35568 (SDK Java), CVE-2025-9611 (Playwright MCP)

Sources