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-gyppode processarbinding.gypdurante 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.