Abrir um repositório no Claude Code pode executar um backdoor. Sem npm install. Sem click. Sem aviso. A supply chain aprendeu a reescrever as instruções do seu agente de IA — e duas worms em junho de 2026 mudaram a superfície de ataque para sempre. Nós analisamos Miasma e IronWorm em detalhe técnico, e o quadro é claro: a camada de instruções do agente de IA é a nova superfície de ataque.
Miasma: a worm que infecta o agente, não só o código
O Miasma operou em três ondas coordenadas em junho de 2026, cada uma mais sofisticada que a anterior.
Wave 1 — 1 de junho: 32 pacotes via preinstall hook
Segundo a Wiz Research e o Microsoft Defender, 32 pacotes sob o escopo @redhat-cloud-services foram comprometidos via conta GitHub de funcionário Red Hat. O atacante fez push de orphan commits (sem parents, só workflow + carregador de carga) e deletou o branch. A proveniência aponta para refs/heads/oidc-2530ec68 — branch que já retorna 404. O commit sobrevive só porque Git mantém objetos sem referência.
Wave 2 — 3-4 de junho: 57 pacotes, 286+ versões, Phantom Gyp
Segundo o StepSecurity e o Snyk (classificação: crítica), 57 pacotes npm foram comprometidos em 286+ versões maliciosas em menos de 2 horas. A técnica inédita: Phantom Gyp. Em vez de preinstall/postinstall no package.json — onde toda ferramenta de segurança olha — o malware coloca um binding.gyp de 157 bytes na raiz do pacote. Quando o npm vê binding.gyp sem binário pré-compilado, ele executa node-gyp rebuild automaticamente. O mecanismo: <!(node index.js > /dev/null 2>&1 && echo stub.c) — substituição de comandos do gyp roda o payload silenciosamente. Scanners que só leem package.json não veem nada. O código legítimo em dist/ fica intacto.
A primeira vítima: @vapi-ai/server-sdk (SDK oficial Vapi.ai, 408 mil+ downloads mensais), às 23:30 UTC. Depois ai-sdk-ollama (120 mil+). Depois 25 pacotes autotel-* (o worm republicou tudo que uma conta comprometida alcançava).
O payload tem 4 estágios: binding.gyp dispara node-gyp rebuild, bootstrap loader executa, blob de 668 KB ofuscado (obfuscator.io, tabela de 2.306 strings criptografadas), strings decodificadas revelam roubo de credenciais (npm, GitHub, AWS, GCP, Azure, Vault, K8s, CircleCI), paths de IA, lógica anti-EDR e propagação do worm.
Wave 3 — 5 de junho: 73 repositórios Microsoft comprometidos
Segundo o GitHub, 73 repositórios Microsoft foram comprometidos — incluindo Azure, Azure-Samples, MicrosoftDocs e azure-search-openai-demo. O GitHub desabilitou todos em 105 segundos. A velocidade de propagação via OIDC do npm torna reação manual impossível.
O golpe: configs que sequestram o agente
O Miasma dropa configurações maliciosas em quatro arquivos de agentes de IA:
- .claude/settings.json: hook SessionStart — executa automaticamente ao abrir o Claude Code
- .cursor/rules/setup.mdc: alwaysApply: true — a IA segue instruções injetadas sem questionar
- .gemini/settings.json: executa automaticamente no Gemini CLI
- .vscode/tasks.json: folderOpen — depende do workspace trust do VS Code
Segundo a Ossprey, 13 ferramentas foram afetadas: Claude Code, Codex, Gemini CLI, Copilot, Kiro, OpenCode, Cline, Aider, Tabby, Amazon Q, Cody, Bolt e Continue.
Propagação e tripwire destrutivo
O motor de autopropagação do Miasma: valida token npm roubado via /-/whoami, enumera TODOS os pacotes do mantenedor via /-/v1/search?text=maintainer:{username}, troca token OIDC, baixa o pacote e injeta binding.gyp + index.js ofuscado, solicita certificado ao Fulcio, cria entrada no Rekor, gera atestado SLSA v1, publica tarball assinado como nova versão. Propaga também via RubyGems e GitHub.
O golpe fatal: npm audit signatures PASSA no malware. Todo pacote malicioso carrega SLSA provenance válida e assinada. O certificado é preciso. O pacote realmente foi construído por aquele pipeline — só que tinha malware injetado. Segundo Leitwacht: "Proveniência prova de onde um build veio; não diz nada sobre o que o build faz."
C2 via próprio GitHub. Tripwire destrutivo: honeytoken que dispara rm -rf se revogado.
IronWorm: rootkit eBPF que torna processos invisíveis
Segundo a JFrog Security Research, o IronWorm foi descoberto em 3 de junho. É um binário ELF de 976KB compilado em Rust com rootkit eBPF embutido. Com 32.177 downloads mensais combinados.
Invisibilidade em tempo real
O IronWorm reescreve entradas de /proc em tempo real. Processos ocultos ficam invisíveis a ps, top e ls. Cada execve é checado contra uma watchlist e auto-adicionado ao set oculto. ptrace recebe SIGKILL — strace mata seu shell. Hiding de rede via reescrita de /proc/net/tcp.
A limitação: em sistemas com kernel lockdown, o helper BPF falha e processos ocultos reaparecem. Isso significa que a proteção de kernel lockdown é parcialmente eficaz, mas não substitui monitoramento ativo.
Colheita de credenciais em massa
O IronWorm colhe 86 variáveis de ambiente incluindo 14 chaves de API de IA: Anthropic, OpenAI, Gemini, Cohere, Mistral, Groq, Perplexity e xAI. Também mira:
- ~/.claude/.credentials.json, ~/.codex/auth.json, ~/Cursor/auth.json
- ~/.aws/credentials, ~/.kube/config, ~/.npmrc
- ~/.ssh/, keystores de browser
- Wallet Exodus — enfraquece sandboxing do Electron para capturar seed mnemonic
Propagação via identidades forjadas
Propagação via Trusted Publishing OIDC do npm, commits com identidades de bot (dependabot, renovate), autor forjado como [email protected]. A linha Shai-Hulud de worms de supply chain: set/2025 (1.0), nov/2025 (2.0), abr/2026 (Mini: SAP, PyTorch Lightning, Intercom), mai/2026 (Wave 4: TanStack 42 pacotes, Mistral AI, UiPath, OpenSearch, 170+ pacotes em npm e PyPI), 12/mai (TeamPCP open-sourceou o worm), 19/mai (atool: 639 versões em 323 pacotes em UMA HORA), 1/jun (Miasma/Red Hat), 3/jun (Phantom Gyp).
A nova superfície de ataque: seus arquivos de instrução são boundaries de confiança
A superfície de ataque mudou. Seu .claude/settings.json é um boundary de confiança. Seu .cursor/rules é um boundary de confiança. Se você constrói com agentes de IA, seu package.json não é mais o único config que pode te comprometer.
O Miasma provou que SLSA provenance não protege nada — todo pacote malicioso carregava proveniência válida. O IronWorm provou que rootkits eBPF podem tornar processos invisíveis em produção. Juntos, eles mostram que a supply chain de IA tem duas camadas de ataque: o código que o agente executa e as instruções que o agente segue.
Remediação imediata: pin versões conhecidas. Rode npm install --ignore-scripts. Rotacione credenciais. Não confie na tag latest limpa — versões maliciosas continuam no registry. Cooldown para pacotes recém-publicados. E acima de tudo: trate arquivos de configuração de agentes de IA com o mesmo rigor que chaves SSH e credenciais AWS.
Conclusão
Quem protege as instruções que sua IA segue? Essa é a pergunta que Miasma e IronWorm deixam no ar. A supply chain evoluiu de atacar dependências para atacar a camada de instruções dos agentes de IA — e a maioria das ferramentas de segurança ainda olha só para package.json. Nós da Tech86 ajudamos empresas a mapear essa nova superfície de ataque, implementar monitoramento eBPF e estabelecer boundaries de confiança para arquivos de instrução de agentes. Se você constrói com IA, precisa proteger não só o código — mas as instruções que seu agente segue.
