A versão resumida
O que: Um malicioso [email protected] foi publicado no npm às 01h12 UTC do dia 8 de outubro de 2026. Desta vez, não se trata de um typosquat. É o verdadeiro SDK do Tensorlake para TypeScript, desenvolvido pelo próprio fluxo de trabalho do projeto e com proveniência válida do Sigstore. Um preinstall O hook utiliza o Bun para executar uma carga útil ofuscada do ChainDrop / Shai-Hulud de 856 KB.
Impacto: O Socket registra cerca de 12.000 downloads semanais, enquanto o Aikido ultrapassa 100.000 instalações acumuladas. Nos locais onde o hook foi executado, ele rouba credenciais, senhas do navegador e configurações de ferramentas de IA. Se o token do GitHub roubado pertencer a uma conta sem associações a organizações, ele também instala um monitor que tenta apagar o diretório home quando esse token for revogado.
Status: O Socket sinalizou o problema em 11 minutos, e The Hacker News Há relatos de que o npm retirou o pacote. Tensorlake reverteu os commits em solicitação de pull nº 1016. Até o momento da redação deste artigo, a versão 0.5.145 ainda não havia sido lançada e seis tensorlake-native-* Os pacotes ainda estavam disponíveis na versão 0.5.144. Você já instalou? Faça um backup, remova o monitor e, em seguida, gire-o.
A versão completa
Você está sendo afetado?
Há duas questões importantes. A versão 0.5.144 foi instalada em algum lugar que seja relevante para você, e o script de instalação foi executado nesse local?
O primeiro depende da forma como você faz a instalação. tensorlake ainda está na linha 0.x, portanto, um intervalo como ^0.5.140 aceita de bom grado qualquer patch 0.5 posterior. Projetos instalados a partir de um arquivo de bloqueio existente com npm ci ficou onde estava. O risco vinha da resolução de uma nova versão enquanto a versão com falha ainda estava ativa, por meio de npm update, um PR do Dependabot ou do Renovate que foi mesclado naquela manhã, uma instalação inicial ou um Dockerfile que copia package.json sem o arquivo de bloqueio. Qualquer pessoa que tenha baixado o ramo principal do repositório entre 7 de outubro e a reversão feita pelo Tensorlake e tenha executado npm install em typescript/ também executei o hook, sem envolver o Registro.
Quanto à segunda pergunta, não foi necessário importar o SDK. Bastou instalá-lo com os scripts de ciclo de vida ativados, mesmo em uma compilação que falhou um minuto depois. Com ignore-scripts=true em .npmrc, o hook nunca foi executado. O npm 12 e o pnpm 10 e versões posteriores retêm os scripts de dependência até que você os aprove (o npm 11 apenas exibe um aviso), e o Bun só os executa para pacotes que constam em sua lista de confiáveis, mas verifique sua configuração antes de confiar nisso. StepSecurity Descobriu-se que o loader encerra sua execução ao detectar CI, o que coloca os laptops dos desenvolvedores em primeiro lugar na lista de alvos. Isso reduz o risco de CI sem descartá-lo, já que o Socket ainda encontrou a coleta de credenciais de CI na carga útil.
O rg A linha serve para uma triagem preliminar, portanto, trate qualquer 0.5.144 em um tensorlake linha como ponto de partida. Ela ignora arquivos do `.gitignore` e arquivos binários, o que significa que um binário mais antigo bun.lockb não aparecerá:
npm ls tensorlake --all
npm ls --all | grep tensorlake-native
pnpm why tensorlake
yarn why tensorlake
rg -n 'tensorlake' -g '*lock*' -g 'npm-shrinkwrap.json' .
Em seguida, verifique o disco e o perfil do usuário:
find "$HOME" -path '*/node_modules/tensorlake/lib/Math_Symbol.js' 2>/dev/null
ls -la ~/.config/gh-token-monitor ~/.local/bin/gh-token-monitor.sh 2>/dev/null
Amplie o find para criar caches e runners, ou usar o EDR em frotas gerenciadas. Confirme se há algum Math_Symbol.js verifique os hashtags na seção “Mitigação”. A gh-token-monitor Se o diretório indicar que a armadilha está ativada, vá diretamente para a seção “Mitigação”. A ausência dessa informação não significa que o host esteja livre do problema, já que o monitor só é ativado para algumas contas.
O que é o ataque Tensorlake
O Tensorlake executa código não confiável, gerado por modelos, em sandboxes isoladas, e o SDK do npm é a forma como os aplicativos TypeScript os controlam. As equipes isolam tudo o que seus agentes escrevem e, em seguida, instalam o SDK em um laptop com acesso a tudo. A sandbox nunca falhou. O malware foi executado na máquina de instalação antes que qualquer sandbox fosse acionada.
O invasor entrou pelo repositório de código-fonte. De acordo com a StepSecurity, o primeiro commit malicioso, e90c47b, pousou na pista principal às 01h20 UTC do dia 7 de outubro, seguido por mais sete que ajustaram a carga útil e adicionaram o preinstall linha. Nenhuma delas passou por um pull request. O próprio relatório da Tensorlake afirma que elas vieram de uma conta de administrador do repositório por meio da interface do usuário do GitHub, e é por isso que o Aikido as viu marcadas como “verificadas”. O próprio GitHub assina os commits feitos pela interface do usuário, portanto, o selo indicava apenas que a conta estava conectada, nada mais. Ainda não foi divulgado como essa conta foi comprometida.
Cerca de um dia depois, a mesma conta publicou manualmente o repositório publish_npm.yaml fluxo de trabalho. Ele compilou, assinou e publicou a versão 0.5.144. O scanner do Socket detectou a vulnerabilidade às 01:23:10 UTC, e o StepSecurity a comunicou aos mantenedores em Issue do GitHub nº 1014. Os nomes dos arquivos correspondem à onda do ChainDrop de agosto, que ocorreu por meio de keyv, e o Aikido encontrou um WORMTAG indício que aponta para uma infecção recente, em vez de uma reinfecção residual.
Como funciona o Token de Refém
Quando o payload obtém um token do GitHub de uma conta que não possui afiliações a organizações, ele instala um serviço chamado gh-token-monitor, de acordo com A decodificação do SafeDep. Os tokens das contas pertencentes a uma organização são roubados da mesma forma, mesmo sem a armadilha. Trata-se de uma unidade de usuário do systemd no Linux, um LaunchAgent no macOS e uma tarefa agendada de logon no Windows. A cada 60 segundos, por até 24 horas, ela chama api.github.com/user com o token roubado. De acordo com a StepSecurity, assim que o GitHub rejeita o token, ele executa rm -rf ~/ no Linux e no macOS ou a exclusão do perfil do usuário pelo PowerShell no Windows. O código contém até mesmo a string IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner, e GMO Flatt Security relata ter observado a exclusão de arquivos em máquinas infectadas.
Basta consultar praticamente qualquer guia de procedimentos para roubo de credenciais que verá que a primeira etapa é revogar o token. Em um host onde esse monitor ainda esteja em execução, essa etapa pode apagar o diretório pessoal do desenvolvedor, independentemente de a revogação ser feita pelo próprio desenvolvedor, por um administrador ou por um playbook automatizado. Se a automação revogar tokens vinculados a hosts sinalizados, adie a revogação para os hosts afetados até que os monitores sejam removidos.
Desconectar o cabo de rede também não é uma solução garantida, já que ninguém divulgou como o monitor lida com uma falha na conexão. Proteja os dados críticos, entre em contato com sua equipe de resposta a incidentes para iniciar o processo de contenção e aja rapidamente, pois o invasor pode continuar usando esse token o tempo todo.
Dentro da carga útil
O carregador verifica se há CI; se encontrar, encerra a operação, baixa o Bun e passa o controle para Math_Symbol.js, de modo que o trabalho de verdade ocorre em um processo que não é node.
Ele busca tokens do npm, incluindo a troca OIDC utilizada pela publicação confiável, e extrai dados dos metadados das instâncias da AWS, do Secrets Manager e do SSM Parameter Store — a GMO Flatt Security observou que ele acessava esses dados em todas as regiões. Ele sonda um Vault local em 127.0.0.1:8200 e faz uma varredura em tokens do Kubernetes, chaves SSH, .env arquivos, configurações do Docker e carteiras de criptomoedas. O Aikido detectou que ele deixava para trás o HackBrowserData, que contém senhas e cookies salvos. Ele também tem como alvo arquivos de configuração e MCP do Claude, Cursor, Kiro, Windsurf e Zed, que geralmente contêm chaves de API em texto simples.
Os dados roubados são enviados, criptografados, para iseekaigogo.com, o domínio C2 codificado diretamente na carga útil, ou para um novo repositório público na própria conta do GitHub da vítima, descrito como “Shai-Hulud: Here We Go Again”. Como alternativa, o Aikido constatou que o malware lia um contrato Ethereum controlado pelo invasor em 0xb614155Fd88114d40549b259457Bcf921Df091B9 para um domínio alternativo. Sua última atualização, em 21 de setembro, a partir da carteira 0x779f83aE56309682beDb04816c19d358c4B21040, aponta para o mesmo domínio. A remoção ajuda, mas basta uma transação para redirecioná-lo.
Em seguida, ele se espalha. Com um token do npm, ele se insere nos pacotes da vítima, aumenta o número da versão, gera uma proveniência do Sigstore e republica. Com um token do GitHub, ele faz um commit .claude/settings.json e .vscode/tasks.json para os repositórios aos quais tenha acesso, utilizando o autor [email protected] e a mensagem “tarefa: atualizar dependências”. Os hooks do Claude Code podem executar comandos de shell, e as tarefas do VS Code podem ser executadas ao abrir uma pasta; portanto, esses arquivos podem ser uma forma de voltar ao sistema, dependendo de como estiverem configurados e das configurações de confiança do próximo desenvolvedor.
O que deve mudar na admissão
A informação de proveniência na versão 0.5.144 é verdadeira. Ela indica corretamente que o pacote veio de tensorlakeai/tensorlake por meio do próprio fluxo de trabalho do projeto, que é exatamente o que a proveniência sempre afirma. Quando uma conta de administrador faz um commit diretamente no branch “main”, o pipeline real compila o malware e o assina. Uma política que verifica a proveniência, mas nunca analisa o código atestado, teria aceitado essa versão.
Os arquivos de bloqueio serviram apenas por inércia, e um verificador de CVE não encontrou nada que correspondesse. Enquanto isso, a diferença entre as versões 0.5.143 e 0.5.144 era difícil de passar despercebida, com uma nova preinstall um script, um novo carregador e um arquivo ofuscado de 856 KB em uma versão de patch. Poucas equipes analisam as diferenças dos arquivos tarball para verificar aumentos de versão de patch, mas nos arquivos lock mais recentes do npm, uma alteração no hasInstallScript A entrada é um indicador barato que vale a pena acompanhar.
O tempo também ajuda. O Socket detectou isso em 11 minutos; portanto, um filtro de idade de lançamento de 24 horas (do npm) min-release-age, ou do pnpm minimumReleaseAge, cujo valor padrão é de 24 horas a partir do pnpm 11) teria impedido sua inclusão na maioria das compilações. A resposta da Tensorlake, apresentada no PR #1016, também é um modelo adequado, com a função de bypass de administrador removida do branch principal, a exigência de commits assinados, um segundo revisor nas publicações no npm e um mecanismo de detecção de falhas na CI que falha se um manifesto publicado declarar um script de instalação. Para os usuários, suspendam qualquer atualização de dependência que adicione ou altere um script de instalação. Um pacote sem esse script ainda pode executar código na importação, mas vale a pena interromper o processo por causa de um novo script.
Mitigação
A ordem é mais importante do que o normal. Considere qualquer host que tenha executado o hook como comprometido e siga seu processo de gerenciamento de incidentes.
Preserve os dados críticos em primeiro lugar. Copie o trabalho não confirmado e outros dados insubstituíveis — e não as ferramentas — para um armazenamento externo antes de mexer em tokens, serviços ou na rede. Guarde os arquivos de bloqueio e os registros de instalação como prova.
Confirme os artefatos. Verifique se as estações de trabalho, os hosts de compilação e as imagens criadas nos dias 7 ou 8 de outubro correspondem aos valores SHA-256 publicados. lib/setup.mjs é 25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef e lib/Math_Symbol.js é b50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec. A GMO Flatt Security lista um arquivo que chama de artifact.tar.gz como 33108f494dad71369a9aa7cd6daa5402335d1a718b78320b9b687c0b2174fa67, e a cópia do registro de publicação do SafeDep apresenta o SHA-1 do arquivo tarball do npm como 843a898ab72793568d77c53ff9282e6ce7c66aea. Os hashes confirmam uma correspondência, mas não detectam uma cópia modificada.
Desative o monitor antes de revogar qualquer coisa. O arquivo em ~/.config/gh-token-monitor/ contém o token monitorado. Trate-o como uma evidência confidencial e não o mencione em tickets nem no chat. A StepSecurity publicou os comandos para Linux e macOS abaixo, com um daemon-reload adicionados aqui. Verifique os nomes e os caminhos na máquina em si antes de executá-los:
# Linux
systemctl --user disable --now gh-token-monitor.service
rm -rf ~/.config/gh-token-monitor
rm -f ~/.local/bin/gh-token-monitor.sh
rm -f ~/.config/systemd/user/gh-token-monitor.service
systemctl --user daemon-reload
# macOS
plist=~/Library/LaunchAgents/com.user.gh-token-monitor.plist
launchctl bootout gui/(id-u)"plist"
rm -rf ~/.config/gh-token-monitor
rm -f ~/.local/bin/gh-token-monitor.sh
rm -f "$plist"
No Windows, este PowerShell somente para leitura lista as tarefas agendadas que são executadas monitor.ps1, para que você possa removê-los por meio de suas ferramentas de endpoint:
Get-ScheduledTask | Where-Object {
"(_.Actions.Execute) (_.Actions.Arguments)" -match 'monitor\.ps1'
}
Confirme se ele foi excluído antes de prosseguir. Excluindo node_modules não vou mexer nisso, e remover esse monitor não prova que não haja outra forma de persistência.
Faça a rotação a partir de uma máquina limpa. Revogue o token do GitHub monitorado; assim, tudo o que essa conta tinha acesso, incluindo o npm, a nuvem, o SSH, o Kubernetes, o Vault e as credenciais do registro, .env segredos, chaves de ferramentas de IA e chaves da API do MCP. Considere as senhas e sessões do navegador como comprometidas e encerre as sessões ativas enquanto estiver fazendo isso.
Limpe os repositórios e verifique o que você publica. Procure os commits de [email protected] com “tarefa: atualizar dependências”, errado .claude/settings.json ou .vscode/tasks.json arquivos, fluxos de trabalho desconhecidos e novos repositórios públicos com a descrição “Shai-Hulud: Here We Go Again”. Se o token do npm de um mantenedor tiver sido exposto, procure por versões que ninguém da sua equipe tenha lançado.
Bloquear e revisar a saída. Bloqueio iseekaigogo.com por domínio. Listas de Flatt 172.67.207.33 e 104.21.22.217 como seus endereços, mas esses são IPs compartilhados da Cloudflare; portanto, use-os em pesquisas nos registros, e não em regras de firewall.
Bloqueie, aplique as políticas e refaça a imagem do sistema em caso de dúvida. Aguardar tensorlake na versão 0.5.143, o que também fixa seus pacotes nativos na versão 0.5.143, até que a Tensorlake publique e confirme a versão 0.5.145. Mantenha tensorlake-native-* desativar a versão 0.5.144. Reinstale em um host limpo, confirme o arquivo de bloqueio e use npm ci no CI. Se você não conseguir identificar todos os pontos de persistência, reconstrua a máquina a partir de uma imagem comprovadamente válida.
Detecção
A cadeia de processos é o melhor indicador. Procure por npm ou node desova node lib/setup.mjs, que então faz o download e inicia bun. O fato de o Bun aparecer em uma instalação de pacote em uma máquina que nunca o teve já é suspeito por si só, assim como os elementos de instalação que exibem .npmrc, .aws, .kube, chaves SSH ou perfis do navegador.
Para garantir a persistência, monitore as unidades de usuário do systemd, os LaunchAgents ou as tarefas ONLOGON criadas em um processo do Node ou do Bun. Um processo que não seja de navegador, realizando sondagem api.github.com/user “uma vez por minuto” é a impressão digital mais específica que você vai conseguir.
Como o SecureChain para JavaScript muda o resultado
O SecureChain para JavaScript antecipa a decisão de confiança, antes que um pacote chegue a um laptop. Ele recompila pacotes a partir do código-fonte em ambientes fortificados e isolados e os examina em busca de malware conhecido, padrões de código suspeitos e riscos na cadeia de suprimentos, bloqueando tudo o que não passar na inspeção. A simples recompilação, por si só, não teria protegido ninguém aqui, pois o código malicioso já estava presente no código-fonte original. É a triagem que detecta isso, e o lançamento de um patch que, de repente, adiciona um preinstall O fato de ele se conectar, baixar um segundo ambiente de execução e executar 856 KB de JavaScript ofuscado é exatamente o tipo de alteração que ele foi projetado para impedir.
Conheça o SecureChain para JavaScript →
É um substituto direto para repositórios, compatível com o JFrog Artifactory, o Sonatype Nexus e o GitHub Packages, portanto, o npm Os comandos permanecem os mesmos, e o produto oferece proveniência SLSA Nível 3, SBOM e saída VEX. Ele abrange JavaScript, Python, Java, Go, Rust e PHP. E quando incidentes como esse levam as equipes a congelar uma dependência até que ela ultrapasse o fim da vida útil, o Suporte de Ciclo de Vida Ilimitado da TuxCare pode continuar fornecendo correções de segurança para essa versão enquanto você depender dela. Sem atualizações forçadas e sem reescritas.
Por que isso é mais importante do que um simples pacote
Em maio, houve uma onda de Mini Shai-Hulud no TanStack que trazia proveniência SLSA válida, e em junho ocorreu o typosquat da Mastra. Em agosto, houve o ChainDrop por meio de keyv e a vulnerabilidade do arrayref no crates.io. Agora, a mesma família de worms atingiu a infraestrutura de agentes de IA. O que se repete constantemente é que os defensores tratam um emissor autenticado ou um atestado válido como prova de que o código está correto. Neste caso, tanto o nome do pacote quanto a proveniência eram reais. Eles simplesmente responderam a uma pergunta diferente daquela que realmente importava.
Conheça o SecureChain para JavaScript →
Perguntas frequentes
Quais versões do TensorLake são seguras?
A versão 0.5.143 é a última versão limpa e ainda era do npm latest no momento da redação deste texto. Atualize para a versão 0.5.145 assim que a Tensorlake a publicar e mantenha tensorlake-native-* excluindo 0,5.144.
É seguro revogar imediatamente o token do GitHub que foi roubado?
Não, se o monitor ainda estiver em execução. Em um host onde gh-token-monitor Se estiver ativo, revogar seu token pode provocar a exclusão do diretório pessoal ou do perfil do usuário. Preserve os dados, remova o monitor, depois revogue e faça a rotação, e faça isso rapidamente.