Hack Alerta

Pacote npm popular infectado por worm de roubo de credenciais Shai-Hulud

Pacote npm com 150k downloads semanais infectado por worm Trinitite que rouba credenciais e usa OIDC para publicar pacotes alterados na cadeia de suprimentos.

Detalhes do incidente de cadeia de suprimentos

Um pacote amplamente utilizado do npm, @7nohe/openapi-react-query-codegen, tornou-se um canal de entrega para roubo de credenciais após atacantes plantarem um payload auto-propagante conhecido como Trinitite, uma variante da família Shai-Hulud. O pacote, que gera código para TanStack Query, recebe mais de 150.000 downloads semanais, ampliando significativamente o alcance do impacto potencial.

As versões maliciosas podem ser executadas durante a instalação de dependências ou quando o npm processa arquivos de configuração de build especialmente elaborados. Isso abre uma brecha em estações de trabalho e runners de build automatizados, onde credenciais de publicação, nuvem e código-fonte estão frequentemente disponíveis. Pesquisadores da JFrog identificaram a atividade como uma nova onda Mini Shai-Hulud, aparecendo em 28 de agosto, com dez publicações lançadas em cerca de 20 minutos.

Mecanismo de exploração e workflow abuse

Os atacantes parecem ter abusado do fluxo de lançamento do projeto em vez do próprio npm. A análise indica que qualquer comentário de pull-request contendo o gatilho exato de lançamento poderia iniciar um job de publicação. Esse job verificava o pull-request e usava GitHub Actions OpenID Connect (OIDC) para obter um token de publicação confiável. A falta de verificação do mantenedor permitiu que um usuário do GitHub abrisse pull-requests, invocasse o processo de lançamento e empurrasse pacotes com proveniência válida.

A proveniência confirma que um job de lançamento foi executado no repositório, mas não estabelece que o código liberado era seguro. Duas pré-lançamentos iniciais continham um componente de instalação plantado, mas não o worm completo. Oito versões estáveis posteriores continham o payload. Quatro versões confiavam em um arquivo binding.gyp armamentizado, enquanto quatro versões posteriores também adicionaram um hook preinstall.

Comportamento do malware e exfiltração

Uma vez ativo, o Trinitite busca credenciais vinculadas ao GitHub, npm, PyPI, RubyGems, serviços em nuvem, HashiCorp Vault e Kubernetes. Também visa segredos de CI e dados em locais de ferramentas de desenvolvimento de IA. O material roubado é criptografado e commitado em repositórios públicos usando o token GitHub da vítima. O malware pode usar o acesso de publicação recuperado para modificar e republicar pacotes, criando um ciclo de feedback que transforma uma única dependência envenenada em um problema maior de cadeia de suprimentos.

Os pesquisadores também encontraram componentes de persistência para Linux e macOS, além de um monitor de tokens que observa o GitHub. Se detectar que um token foi revogado, ele pode acionar uma rotina de limpeza destrutiva, tornando a ordem de resposta crítica.

Recomendações de resposta e recuperação

Isolar a máquina ou runner afetado deve ser o primeiro passo antes de revogar credenciais. Equipes que instalaram uma versão afetada devem isolar o dispositivo, parar e desabilitar os serviços de usuário identificados e remover os arquivos temporários e de persistência listados. Devem remover a dependência, fixar versões conhecidas seguras, reconstruir lockfiles e investigar repositórios e históricos de lançamento por alterações não autorizadas.

Somente após a remoção do monitor os defensores devem girar credenciais do GitHub, npm, PyPI, RubyGems, nuvem, SSH e CI de um sistema limpo. Equipes também devem garantir que comentários de pull-request não confiáveis não possam disparar publicações e tratar a proveniência confiável como um sinal, não como prova de segurança.

Indicadores de Comprometimento (IoCs)

O pacote comprometido é @7nohe/openapi-react-query-codegen. Versões maliciosas incluem 0.5.4, 0.5.5, 1.6.3, 1.6.4, 2.2.1, 2.2.2, 3.0.3, 3.0.4. Arquivos maliciosos incluem 3FWCvzduYZg.js, is_it_this_simple.js, binding.gyp. Caminhos temporários incluem /tmp/trinnyyyy-*/bun e /var/tmp/.shit. Strings de campanha associadas incluem Trinitite: Sponsored by Preview 2 Effects.

Perguntas frequentes

  • É seguro pular scripts de ciclo de vida do npm? Não neste caso, pois o node-gyp pode processar binding.gyp durante a instalação.
  • Como prevenir futuros ataques similares? Implemente verificações rigorosas de mantenedor e trate proveniência como sinal de execução, não de segurança.
  • O que fazer se já instalei o pacote? Isolar o sistema imediatamente e verificar logs de CI/CD por atividades suspeitas.

Baseado em publicação original de Cyber Security News
Publicado pela Redação Hack Alerta com base em fontes externas citadas e monitoramento editorial do Hack Alerta. Para decisões técnicas, operacionais ou jurídicas, confirme sempre os detalhes na fonte original.