- Vários pacotes npm que incluíam o pacote open source @ctrl/tinycolor foram infectados por versões maliciosas; a causa foi o roubo de token npm por meio de um workflow do GitHub Actions em um repositório colaborativo
- O invasor usou um token npm com permissões amplas para publicar código malicioso em cerca de 20 pacotes, e entre eles o @ctrl/tinycolor tinha grande impacto por registrar 2 milhões de downloads semanais
- As versões infectadas executavam um payload malicioso na etapa de postinstall, e as equipes de segurança do GitHub e do npm responderam rapidamente com remoção e limpeza
- O autor preparou um plano de segurança reforçado para evitar recorrência, incluindo migração para Trusted Publishing (OIDC), minimização de permissões de tokens, obrigatoriedade de 2FA e uso de recursos do pnpm
- Este incidente mostra a fragilidade da segurança da cadeia de suprimentos de software e evidencia a necessidade de melhorar os recursos de segurança e mudar as práticas de segurança em todo o ecossistema npm
TL;DR
- Um workflow malicioso do GitHub Actions foi enviado a um repositório compartilhado e roubou um token npm
- Com esse token, o invasor publicou versões maliciosas de 20 pacotes, e entre eles o @ctrl/tinycolor teve maior alcance por causa do alto volume de downloads
- A conta pessoal e os repositórios não foram comprometidos diretamente, e não houve phishing nem instalação local de malware
- Graças à resposta rápida das equipes de segurança do GitHub/npm, as versões maliciosas foram removidas e depois versões limpas foram republicadas para limpar o cache
Como descobri o incidente (How I Found Out)
- Na tarde de 15 de setembro, o membro da comunidade Wes Todd avisou sobre o problema por DM no Bluesky
- As equipes de segurança do GitHub/npm já estavam organizando a lista de pacotes afetados e iniciando a remoção
- Como pista inicial, foi compartilhado o nome de branch malicioso 'Shai-Hulud', tirado do nome do verme da areia do universo de Dune
O que realmente aconteceu (What Actually Happened)
- Havia um colaborador de longa data no repositório angulartics2 que ainda mantinha permissões de admin
- O token npm armazenado nesse repositório foi roubado por um workflow malicioso do GitHub Actions
- Com esse token, o invasor publicou cerca de 20 pacotes, incluindo @ctrl/tinycolor
- As equipes de segurança do GitHub/npm removeram rapidamente as versões maliciosas, e o autor republicou novas versões confiáveis
Impacto (Impact)
- Ao instalar uma versão maliciosa, o script de postinstall era executado, gerando risco de segurança
- Usuários afetados são orientados a consultar as instruções imediatas de resposta da StepSecurity
Ambiente de publicação e plano de resposta (Publishing Setup & Interim Plan)
- Antes, a publicação automática era feita com a combinação semantic-release + GitHub Actions
- O recurso de provenance do npm era usado, mas não conseguia impedir um invasor com um token válido
- No futuro, o plano é adotar Trusted Publishing (OIDC) para eliminar tokens estáticos
- No momento, todos os tokens foram revogados, a 2FA foi tornada obrigatória, apenas tokens com permissões granulares são permitidos, e medidas extras como avaliação do recurso minimumReleaseAge do pnpm estão sendo aplicadas
Melhorias ideais (Publishing Wishlist)
- É necessário oferecer, no nível da conta npm, uma opção para forçar Trusted Publishing baseado em OIDC
- Também é necessário bloquear publicações sem provenance e oferecer suporte a integração completa entre semantic-release e OIDC
- Há o desejo de que a interface do GitHub ofereça uma função de publicação com aprovação manual baseada em 2FA
- Recursos de proteção no nível de GitHub Environments deveriam estar disponíveis mesmo sem assinatura Pro
- Na página de pacotes do npm, deveria haver indicação da presença de script postinstall e divulgação do motivo de versões removidas
Ainda não há comentários.