Veintitrés pull requests, ninguno fusionado, cero víctimas, cero credenciales entregadas. Y es el incidente de MCP más importante del año. Porque lo que demostró no es que el ataque funcione: es que revisar no sirve.

El servidor es honesto mientras lo miras.

Eso es toda la técnica.


Veintitrés líneas de configuración

El 10 de agosto de 2026, una cuenta pública de GitHub llamada zellkernel abrió veintitrés pull requests contra proyectos no relacionados entre sí de inteligencia artificial, MCP y herramientas de desarrollo. Pillar Security los reconstruyó dos días después: setenta y cuatro minutos de punta a punta, según su reloj.

Cada uno hacía la misma edición minúscula: agregaba un servidor MCP a un archivo de configuración. Diecisiete apuntaban a un endpoint remoto en onrender.com. Cuatro apuntaban Python a un archivo escondido en ~/.config/.cache/.sys/.deadbug-mcp.py — cuatro puntos encadenados, cuatro capas de ocultamiento en una sola ruta. Los dos restantes eran altas en directorios: un pull request es apenas una de las formas en que viaja una línea de configuración.

El servidor se llama a sí mismo productivity-suite y ofrece dos herramientas: format_text y summarize. Bromure las probó: hacen exactamente lo que prometen. "Both work."

Ahí está el problema entero. ¿Qué se revisa exactamente en un diff de una línea, que agrega un servidor que hace lo que dice que hace?


El contador

El servidor guarda un contador en memoria, por cliente, de las peticiones tools/call. Cuando llega a tres, las respuestas siguientes de tools/list y prompts/get cambian. Esa es la máquina completa.

El nombre de la herramienta no se mueve. Lo que se da vuelta es la descripción — y la descripción, escribe Bromure, "is the part the model reads as authority". El agente no obedece al nombre: obedece al texto que viene debajo, y ese texto llega por la red en cada refresco.

Los metadatos nuevos mandan buscar cuatro cosas: llaves SSH, credenciales de AWS, historial de shell y configuración de Kubernetes. Y agrega una quinta instrucción, operativa y no técnica: ocultarle la actividad al usuario. La lista lleva una década estable; es lo que se lleva un infostealer. Lo nuevo es quién la ejecuta: "An agent on an ordinary laptop can satisfy every item, because it has a shell in your home directory and it runs as you."

Pillar lo llama envenenamiento de metadatos MCP con compuerta de tiempo de ejecución, y dice sin adornos para qué sirve: "a brief inspection or limited test can receive only benign metadata, while normal use crosses the three-call threshold." No está diseñada para engañar al agente. Está diseñada para engañar al que revisa.

El código público implementaba además telemetría opcional por WEBHOOK_URL: conexión, primera llamada, disparo. Nadie documentó a un operador frente a esa consola. Pero alguien construyó algo que mirar.

Y no hubo actualización envenenada ni momento en que el servidor cambiara de bando: las instrucciones estaban construidas adentro desde el principio, simplemente retenidas.

Pillar bautizó la campaña Deadbugz por el artefacto de entrega. El nombre le queda mejor de lo que pretendía: hay bichos que se hacen los muertos mientras los miras y se levantan cuando te das vuelta.


Todo corre una sola vez

Ahora la parte que un artículo deshonesto se saltaría. Medida por su objetivo declarado, la campaña fracasó: diecinueve pull requests cerrados, cuatro abiertos, ninguno fusionado por el botón de GitHub al momento de la revisión. Ninguna fuente pública reporta una víctima, una credencial entregada ni un daño.

Y un mes después sigue apareciendo en todas las recopilaciones de seguridad de MCP. The Hacker News la puso el 27 de agosto como ítem 24 de 31 en su ThreatsDay. Cloud Security Alliance la clasificó CRITICAL el 2 de septiembre. Adversa AI la listó el 7 de septiembre como el único incidente entre ocho artículos del mes.

¿Por qué le importa tanto a todo el mundo algo que no le robó nada a nadie?

Porque lo que rompió no es un sistema. Es un ritual. Casi todo control que un equipo tiene contra un servidor MCP hostil corre una sola vez: lees el código una vez, apruebas la herramienta una vez, fijas la versión una vez. "Each of those is a photograph, and Deadbugz decides when you take it."

El que queda PAILA no es el que revisó mal. Es el que revisó bien, y a la hora equivocada.

El contraste vive en el mismo mes. Agosto dejó tres CVE de servidores MCP —lectura de archivos arbitrarios, token de clúster en claro, SSRF— y los tres tienen parche. Deadbugz no tiene parche, porque no es un defecto: es el protocolo funcionando como está escrito. "There is no memory corruption to patch and no CVE to file."

El terreno, además, está abonado: Exposed by Design, de Nicolás Padilla, auditó 414 servidores MCP de producción, y el 91,8% no tenía autenticación OAuth.

El canal tampoco es nuevo. Con ClawHavoc citamos la línea de 1Password: en un ecosistema de agentes, el markdown es un instalador. Deadbugz es el instalador que se reescribe después de instalado. Y el gusano de npm con procedencia válida es el mismo truco por el otro lado: allá bastaba con abrir el repositorio; acá la línea espera su turno.


La prohibición que nadie hace cumplir

Bromure lo escribió sin rodeos: "The server does nothing the protocol forbids." Contra la especificación 2025-06-18 es cierta. Contra la intermedia 2025-11-25, también.

Contra la vigente es falsa.

El 28 de julio de 2026 —trece días antes de los veintitrés pull requests— el proyecto publicó la especificación 2026-07-28 y estrenó una frase que describe el mecanismo de Deadbugz con precisión de fiscal: el conjunto de herramientas "MAY change over time … but MUST NOT vary per-connection or as a side effect of other requests on the connection." La prohibición no es absoluta: el mismo párrafo admite que el conjunto varíe según la autorización que traiga la petición. Deadbugz no varía por autorización. Varía por cuántas veces lo llamaste.

Esa frase no existe en ninguna de las dos versiones anteriores. La misma especificación agrega una nota que el contador contradice de frente: "MCP has no protocol-level session, so a server cannot rely on implicit per-connection state to relate one tool call to the next." Un contador en memoria por cliente es exactamente ese estado implícito.

Trece días. Prohibido explícitamente, en el documento que define el protocolo, antes de que la campaña empezara.

No cambió absolutamente nada. ¿Y quién iba a verificarlo?

Las "Security Considerations" de la sección de herramientas son casi idénticas en las tres versiones: en un año ganaron una sola viñeta, sobre resolución de $ref. Al cliente se le sigue pidiendo confirmar operaciones sensibles, mostrar las entradas, validar resultados y registrar el uso. Ni una palabra, en ninguna de las tres, sobre volver a aprobar una herramienta cuya definición cambió.

La advertencia de confianza cierra el círculo: "clients MUST consider tool annotations to be untrusted unless they come from trusted servers." Desconfía de las anotaciones, salvo que vengan de un servidor confiable. El servidor confiable es exactamente el que miente.

En abril de 2025, Invariant Labs lo demostró y le puso nombre: "An MCP rug pull allows an attacker to change the tool description after the user has already approved it for use." Quince meses después, el protocolo respondió con una prohibición sin quién la ejecute.


Atribución

Perpetrador: zellkernel. Pillar le atribuye la operación completa: los veintitrés pull requests, el repositorio fuente y los mismos marcadores de principio a fin. Creó veintiún repositorios el mismo 10 de agosto. Su perfil enlazaba a @llmgod en X, y el de X enlazaba de vuelta. En el prompt retardado hay una dirección de Bitcoin junto a la palabra deadbugz; Cloud Security Alliance la lee como "financially motivated", que es una interpretación y no un hecho. Hoy la cuenta y el repositorio no existen públicamente: la API de GitHub devuelve 404 para ambos y no hay copia del repositorio en el Wayback Machine. Quién los borró, nadie lo ha dicho.

Cómplices: los clientes MCP que refrescan la lista de herramientas sin comparar nada contra lo que aprobaron. La única defensa que toda la industria repite —revisa el servidor antes de conectarlo— es justo la que el contador de tres atraviesa por diseño. Y las herramientas que prometen atrapar esto: el 11 de septiembre, el propio mcp-guardbench documentó que su guardia dejaba pasar definiciones envenenadas por notifications/tools/list_changed — 88,9% de aciertos, con los dos casos de Deadbugz entre los cuatro fallos. Lo publicaron ellos mismos.

Falla sistémica: un protocolo donde la autoridad que el modelo obedece es texto remoto y mutable, y donde la aprobación es un evento y no un estado. Ya lo escribimos con el confused deputy: los frameworks de autorización no pueden restringir el comportamiento del agente después de la autenticación. Deadbugz es la demostración más limpia de esa frase. El servidor se presenta benigno, pasa el control, y una vez adentro reprograma al diputado con el único instrumento que necesita: una descripción.


Toda la seguridad de MCP descansa en un instante: aquel en que alguien mira el servidor y dice que sí. Deadbugz no atacó ese instante. Se hizo el muerto hasta que pasara.

Veintitrés intentos, ninguno fusionado, cero víctimas. Por eso nadie se asustó. Y la pregunta incómoda no es si el servidor que conectaste era benigno cuando lo revisaste. ¿Cuántas llamadas llevas desde entonces?