Worm se autopropaga via binding.gyp
Um worm self-replicating comprometeu pelo menos 57 pacotes npm com mais de 286 versões maliciosas em uma campanha coordenada executada em menos de duas horas entre 3 e 4 de junho de 2026. O ataque explorou o mecanismo binding.gyp do Node.js para executar código arbitrário durante a instalação de pacotes, sem tocar nos hooks tradicionais de package.json. A campanha, batizada de “Miasma”, começou com o comprometimento do SDK oficial @vapi-ai/server-sdk, que possui mais de 408 mil downloads mensais, e se espalhou para dezenas de outros pacotes incluindo todo o ecossistema autotel e awaitly.
Vetor ignora package.json
O mecanismo de ataque é particularmente engenhoso porque contorna todas as verificações de segurança convencionais. A maioria das ferramentas de segurança e revisores de código monitoram scripts em package.json — como preinstall e postinstall. O atacante injeta um arquivo binding.gyp com cerca de 100 bytes que aproveita a expansão de shell do node-gyp no array sources. Quando o npm detecta esse arquivo, ele invoca automaticamente o node-gyp para compilar um suposto addon nativo, executando código arbitrário de forma silenciosa. O package.json permanece completamente limpo, e o index.js resultante carrega entre 4,5 e 4,9 MB de código ofuscado.
Worm rouba credenciais em cadeia
O malware opera em três estágios. No primeiro, um loader usa cifra ROT-N para decodificar um script interno, que então descripta dois payloads AES-128-GCM com chaves hardcoded. O segundo estágio baixa silenciosamente o runtime Bun (v1.3.13) do GitHub, evitando detecção na árvore de processos Node.js padrão. O terceiro estágio executa o worm principal com quatro operações: roubo de credenciais (npm, GitHub PATs, AWS, GCP, Azure, HashiCorp Vault, Kubernetes e até gerenciadores de senhas como 1Password CLI), injeção em workflows do GitHub Actions, envenenamento automático de todos os pacotes mantidos pela vítima (autopropagação) e exfiltração dos dados via commits “dangling” em repositórios GitHub controlados pelo atacante.
Pacotes comprometidos e mitigações
A lista de pacotes afetados é extensa. As versões maliciosas foram publicadas entre 3 e 4 de junho de 2026. Entre os pacotes de maior impacto estão @vapi-ai/server-sdk (0.11.1 a 1.2.2), o ecossistema completo autotel (dezenas de versões em pacotes como autotel-mcp, autotel-devtools, autotel-terminal) e o ecossistema awaitly. Pesquisadores da StepSecurity e da Wiz continuam identificando novos pacotes comprometidos.
| Pacote | Versões maliciosas | Downloads semanais estimados |
|---|---|---|
@vapi-ai/server-sdk |
0.11.1, 0.11.2, 1.2.1, 1.2.2 | 100.000+ |
autotel-devtools |
1.0.4 a 6.1.2 | 50.000+ |
autotel-mcp |
2.0.1 a 28.0.3 | 30.000+ |
awaitly |
1.33.3 | 20.000+ |
ai-sdk-ollama |
0.13.1 a 3.8.5 | 15.000+ |
Esse ataque se conecta a uma campanha maior documentada anteriormente, que já havia comprometido pacotes oficiais da Red Hat no npm em 1º de junho. A técnica de usar binding.gyp representa uma evolução em relação aos métodos de roubo de tokens via npm já observados em ataques anteriores. Equipes de segurança devem auditar lockfiles buscando versões suspeitas publicadas após 3 de junho, bloquear resolução de pacotes não verificados e verificar se o binding.gyp está presente em dependências onde não deveria existir. A prévia da evolução dos ataques supply chain no npm mostra que o ecossistema continua sendo um alvo prioritário.