Aikido

Atacantes S1ngularity/nx atacam novamente

Charlie EriksenCharlie Eriksen
|
#

Esta manhã, fomos alertados sobre um ataque em grande escala contra o npm. Parece ser obra dos mesmos autores por trás do ataque Nx em 27 de agosto de 2025. Este artigo foi publicado originalmente por Socket e StepSecurity, que observaram que 40 pacotes foram comprometidos. Desde então, outros 147 pacotes foram infectados com malware, incluindo pacotes da CrowdStrike.

A escala, o alcance e o impacto deste ataque são significativos. Os atacantes estão a usar o mesmo manual em grande parte do ataque original, mas intensificaram a sua ação. Transformaram-no num worm completo, que faz estas coisas automaticamente:

  • Roube secrets publique-os publicamente no GitHub
  • Execute o trufflehog e consulte os pontos finais Cloud para recolher secrets
  • Tentativa de criar uma nova ação GitHub com um mecanismo de extração de dados através do webhook[.]site
  • Itere os repositórios no GitHub aos quais um utilizador tem acesso e torne-os públicos.

Desde o nosso alerta inicial esta manhã, confirmámos os seguintes comportamentos adicionais e detalhes importantes. Para quem não sabe, Shai Hulud é o nome do verme na franquia Dune. Uma indicação clara da intenção dos atacantes.

Shai Hulud, de Dune

Para evitar ser comprometido por pacotes como este, confira o Aikido safe-chain!

O que o verme faz

  • Colheita: verifica o ambiente do host e CI em busca de secrets process.env, verificação com TruffleHog e pontos finais de metadados na nuvem (AWS/GCP) que retornam credenciais de instância/serviço.
  • Exfiltrate (1) — Repositório GitHub: cria um repositório chamado Shai-Hulud na conta comprometida e faz o commit de um dump JSON contendo informações do sistema, variáveis de ambiente e secrets recolhidos.
  • Exfiltrar (2) — GitHub Actions → webhook: elimina um fluxo de trabalho .github/workflows/shai-hulud-workflow.yml que serializa ${{ toJSON(secrets) }}, os envia para um invasor webhook[.]site URL e grava uma cópia dupla em base64 nos registos de Ações.
  • Propagar: usa quaisquer tokens npm válidos que encontrar para enumerar e tentar atualizar os pacotes controlados pelo mantenedor comprometido (propagação da cadeia de suprimentos).
  • Amplificar: itera os repositórios acessíveis da vítima, tornando-os públicos ou adicionando o fluxo de trabalho/ramificação que irá desencadear novas execuções e fugas de informação.

Fuga de secrets

Tal como no ataque Nx original, estamos a observar que os atacantes estão a realizar um ataque do tipo «smash-and-grab» (destruir e roubar). A carga maliciosa publica um repositório «Shai-Hulud» com credenciais/tokens roubados e acede a uma conta GitHub para tornar um repositório privado em público:

Credenciais roubadas a serem publicadas

Repositórios privados a serem tornados públicos

Auto-propagação através do npm

Uma das características mais marcantes deste ataque é que ele se comporta como um verdadeiro worm. Em vez de depender de um único pacote infetado para se espalhar, o código foi projetado para se republicar em outros pacotes npm pertencentes ao mantenedor comprometido.

Veja como funciona a lógica do worm:

  • Descarregue um tarball de destino – ele obtém uma versão existente do pacote do registo npm.
  • Modificar package.json – o worm aumenta a versão do patch (por exemplo, 1.2.3 → 1.2.4) e insere um novo gancho de ciclo de vida (pós-instalação)
  • Copiar a sua própria carga útil – o script em execução (processo.argv[1]) é gravado no tarball como bundle.js. Isso garante que qualquer código que tenha infectado um pacote agora esteja dentro do próximo.
  • Republique o pacote trojanizado – o tarball modificado é compactado com gzip e enviado de volta para o npm usando as credenciais do mantenedor.

Este ciclo permite que o malware infete continuamente todos os pacotes aos quais um mantenedor tem acesso. Cada pacote publicado torna-se um novo vetor de distribuição: assim que alguém o instala, o worm é executado, replica-se e espalha-se ainda mais pelo ecossistema.

Resumindo: o invasor não precisa selecionar manualmente os pacotes. Uma vez que um único ambiente é comprometido, o worm automatiza a propagação, aproveitando os direitos de publicação do próprio mantenedor.

Para uma análise completa do malware, recomendamos a leitura da publicação da getsafety .

Pacotes impactados

Pacote Versões
@ahmedhfarag/ngx-perfect-scrollbar 20.0.20
@ahmedhfarag/ngx-virtual-scroller 4.0.4
@art-ws/comum 2.0.28
@art-ws/config-eslint 2.0.4, 2.0.5
@art-ws/config-ts 2.0.7, 2.0.8
@art-ws/db-context 2.0.24
@art-ws/di 2.0.28, 2.0.32
@art-ws/di-node 2.0.13
@art-ws/eslint 1.0.5, 1.0.6
@art-ws/fastify-http-server 2.0.24, 2.0.27
@art-ws/servidor-http 2.0.21, 2.0.25
@art-ws/openapi 0.1.9, 0.1.12
@art-ws/base-do-pacote 1.0.5, 1.0.6
@art-ws/prettier 1.0.5, 1.0.6
@art-ws/slf 2.0.15, 2.0.22
@art-ws/ssl-info 1.0.9, 1.0.10
@art-ws/aplicação web 1.0.3, 1.0.4
crowdstrike 8.1.1, 8.1.2
crowdstrike 0.4.1, 0.4.2
crowdstrike 0.19.1, 0.19.2
crowdstrike 0.34.2, 0.34.3
crowdstrike 1.205.1, 1.205.2
crowdstrike 1.205.1, 1.205.2
crowdstrike 1.205.1, 1.205.2
crowdstrike 1.205.1, 1.205.2
crowdstrike 5.0.1, 5.0.2
@ctrl/deluge 7.2.1, 7.2.2
@ctrl/golang-template 1.4.2, 1.4.3
@ctrl/magnet-link 4.0.3, 4.0.4
@ctrl/ngx-codemirror 7.0.1, 7.0.2
@ctrl/ngx-csv 6.0.1, 6.0.2
@ctrl/ngx-emoji-mart 9.2.1, 9.2.2
@ctrl/ngx-clique com o botão direito 4.0.1, 4.0.2
@ctrl/qbittorrent 9.7.1, 9.7.2
@ctrl/react-adsense 2.0.1, 2.0.2
@ctrl/torrent-partilhado 6.3.1, 6.3.2
@ctrl/tinycolor 4.1.1, 4.1.2
@ctrl/ficheiro-torrent 4.1.1, 4.1.2
@ctrl/transmissão 7.3.1
@ctrl/ts-base32 4.0.1, 4.0.2
@hestjs/core 0.2.1
@hestjs/cqrs 0.1.6
@hestjs/demo 0.1.2
@hestjs/eslint-config 0.1.2
@hestjs/logger 0.1.6
@hestjs/escalar 0.1.7
@hestjs/validação 0.1.6
@nativescript-community/arraybuffers 1.1.6, 1.1.7, 1.1.8
@nativescript-community/gesturehandler 2.0.35
@nativescript-community/perms 3.0.5, 3.0.6, 3.0.7, 3.0.8
@nativescript-community/sqlite 3.5.2, 3.5.3, 3.5.4, 3.5.5
@nativescript-community/texto 1.6.9, 1.6.10, 1.6.11, 1.6.12
@nativescript-community/typeorm 0.2.30, 0.2.31, 0.2.32, 0.2.33
@nativescript-community/ui-collectionview 6.0.6
@nativescript-community/ui-document-picker 1.1.27, 1.1.28
@nativescript-community/ui-drawer 0.1.30
@nativescript-community/ui-image 4.5.6
@nativescript-community/ui-label 1.3.35, 1.3.36, 1.3.37
@nativescript-community/ui-material-navegação-inferior 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-bottomsheet 7.2.72
@nativescript-community/ui-material-core 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-core-tabs 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-ripple 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-tabs 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-pager 14.1.36, 14.1.37, 14.1.38
@nativescript-community/ui-pulltorefresh 2.5.4, 2.5.5, 2.5.6, 2.5.7
@nexe/config-manager 0.1.1
@nexe/eslint-config 0.1.1
@nexe/logger 0.1.3
@nstudio/angular 20.0.4, 20.0.5, 20.0.6
@nstudio/focus 20.0.4, 20.0.5, 20.0.6
@nstudio/nativescript-checkbox 2.0.6, 2.0.7, 2.0.8, 2.0.9
@nstudio/nativescript-loading-indicator 5.0.1, 5.0.2, 5.0.3, 5.0.4
@nstudio/ui-collectionview 5.1.11, 5.1.12, 5.1.13, 5.1.14
@nstudio/web 20.0.4
@nstudio/web-angular 20.0.4
@nstudio/xplat 20.0.5, 20.0.6, 20.0.7
@nstudio/xplat-utils 20.0.5, 20.0.6, 20.0.7
@operato/quadro 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/dados-grist 9.0.29, 9.0.35, 9.0.36, 9.0.37
@operato/graphql 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/headroom 9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/ajuda 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/i18n 9.0.35, 9.0.36, 9.0.37
@operador/entrada 9.0.27, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/layout 9.0.35, 9.0.36, 9.0.37
@operato/popup 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/puxar-para-atualizar 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42
@operato/shell 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39
@operato/estilos 9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/utils 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@teselagen/bounce-loader 0.3.16, 0.3.17
@teselagen/liquibase-tools 0.4.1
@teselagen/range-utils 0.3.14, 0.3.15
@teselagen/react-list 0.8.19, 0.8.20
@teselagen/react-table 6.10.19
@thangved/janela-de-retorno-de-chamada 1.1.4
@things-factory/base-de-anexos 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50
@things-factory/auth-base 9.0.43, 9.0.44, 9.0.45
@things-factory/base-de-e-mail 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51, 9.0.52, 9.0.53, 9.0.54
@things-factory/env 9.0.42, 9.0.43, 9.0.44, 9.0.45
@things-factory/base-de-integração 9.0.43, 9.0.44, 9.0.45
@things-factory/mercado-de-integração 9.0.43, 9.0.44, 9.0.45
@things-factory/shell 9.0.43, 9.0.44, 9.0.45
@tnf-dev/api 1.0.8
@tnf-dev/core 1.0.8
@tnf-dev/js 1.0.8
@tnf-dev/mui 1.0.8
@tnf-dev/react 1.0.8
@ui-ux-gang/devextreme-angular-rpk 24.1.7
@yoobic/sistema-de-design 6.5.17
@yoobic/câmara-jpeg-es6 1.0.13
@yoobic/yobi 8.7.53
chefe da força aérea 0.3.1
piloto aéreo 0.8.8
angulartics2 14.1.1, 14.1.2
navegador-webdriver-downloader 3.0.8
capacitor-notificationhandler 0.0.2, 0.0.3
plugin-capacitor-healthapp 0.0.2, 0.0.3
plug-in capacitor-ihealth 1.1.8, 1.1.9
plug-in capacitor-vonage 1.0.2, 1.0.3
capacitorandroidpermissões 0.0.4, 0.0.5
config-cordova 0.8.5
plugin-cordova-voxeet2 1.0.24
cordova-voxeet 1.0.32
criar-aplicação-hest 0.1.9
db-evo 1.1.4, 1.1.5
devextreme-angular-rpk 21.2.8
serviços-do-navegador-ember 5.0.2, 5.0.3
formulário sem cabeçalho 1.1.2, 1.1.3
formulário sem cabeçalho ember 1.0.1
tabela sem cabeçalho ember 2.1.5, 2.1.6
hash-polyfill-de-url-ember 1.0.12, 1.0.13
velcro de brasas 2.2.1, 2.2.2
parque infantil 0.0.2, 0.0.3, 0.0.4, 0.0.5
crowdstrike 11.0.2, 11.0.3
crowdstrike 4.0.3, 4.0.4
eslint-config-teselagen 6.1.7
globalizar-rpk 1.7.4
graphql-sequelize-teselagen 5.3.8
html-para-imagem-base64 1.0.2
motor-de-regras-json-simplificado 0.2.1
porta de salto 0.0.2
koa2-swagger-ui 5.11.1, 5.11.2
mcfly-semantic-release 1.3.1
base de conhecimento mcp 0.0.2
mcp-grafo-de-conhecimento 1.2.1
mobioffice-cli 1.0.3
monorepo-próximo 13.0.1, 13.0.2
mstate-angular 0.4.4
mstate-cli 0.4.7
mstate-dev-react 1.1.1
mstate-react 1.6.5
ng2-upload-de-ficheiros 7.0.2, 7.0.3, 8.0.1, 8.0.2, 8.0.3, 9.0.1
ngx-bootstrap 18.1.4, 19.0.3, 19.0.4, 20.0.3, 20.0.4, 20.0.5
ngx-color 10.0.1, 10.0.2
ngx-toastr 19.0.1, 19.0.2
ngx-tendência 8.0.1
ngx-ws 1.1.5, 1.1.6
oradm-para-gql 35.0.14, 35.0.15
oradm-para-sqlz 1.1.2
auto-anotar 0.0.9
pm2-gelf-json 1.0.4, 1.0.5
printjs-rpk 1.6.1
reagir-reclamação-imagem 0.0.32
react-jsonschema-form-conditionals 0.3.18
crowdstrike 4.0.1, 4.0.2
autenticação rxnt 0.0.3, 0.0.4, 0.0.5, 0.0.6
rxnt-verificações-de-saúde-nestjs 1.0.2, 1.0.3, 1.0.4, 1.0.5
rxnt-kue 1.0.4, 1.0.5, 1.0.6, 1.0.7
swc-plugin-componente-anotar 1.9.1, 1.9.2
tbssnch 1.0.2
árvore de intervalos de teselagen 1.1.2
construtor de consultas do cliente tg 2.14.4, 2.14.5
tg-redbird 1.3.1
tg-seq-gen 1.0.9, 1.0.10
thangved-react-grid 1.0.3
ts-gaussiano 3.0.5, 3.0.6
ts-importações 1.0.1, 1.0.2
tvi-cli 0.1.5
ve-bamreader 0.2.6
editor ve 1.0.1
verror-extra 6.0.1
kit de chamadas VoIP 1.0.2, 1.0.3
wdio-web-reporter 0.1.3
yargs-ajuda-saída 5.0.3
estilos yoo 6.0.326

História em desenvolvimento...

Conselhos de remediação

  • Verifique as versões que está a utilizar
  • Limpe o cache do npm
  • Reinstale todos os pacotes no seu repositório
  • Certifique-se de usar um ficheiro de bloqueio de pacotes e use versões fixas.

Como saber se está afetado usando Aikido:

Se for Aikido , verifique o seu feed central e filtre as questões relacionadas com malware. A vulnerabilidade será apresentada como uma questão crítica 100/100 no feed. Dica: Aikido os seus repositórios todas as noites, mas recomendamos que também seja realizada uma verificação completa.

Se ainda não é Aikido , crie uma conta e conecte os seus repositórios. A nossa cobertura proprietária contra malware está incluída no plano gratuito (sem necessidade de cartão de crédito).

Para proteção futura, considere usar Aikido (código aberto), um wrapper seguro para npm, npx, yarn... O Safechain se integra aos seus fluxos de trabalho atuais, interceptando comandos npm, npx, yarn, pnpm e pnpx e verificando se os pacotes contêm malware antes da instalação contra Aikido - Threat Intelligence de código aberto. Pare as ameaças antes que elas atinjam a sua máquina.

4.7/5

Proteja seu software agora

Comece Gratuitamente
Não é necessário cc
Agendar uma demonstração
Seus dados não serão compartilhados · Acesso somente leitura · Não é necessário cartão de crédito

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.