Pular para o conteúdo principal
Fechar
Segurança

22 Minutos, 631 Versões Maliciosas: O Ataque npm Que Exfiltrou 3.800 Repositórios e Infectou Agentes de IA

Gabriel Ferraresi· CEO | Tech862 de agosto de 20265 min
segurancanpmsupply-chainteampcpaccount-takeovergithub-actionsclaude-codeexfiltracaoslsaprovenance

22 minutos. Entre 01:44 e 02:06 UTC de 19 de maio de 2026, alguém publicou 631 versões maliciosas em 314 pacotes npm. O vetor foi account takeover da conta npm atool, que mantinha 547 pacotes. Os pacotes tinham 16 milhões de downloads semanais agregados — echarts-for-react sozinho tinha 3,8 milhões por mês. Nós analisamos o ataque e o sinal é claro: quando a supply chain vira vetor, o tempo de resposta da defesa precisa ser menor que o tempo do ataque.

A escala: 22 minutos, 631 versões, 314 pacotes

Os números são os que assustam pela densidade temporal. Em 22 minutos, 631 versões maliciosas foram publicadas em 314 pacotes npm. O atacante publicou dentro dos pacotes legítimos, com versões bumped automaticamente — não criou pacotes novos, infectou os existentes.

A conta atool mantinha 547 pacotes. Os pacotes afetados somavam 16 milhões de downloads semanais agregados. echarts-for-react sozinho tinha 3,8 milhões de downloads por mês. Cada versão publicada injetava um hook preinstall que executava um script Bun ofuscado de 498KB. Bun em vez de Node foi escolha deliberada para evadir scanners baseados em Node.js.

A coleta: 20 categorias de credenciais em um único script

O script Bun coletava 20 categorias de credenciais: AWS keys, GitHub PATs, npm tokens, GCP, Azure, Kubernetes, SSH keys, Docker auth, strings de conexão de banco, Stripe keys, Slack tokens. A exfiltração usava a GitHub API como dead-drop — credenciais eram commitadas em repositórios atacantes com nomes de Dune, como harkonnen-melange-742.

A escolha do Bun não é acidental. Scanners tradicionais de supply chain são calibrados para Node.js. Um runtime diferente evada assinaturas conhecidas, heurísticas de AST e padrões de comportamento. Quando a defesa assume Node, o atacante usa Bun.

A persistência: workflow injection, hooks de IA e dead-man switch

Depois da coleta vinha a persistência. Workflow injection no GitHub Actions: um workflow chamado "Run Copilot" que dumpava todos os secrets via toJSON(secrets). Hooks em agentes de IA: .claude/settings.json com hook SessionStart executando node .claude/setup.mjs. Toda vez que um dev abria uma sessão Claude Code, o malware re-executava.

Havia ainda um daemon de sistema chamado kitty-monitor. E um dead-man switch: se a vítima revogasse o token GitHub roubado, o daemon executava rm -rf ~/. Não é apenas exfiltração — é retaliação. O atacante transforma a defesa em gatilho de destruição.

A atribuição: TeamPCP, UNC6780 e a linhagem Shai-Hulud

O ataque foi atribuído ao TeamPCP, rastreado como UNC6780 pelo Google Threat Intelligence Group. No dia seguinte, segundo a GitHub, a brecha foi confirmada: 3.800 repositórios privados exfiltrados, incluindo github-mcp-server e github-oauth-proxy. O TeamPCP ofereceu os repositórios roubados por 50.000 dólares — não era ransom, era venda. Segundo a OpenAI, dois dispositivos corporativos foram comprometidos.

Este é o ponto mais recente de uma linhagem que começou em setembro de 2025. Shai-Hulud original: 500 pacotes, worm auto-replicante. Depois 2.0: 796 pacotes. Depois SANDWORM_MODE. Depois Bitwarden CLI. Depois TanStack. Depois @antv. Em waves anteriores, o mesmo grupo forjou provenance SLSA Build Level 3 válida — pacotes maliciosos passaram verificação criptográfica. O caso foi catalogado como CVE-2026-45321, CVSS 9.6.

Provenance prova onde foi construído. Falta provar se é seguro.

O ecossistema: 454.600 pacotes maliciosos em 2025, 1,8 milhão em meados de 2026

Segundo dados de ecossistema, 454.600 pacotes maliciosos novos em 2025. 1,8 milhão cumulativos em meados de 2026. 96,6% no npm. A escala não é de ataques pontuais — é de operação industrializada.

Segundo o npm, a versão 12 lançada em julho de 2026 desligou install scripts por default e passou a exigir staged publishing com aprovação humana e 2FA. Isso ajuda contra hooks preinstall, mas não resolve account takeover nem hooks em agentes de IA. A defesa precisa ir além do registry.

Os controles da Tech86 para supply chain com agentes de IA

Quando a Tech86 implementa controles de supply chain para clientes que usam agentes de IA, o princípio base é direto. Nenhum package.json ou lockfile modificado por agente de IA entra sem merge gate humano. Sandbox sem credenciais persistidas. Egress allowlist. Hooks de PreToolUse que exigem --ignore-scripts.

Não é paranoia. É o mínimo diante de um atacante que planta hooks em .claude/settings.json e workflow injection no GitHub Actions. A superfície de ataque agora inclui a configuração do próprio agente de IA.

Conclusão: o tempo de resposta da defesa precisa ser menor que o tempo do ataque

22 minutos de publishing. 24 horas depois, a GitHub confirmou a brecha. O tempo de resposta da sua defesa precisa ser menor que o tempo do ataque.

Nós repetimos: provenance prova onde foi construído, não se é seguro. Install scripts desligados por default ajudam, mas não resolvem account takeover. A defesa real é merge gate humano para mudanças de agentes de IA, sandbox sem credenciais persistidas, egress allowlist e PreToolUse hooks exigindo --ignore-scripts. Na Tech86, nós ajudamos empresas a implementar exatamente esses controles — antes que os 22 minutos do próximo ataque cheguem.

blog.cta_consulting_title

blog.cta_consulting_subtitle

Supply Chain Security para CI/CD e Agentes de IA

Perguntas Frequentes

Entre 01:44 e 02:06 UTC de 19 de maio de 2026, em 22 minutos, alguém publicou 631 versões maliciosas em 314 pacotes npm. O vetor foi account takeover da conta npm atool, que mantinha 547 pacotes. Os pacotes tinham 16 milhões de downloads semanais agregados — echarts-for-react sozinho tinha 3,8 milhões por mês. Cada versão injetava um hook preinstall que executava um script Bun ofuscado de 498KB, escolha deliberada para evadir scanners baseados em Node.js. O ataque foi atribuído ao TeamPCP, rastreado como UNC6780 pelo Google Threat Intelligence Group.

O ataque plantou .claude/settings.json com um hook SessionStart que executava node .claude/setup.mjs. Toda vez que um dev abria uma sessão Claude Code, o malware re-executava. A persistência também incluía workflow injection no GitHub Actions — um workflow chamado Run Copilot que dumpava todos os secrets via toJSON(secrets) — e um daemon de sistema chamado kitty-monitor. Havia ainda um dead-man switch: se a vítima revogasse o token GitHub roubado, o daemon executava rm -rf ~/.

Provenance prova onde foi construído. Falta provar se é seguro. Em waves anteriores, o mesmo grupo forjou provenance SLSA Build Level 3 válida — pacotes maliciosos passaram verificação criptográfica. O caso foi catalogado como CVE-2026-45321, CVSS 9.6. Provenance atesta a cadeia de build, mas não atesta a intenção do código. Um pacote construído em pipeline legítimo, com provenance válida, ainda pode conter um hook preinstall malicioso se o maintainer foi comprometido.

Segundo dados de ecossistema, 454.600 pacotes maliciosos novos em 2025 e 1,8 milhão cumulativos em meados de 2026, sendo 96,6% no npm. A linhagem atribuída ao mesmo grupo começou em setembro de 2025: Shai-Hulud original (500 pacotes, worm auto-replicante), depois 2.0 (796 pacotes), depois SANDWORM_MODE, depois Bitwarden CLI, depois TanStack, depois @antv. O ataque de maio de 2026 é o ponto mais recente dessa linhagem.

Segundo o npm, a versão 12 lançada em julho de 2026 desligou install scripts por default e passou a exigir staged publishing com aprovação humana e 2FA. Isso reduz o risco de hooks preinstall, mas não resolve account takeover nem hooks em agentes de IA. A defesa completa exige merge gate humano para mudanças feitas por agentes de IA, sandbox sem credenciais persistidas, egress allowlist e PreToolUse hooks exigindo --ignore-scripts.

Blog — Fale Conosco

Tem alguma pergunta sobre nossos artigos ou serviços? Nossa equipe está pronta para ajudar.

Agendar Reunião

Reserve um horário.

Agendar Agora

E-mail

Envie uma mensagem.

[email protected]

WhatsApp

Conversa rápida.

Endereço

Avenida Paulista, 1636 - São Paulo - SP - 01310-200

Especialista Tech86

Online agora

Olá! Como podemos ajudar a escalar seu negócio hoje?

Tech86 Engineering

Nós valorizamos sua privacidade

Utilizamos cookies e tecnologias similares para otimizar a sua experiência, analisar o tráfego do site e personalizar conteúdo. Ao clicar "Aceitar Todos", você concorda com o uso de todos os cookies. Leia nossa Política de Privacidade.