O worm Shai-Hulud infecta pacotes npm: uma análise aprofundada do incidente na cadeia de suprimentos

Última atualização: 09/25/2025
  • Centenas de pacotes npm foram comprometidos por um worm autorreplicante chamado Shai-Hulud, com o GitHub removendo mais de 500 versões contaminadas.
  • O malware rouba segredos (tokens npm, PATs do GitHub, chaves de nuvem) e republica pacotes infectados usando os direitos de publicação das vítimas.
  • Evidências apontam para segmentação de Linux e macOS, abuso do TruffleHog e um fluxo de trabalho do GitHub Actions que exfiltra dados.
  • Etapas imediatas: girar tokens, auditar dependências e repositórios do GitHub, aplicar MFA/2FA e procurar IoCs, incluindo bundle.js e tráfego webhook.site.

Ataque do worm Shai-Hulud npm

O que começou como mais um susto na cadeia de suprimentos no mundo JavaScript se transformou em um grande incidente que afetou o ecossistema npm. Relatos de diversas fontes confirmam uma cepa de malware autopropagante. rastreado como Shai‑Hulud, que compromete as credenciais do desenvolvedor, expõe o código e republica pacotes contaminados para manter a infecção em andamento.

Embora as contagens variem de acordo com a fonte, o consenso é claro: estamos lidando com centenas de lançamentos envenenados, incluindo uma biblioteca amplamente utilizada, baixada milhões de vezes por semana. O GitHub removeu mais de 500 versões comprometidas para conter a disseminação, e equipes de segurança em todo o mundo estão incentivando os desenvolvedores a rotacionar credenciais e vasculhar seus repositórios e pipelines em busca de pistas de intrusão.

O que aconteceu e por que isso importa

As investigações indicam que a operação provavelmente começou com coleta de credenciais atrai falsificação npm, incentivando os mantenedores a "atualizar" as configurações do MFA. Com o acesso em mãos, o agente da ameaça implantou um worm que é executado após a instalação, busca segredos e republica compilações infectadas sob a identidade da vítima — transformando mantenedores confiáveis ​​em amplificadores do ataque.

Shai‑Hulud combina duas ideias perigosas: propagação automatizada e roubo de segredos. Ele utiliza tokens npm roubados para publicar novas versões de pacotes e utiliza tokens do GitHub e chaves de nuvem (AWS, GCP, Azure) para se mover lateralmente e exfiltrar dados. Essa combinação potencializa o raio de ação, permitindo que um único ataque se espalhe por inúmeros usuários downstream.

Os alvos parecem estar inclinados para sistemas do tipo Unix. A análise observa que a maioria lógica maliciosa é executada no Linux e no macOS, com base em verificações de ambiente, embora a fase de descoberta de segredos (notavelmente com o TruffleHog) possa ocorrer de forma mais ampla. Esse foco restringiu o alcance do worm, mas ainda deixou uma ampla gama de máquinas de desenvolvedores expostas.

Pacotes de diversas organizações notáveis ​​foram impactados, juntamente com módulos populares da comunidade. Em um exemplo de destaque, o @ctrl/tinycolor O pacote — baixado milhões de vezes por semana — foi incluído na briga, demonstrando o quão profundamente a infecção poderia se infiltrar no gráfico de dependência.

ilustração de comprometimento de pacotes npm

Como o worm funciona (análise técnica)

A carga útil do núcleo é enviada como um arquivo JavaScript robusto, comumente chamado pacote.js (mais de 3 MB em amostras observadas). Ele é executado por meio de um gancho postinstall adicionado ao package.json, o que significa que o código malicioso é executado automaticamente logo após o usuário instalar o pacote pelo npm.

Dentro do bundle.js estão os módulos para Interação da API do GitHub, SDKs de nuvem (AWS/GCP), auxiliares de rede e rotinas para executar o TruffleHog para descoberta de segredos. O script inventaria o sistema operacional, localiza um token npm e verifica se há um token GitHub válido; se nenhum for encontrado, ele desiste — caso contrário, inicia a exfiltração e a replicação.

Uma peculiaridade notável: alguns pacotes infectados continham um arquivo chamado pacote.tar Em vez da convenção de nomenclatura usual, um indicador que ajudou os pesquisadores a sinalizar artefatos comprometidos. Os analistas também observaram uma variante que era executada como um gancho de pré-instalação; um dos primeiros casos citados foi ngx-bootstrap 18.1.4, que pode ter servido como uma cabeça de praia inicial na propagação.

Uma vez executado, o malware enumera os pacotes mais baixados do desenvolvedor por meio da API de pesquisa npm, descompacta cada tarball, remove o bundle.js, injeta um comando postinstall, atualiza a versão e republica no npm com o token da vítima. Isso transforma o portfólio do desenvolvedor em um veículo para novas infecções.

Exfiltração de segredos e fluxos de trabalho do GitHub

Para coleta de credenciais, o Shai-Hulud verifica tokens npm, tokens de acesso pessoal do GitHub e chaves de API de nuvem (AWS, GCP, Azure). Em seguida, ele cria um repositório público no GitHub chamado "Shai-Hulud" na conta da vítima, enviando um arquivo de dados (por exemplo, data.json) com os segredos roubados — expondo-os efetivamente ao mundo.

Paralelamente, os pesquisadores observaram um ângulo astuto do GitHub Actions: o worm cria um branch chamado 'shai‑hulud' em repositórios acessíveis e envia um arquivo de fluxo de trabalho (shai‑hulud‑workflow.yml). Acionado em envios, o fluxo de trabalho coleta segredos e os envia para a infraestrutura do invasor, às vezes após codificação Base64 dupla para ofuscar o conteúdo em trânsito.

Há também evidências de um roteiro de migração que clones repositórios privados/internos de organizações às quais a vítima tem acesso, hospedando-as novamente na conta do usuário como espelhos públicos. O objetivo parece ser o roubo automatizado de código-fonte de projetos privados, aumentando a pressão sobre as organizações afetadas.

Vários relatórios observam artefatos de assistência de IA nos scripts bash (comentários e até emojis), sugerindo que o invasor pode ter usado um LLM para acelerar o desenvolvimento dos componentes de automação do malware.

Escopo e pacotes notáveis

Em remoções coordenadas, o GitHub removeu Mais de 500 versões comprometidas para interromper a propagação do worm. Embora o total exato continue a evoluir, a lista abrange diversos ecossistemas e organizações, com impacto posterior para os desenvolvedores que atualizaram durante o período ativo.

Entre os pacotes e namespaces frequentemente citados: @ctrl/tinycolor (milhões de downloads semanais), múltiplos @multidão/* componentes (como commitlint e bibliotecas de IU) e uma ampla gama de módulos da comunidade, incluindo ngx-bootstrap, upload de arquivo ng2, ngx-toastr, e muito mais. A CrowdStrike indicou que sua plataforma principal permaneceu inalterada e que as chaves foram giradas prontamente após detectar entradas maliciosas no registro público.

  • Exemplos vinculados à onda: @ctrl/tinycolor; @crowdstrike/commitlint; @crowdstrike/foundry‑js; @crowdstrike/glide‑core; ngx‑bootstrap; ng2‑file‑upload; ngx‑toastr; @nativescript‑community/*; @teselagen/*; @things‑factory/*; e outros.
  • Os pesquisadores também viram várias versões maliciosas por pacote em alguns casos — provavelmente devido ao worm se espalhar por meio de várias contas de mantenedores dentro do mesmo projeto.

Resposta da plataforma e mudanças de segurança

As ações imediatas do GitHub incluíram purgando pacotes ruins conhecidos do npm e bloqueando uploads que correspondam aos Indicadores de Comprometimento (IoCs). A empresa também está implementando controles de publicação mais rigorosos: 2FA obrigatório para publicação local, tokens granulares de vida útil mais curta (por exemplo, sete dias) e adoção mais ampla de Publicação confiável para reduzir a dependência de segredos de longa duração.

As próximas mudanças descontinuarão os tokens clássicos legados e o 2FA baseado em TOTP para publicação, padrão para proibir a publicação de tokense expandir provedores para Publicação Confiável. O GitHub sinalizou uma implementação gradual com documentação e guias de migração, reconhecendo que alguns fluxos de trabalho precisarão de ajustes.

As equipes de inteligência de ameaças e resposta a incidentes em todo o setor (incluindo a Unit 42, Kaspersky, Trend Micro e outras) orientações e detecções emitidas ao mesmo tempo em que compartilha IoCs com pares e alianças para acelerar atualizações de proteção.

Como reduzir riscos agora mesmo

Mova-se rapidamente, partindo do princípio de que qualquer máquina de desenvolvedor que instalou pacotes npm recentemente pode ter vazado segredos. A prioridade é conter abuso de credenciais, pare a persistência e elimine dependências contaminadas das cadeias de construção.

  • Gire tokens npm, PATs/chaves SSH do GitHub e credenciais de nuvem (AWS/GCP/Azure) imediatamente; considere todos os segredos presentes nos hosts do desenvolvedor comprometidos.
  • Audite dependências via package‑lock.json/yarn.lock; remova ou fixe longe de versões comprometidas conhecidas; reinstale a partir de fontes limpas.
  • Aplique MFA/2FA no GitHub e no npm; migre para a Publicação Confiável sempre que possível para eliminar tokens de longa duração do ciclo.
  • Examine o GitHub em busca de repositórios públicos inesperados chamados 'Shai‑Hulud', branches ou fluxos de trabalho desconhecidos e execuções de ações anômalas.
  • Fortaleça o CI/CD com RBAC de privilégio mínimo, assinatura/verificação de artefatos e varredura SCA contínua; trate consumo de código aberto como um risco gerenciado.

Dicas de caça a ameaças (verificações de alto sinal)

Procure conexões de saída para webhook.site domínios, particularmente o URI observado em vários relatórios. Nos endpoints, procure a presença de pacote.js em diretórios temporários ou de pacotes e para um arquivo GitHub Actions chamado shai‑hulud‑workflow.yml.

  • Telemetria de rede: logs de DNS/URL contendo webhook.site; sinalize o caminho específico bb8ca5f6‑4175‑45d2‑b042‑fc9ebb8170b7 se visto.
  • Telemetria de arquivo: criação ou execução de bundle.js; presença de shai‑hulud‑workflow.yml em hosts de desenvolvedores Linux/macOS.
  • Telemetria de processo: Invocações do TruffleHog onde não é esperado (observe que pode haver uso legítimo em algumas organizações).

Indicadores de comprometimento (IoCs)

Pistas de arquivo e string vistas em investigações incluem pacote.js e shai‑hulud‑workflow.yml, com a string literal 'shai‑hulud' aparecendo em branches, repositórios e fluxos de trabalho.

  • Arquivos: bundle.js; shai‑hulud‑workflow.yml
  • Strings: shai‑hulud; pacote.tar
  • Hashes (selected): 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09; b74caeaa75e077c99f7d44f46daaf9796a3be43ecf24f2a1fd381844669da777; dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c; 4b2399646573bb737c4969563303d8ee2e9ddbd1b271f1ca9e35ea78062538db; C96FBBE010DD4C5BFB801780856EC228; 78E701F42B76CCDE3F2678E548886860
  • Rede: https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7 (variantes e subcaminhos observados)

Cronograma e análise contínua

Os relatórios atribuem a descoberta inicial a meados de setembro de 2025, com pico de ações de contenção por volta de 16 a 19 de setembroDesde então, o GitHub e diversos fornecedores atualizaram proteções, detecções e orientações. Aguarde novas descobertas retroativas à medida que as organizações concluem as análises de incidentes e expandem as listas de versões afetadas.

Algumas evidências sugerem que o incidente construído sobre vazamentos secretos anteriores, destacando como tokens de longa duração e credenciais armazenadas em cache podem alimentar novas ondas de comprometimento meses depois. Isso deve reforçar os esforços para encurtar a vida útil dos tokens e adotar modelos de publicação que minimizar a expansão secreta.

Nem todos os relatórios concordam com os totais exatos ou com os primeiros pacotes da cadeia, mas o quadro geral é consistente: worm npm auto-replicante que transformou a confiança do desenvolvedor em uma arma e automatizou os direitos de publicação para escalar rapidamente — mais rápido do que muitas equipes poderiam detectar apenas com revisão manual.

O evento ilustra a rapidez com que os pipelines de construção modernos podem se transformar em rodovias para malware. autenticação mais rigorosa, removendo tokens de longa duração do caminho, reforçando o CI/CD e buscando agressivamente por IoCs, as organizações podem conter a exposição hoje e tornar a próxima onda muito mais difícil de executar.

Artigos relacionados: