sistema: OPERATIVO
← volver a todos los hacks
AGENTS CRITICAL

Secuestro de agentes en localhost: ataques WebSocket cross-origin a agentes de código IA

CVE-2026-44211 (CVSS 9.7), divulgada el 7 de mayo de 2026, demuestra cómo una sola visita a una página maliciosa puede secuestrar un agente de código IA que se ejecuta en el portátil de una persona desarrolladora. La clase de ataque es genérica — y arquitectónica.

2026-05-22 // 8 min affects: cline, kanban-npm-package, local-ai-coding-agents

Qué ha ocurrido

El 7 de mayo de 2026, Oasis Security divulgó CVE-2026-44211 (CVSS 9.7), una vulnerabilidad de secuestro WebSocket cross-origin en el asistente de código IA Cline. El fallo reside en el paquete npm kanban distribuido con el CLI de Cline: el paquete abre un servidor WebSocket en 127.0.0.1:3484 para conectar la interfaz local de gestión con las sesiones activas del agente IA, y lo hace sin validar la cabecera Origin y sin ningún token de autenticación.

Cualquier página web que la persona desarrolladora cargue en su navegador puede abrir un WebSocket contra ese endpoint local y comunicarse con el agente. La vulnerabilidad fue divulgada de forma responsable y se ha corregido en Cline 0.1.66. Quien siga en versiones anteriores debe actualizar de inmediato.

Cómo funciona esta clase de ataque

El error es interesante menos por sus particularidades que por el patrón estructural que evidencia. Los navegadores aplican CORS sobre fetch() y XMLHttpRequest, pero los WebSockets quedan fuera de la política del mismo origen: cualquier origen puede invocar new WebSocket("ws://127.0.0.1:3484") y el navegador permitirá el handshake. Es responsabilidad del servidor inspeccionar la cabecera Origin y rechazar todo lo que no provenga de su propia interfaz. El servidor de Cline no lo hacía.

El servidor kanban de Cline exponía tres canales WebSocket, cada uno rompiendo una invariante distinta:

  1. Un canal de lectura que, al conectarse, enviaba a la persona atacante una instantánea del workspace: rutas de archivos, títulos de tareas, rama git, historial de conversación con el agente.
  2. Un canal de entrada del terminal que escribía directamente en el búfer del prompt del agente activo. Una página hostil inyecta una instrucción — por ejemplo, “ejecuta este script de build por mí” — seguida de un evento de tecla simulado. El agente la trata como una instrucción legítima de usuario y consulta a su LLM subyacente qué hacer. Como el agente ya tiene herramientas de ejecución de shell conectadas, el resultado es ejecución remota de código en el equipo de desarrollo.
  3. Un canal de control que permitía terminar tareas activas del agente, lo que habilita un vector de denegación de servicio.

El exploit cabe en una línea de script en cualquier página que se visite — sin XSS, sin extensión instalada, sin exploit nativo. El agente ya tenía los privilegios; al atacante le bastaba con hablarle.

Por qué importa

Es la misma lethal trifecta — entrada no confiable, datos sensibles, acción externa — que Simon Willison documentó en 2025 y que el equipo de AI Security de Meta formalizó como Rule of Two en octubre de 2025. Cline reúne las tres por diseño: corre en el workspace de la persona desarrolladora (datos sensibles), puede ejecutar comandos de shell (acción externa), y ahora, a través del WebSocket sin autenticación, acepta entrada no confiable desde cualquier pestaña del navegador.

El patrón es genérico. Cualquier framework de agentes que exponga un plano de control local — para integración con el IDE, un panel web, depuración — es candidato al mismo error. El análisis Clinejection publicado a continuación por Snyk muestra que esta misma clase de agente queda también expuesta a través de salidas contaminadas de GitHub Actions que vuelven al contexto del agente. La CVE es solo una instancia de una categoría que seguirá apareciendo.

Defensas

Las mitigaciones son arquitectónicas, no heurísticas. Para personas que diseñan frameworks de agentes:

  1. Validar la cabecera Origin en cada upgrade WebSocket. Rechazar todo lo que no sea el origen localhost esperado de la UI. Esta sola medida cierra el vector drive-by.
  2. Generar un secreto por sesión al arrancar el servidor, exigirlo en cada conexión WebSocket como parámetro de consulta o subprotocolo, y no registrarlo jamás.
  3. Autenticar por separado el canal del terminal. El canal que escribe en el búfer del prompt del agente es, de hecho, la superficie más privilegiada del framework. Hay que tratarlo como tal.
  4. Vincular el servidor a un socket de dominio Unix (o a un named pipe en Windows) en lugar de TCP 127.0.0.1 cuando sea posible — los sockets locales no exponen un puerto TCP alcanzable por un navegador.
  5. Aplicar la Rule of Two. Si el agente debe aceptar entrada no confiable, renunciar a la acción externa o a los datos sensibles para esa sesión.

Para personas desarrolladoras que ejecutan un agente de código IA:

  • Actualice Cline a 0.1.66 o superior. Audite cualquier otro agente que abra un puerto local — extensiones de VS Code, variantes de Aider, gateways MCP propios — para comprobar validación de Origin y autenticación.
  • No ejecute tareas de agente activas mientras navega por contenido web arbitrario. Trate el terminal del agente como un shell privilegiado, porque eso es.
  • Vigile las conexiones salientes desde su equipo de desarrollo. Un secuestro drive-by suele pivotar al exterior en segundos.

Estado

ComponenteCVECVSSDivulgaciónCorregido en
Cline (kanban npm)CVE-2026-442119.72026-05-07Cline 0.1.66

La lección de fondo: un puerto localhost es una superficie de ataque pública desde el momento en que un navegador se ejecuta en la misma máquina. Los frameworks de agentes, herederos de la cultura de herramientas para desarrollo, siguen redescubriendo lo que la comunidad WebSec sabe desde hace una década. Hasta que esa transferencia de conocimiento se complete, conviene esperar más CVE de secuestro cross-origin de agentes durante todo 2026.

Sources