CanisterWorm está ativo. Isto é o que você tem que fazer antes de amanhã de manhã

Na semana passada, o scanner de segurança open source Trivy — usado em dezenas de milhares de pipelines de CI/CD em todo o mundo — foi comprometido. Em menos de 24 horas, um worm autopropagante chamado CanisterWorm começou a se expandir pelo ecossistema npm. No momento da escrita deste artigo, já infectou 141 artefatos maliciosos em mais de 66 pacotes npm. O grupo atacante continua ativo.

Isso não é um risco teórico de supply chain. Está acontecendo agora. E se seu pipeline executou Trivy na última semana, é possível que já esteja afetado.


Como chegamos até aqui

Em 19 de março, o grupo de ameaças conhecido como TeamPCP — anteriormente conhecido por atacar APIs do Docker expostas e clusters do Kubernetes — aproveitou credenciais comprometidas para publicar versões maliciosas do Trivy (v0.69.4), trivy-action e setup-trivy. Os binários com backdoor executavam um stealer de credenciais em três estágios que despejava a memória do processo Runner.Worker, coletava chaves SSH, credenciais de nuvem (AWS, GCP, Azure), tokens do Kubernetes e tokens de autenticação do npm — tudo enquanto a varredura legítima parecia estar sendo executada normalmente.

Esses tokens npm roubados foram a semente do CanisterWorm. Uma ferramenta deploy.js permitiu ao atacante republicar versões maliciosas de todos os pacotes acessíveis com esses tokens. Uma variante mais recente vai além: se autopropaga durante o postinstall, convertendo cada desenvolvedor ou pipeline de CI que instala um pacote afetado em um vetor de propagação involuntário.

O que torna o CanisterWorm tecnicamente interessante — e perigoso — é sua infraestrutura de C2. Em vez de um servidor web tradicional, o worm consulta um canister do ICP: um smart contract à prova de manipulação na blockchain do Internet Computer Protocol. Não há um único host para derrubar, não há email de abuso para relatar. O atacante pode rotacionar o payload a qualquer momento atualizando uma única URL no canister. No momento em que a maioria dos pesquisadores fez a análise, o canister estava servindo um vídeo rickroll do YouTube (estado de dormência). Isso pode mudar com uma única chamada.

O ataque escalou ainda mais. A TeamPCP implantou um wiper do Kubernetes (kamikaze.sh) direcionado à infraestrutura iraniana, fez deface público de 44 repositórios da Aqua Security e publicou imagens maliciosas adicionais no Docker Hub (0.69.5, 0.69.6) — tudo usando um único token de conta de serviço comprometido que conectava duas organizações do GitHub.


Seu checklist para hoje

Isso é o que um dev ou tech lead responsável deveria fazer agora mesmo, nesta ordem:

1. Verifique se você usou trivy-action entre 19 e 21 de março

Procure em seus workflows: grep -r "aquasecurity/trivy-action" .github/workflows/

Se algum workflow executou uma referência por tag de versão (não por SHA) entre 19 de março 17:43 UTC e 20 de março 05:40 UTC, considere esse pipeline como comprometido.

2. Rotacione todas as credenciais que esse pipeline tocou

Isso inclui: tokens npm, chaves AWS/GCP/Azure, chaves SSH, tokens de contas de serviço do Kubernetes, credenciais de Docker registry. Não espere confirmação. Rotacione agora.

3. Verifique as versões seguras

  • Trivy: v0.69.3
  • trivy-action: @0.35.0 (SHA: 57a97c7e)
  • setup-trivy: v0.2.6

4. Mude de version tags para SHA pinning para todas as suas GitHub Actions

Os version tags podem sofrer force-push. A TeamPCP fez force-push em 75 de 76 tags do trivy-action. As referências por SHA não podem ser manipuladas. Essa é a mudança de hardening de CI/CD de maior impacto que você pode fazer hoje.

5. Audite seus tokens de publicação npm

Se você tem pacotes no npm e seu pipeline tinha acesso a tokens de publicação, verifique se versões inesperadas foram publicadas. Procure pelo padrão deploy.js: os pacotes que o incluem estão infectados.

6. Verifique se existe o serviço systemd “pgmon”

Em runners Linux self-hosted ou máquinas de desenvolvimento que executaram pacotes afetados, procure por um serviço systemd que se passa por pgmon. Esse é o mecanismo de persistência do CanisterWorm.

7. Revise as imagens do Docker Hub

Se você baixar o Trivy do Docker Hub, a última versão limpa conhecida é 0.69.3. As versões 0.69.4, 0.69.5 e 0.69.6 eram maliciosas e já foram removidas — mas se essas camadas estiverem cacheadas em seu ambiente, você precisa limpá-las.


O problema estrutural que isso expõe

A TeamPCP não quebrou criptografia. Explorou uma rotação incompleta de credenciais após uma brecha anterior (28 de fevereiro), um workflow de pull_request_target mal configurado que uma ferramenta de segurança havia marcado três meses antes de ser explorado, e a confiança implícita que os pipelines de CI/CD concedem às suas ferramentas de segurança.

O scanner de segurança foi o vetor de ataque. Essa é a verdade incômoda. Quando um scanner de vulnerabilidades se torna a vulnerabilidade, você tem um problema de modelo de confiança — e nenhuma quantidade de varreduras resolve um problema de modelo de confiança.

Três mudanças estruturais que previnem essa classe de ataque:

Fixe Actions para SHAs, não para tags. Tags são mutáveis. SHAs não.

Aplique least privilege aos tokens de CI/CD. Um token npm que só pode publicar em um escopo específico não pode disseminar um worm por todo seu portfólio.

Trate a rotação de credenciais como uma operação atômica. Rotacionar algumas credenciais após uma brecha e não outras é equivalente a não rotacionar nenhuma.


O que vem a seguir

O canister ICP usado como C2 foi marcado como “não disponível por violação de política” pela rede ICP — mas pesquisadores apontam que o atacante pode implantar um novo canister de forma trivial. A TeamPCP continua ativa. O payload do worm ainda não foi totalmente armado na natureza. Isso não é tranquilizador — é um aviso.

Se você gerencia uma equipe ou um pipeline, compartilhe este checklist. A natureza em cascata desse ataque significa que um único token de desenvolvedor comprometido pode se tornar um surto em todo seu portfólio npm.


Seu pipeline usa trivy-action? Já auditou os tokens que pode ter exposto? Conte-nos nos comentários.


Referências: