forge-jsxy npm Infostealer: Przewodnik po wskaźnikach IOC i wykrywaniu

forge-jsxy: npm Infostealer, który ciągle zmienia nazwę

TL; DR

Przez około dwa miesiącePojedynczy npm infostealer pojawił się ponownie pod zmieniającymi się nazwami pakietów, jednocześnie dostarczając niemal niezmieniony ładunek. Wszystko zaczęło się jawnie jako forge-jsxy, zrodził się forge-jsx3 / forge-jsx4 rodzeństwo, a następnie całkowicie porzuciło markę „kuźnia”, aby podszywać się pod infrastrukturę programistyczną — najpierw zredis-typedi ostatnio pinokio-redis.

Każda odmiana posiada ten sam wewnętrzny łańcuch narzędzi: pliki o nazwie forge-jsx-explorer-*, A relayPackageServe moduł, który obsługuje forge-jsxy-package.tgzoraz trwałe środowisko wykonawcze ukryte w katalogu kropkowanym, dzięki czemu przetrwa usunięcie pakietu npm.

Ładunek odczytuje materiał portfela kryptowalutowego i dane uwierzytelniające programisty od hosta i przesyła je do witryny Discordhooks, przesyłanie danych z HuggingFace Hub i zakodowany na stałe punkt końcowy C2. Instaluje autostart na poziomie systemu operacyjnego, aby uruchomić go ponownie po ponownym uruchomieniu, i przechwytuje aktywność schowka, klawiatury i ekranu. Najnowsza wersja, pinokio-redis, opisuje siebie jako integrację „Autodesk Forge” — opis ten nie ma nic wspólnego z tym, co kod robi.

ekosystemNpm
Klasa ładunkuwieloetapowy złodziej informacji + agent zdalnego sterowania (RAT)
Główne celeportfele kryptowalutowe, rozszerzenia portfeli przeglądarkowych, dane uwierzytelniające programistów/chmury
Uporczywośćukryte trwałe środowisko wykonawcze + autostart systemu operacyjnego (przetrwa usuwanie pakietów)
Exfiltracjaniezgoda w siecihooks + przekaźnik, HuggingFace Hub, zakodowany na stałe C2 na porcie 9877
Obserwowany zakresMaj 2026 – lipiec 2026 (w toku)
Najnowsza nazwapinokio-redis:1.0.127

Anatomia ataku

Każda odmiana w tej rodzinie instaluje się za pomocą tego samego kształtu: opakowania który wygląda na stronie z listą bezwładnie, ale deklaruje hak postinstall, więc Ładunek jest uruchamiany w momencie zainstalowania pakietu jako zależności. hak napędza pięciostopniowy łańcuch.

  • Etap 1 — materializacja. Skrypt instalacyjny dekoduje zakodowany plik w pakiecie blob do zestawu skryptów środowiska wykonawczego i zapisuje je w ukrytym katalogu w lokalizacji konfiguracji platformy (wersje forge-jsxy używały kropkowanego .forge-jsxy/runtime/v / ścieżka). Ponieważ ta kopia znajduje się poza node_modules, usunięcie lub cofnięcie publikacji pakietu npm nie powoduje usunięcia uruchomionego agenta.
  • Etap 2 — wytrwałość. Łańcuch rejestruje wpis autostartu systemu operacyjnego, dzięki czemu agent uruchamia się ponownie po ponownym uruchomieniu. W systemie Windows odbywa się to za pośrednictwem ukrytego skryptu diagnostycznego programu PowerShell; proces agenta jest generowany w trybie odłączonym i z włączoną opcją windowsHide, dzięki czemu okno konsoli nie jest wyświetlane.
  • Etap 3 — unikanie. Środowisko wykonawcze sprawdza obecność znaczników ciągłej integracji i cicho kończy działanie po wykryciu środowiska CI, więc zautomatyzowane piaskownice kompilacji niczego nie widzą. W wersjach forge-jsxy komentarz w źródle stwierdzał, że widoczne pole forgeInstall zostało celowo pominięte w pliku package.json, „ponieważ to pole byłoby widoczne w npm” — operator celowo ukrył metadane wyzwalacza poza listą publiczną.
  • Etap 4 — zbieranie. Po uruchomieniu agent zbiera w jednym przebiegu:
  1. Materiał na portfel kryptowalutowy. Dołączona lista docelowa secret_filename_patterns.json powoduje przeszukanie systemu plików w poszukiwaniu wallet.dat, *.mnemonic /Pliki .seed / *.phrase, keypair.json, Ethereum UTC– Magazyny kluczy oraz magazyny kluczy *.p12 / *.pfx / *.jks. W pakiecie znajdują się biblioteki do tworzenia portfeli (bip39, secp256k1, base58check i pomocniki Solana).
  2. Rozszerzenia portfela przeglądarkowego. Moduł chromiumExtensionDbHarvest odczytuje lokalne bazy danych rozszerzeń przeglądarek Chromium, czyli lokalizację, w której rozszerzenia portfeli przeglądarek przechowują swoje dane w sejfie.
  3. Dane uwierzytelniające i tajemnice. Agent skanuje historię powłoki i pliki zawierające sekrety, odczytuje dane uwierzytelniające programisty/chmury, a następnie koduje dane uwierzytelniające HuggingFace w celu przesłania.
  4. Wejście na żywo. Zawartość schowka, dane wprowadzane z klawiatury i zrzuty ekranu są przechwytywane na bieżąco.
  • Etap 5 — eksfiltracjaZebrane dane opuszczają hosta przez trzy kanały działające równolegle: Discord webhooks (discordWebhookPost) i przekaźnik Discord, który komunikuje się z `discord.com/api/v10` (discordRelayUpload), przesyłanie plików z HuggingFace Hub (hfUpload) i zakodowany na stałe punkt końcowy C2 osiągnięty przez port 9877. PrzekaźnikPackageServe moduł dodatkowo obsługuje wyjście forge-jsxy-package.tgz — to samo nazwa artefaktu przy każdej zmianie nazwy.

Ważnym punktem strukturalnym jest to, że etapy 1–3 są uruchamiane w czasie instalacji brak interakcji użytkownika, a etap 1 umieszcza ładunek w jakimś miejscu pakietu Menedżer nie śledzi. Deweloper, który zauważa dziwną zależność i uruchamia npm uninstall i usuwa listę, ale nie agenta.

Ładunek danych jest również odporny na szybkie odczytanie. Skrypty środowiska wykonawczego nie są dostarczane. w jasny sposób: etap kodowania-wdrożenia zachowuje logikę operacyjną jako zakodowany obiekt, który rozwija się do postaci czytelnych skryptów dopiero po zakończeniu łańcucha instalacji Dekoduje go do ukrytego katalogu środowiska uruchomieniowego. Pliki, które są widoczne na liście — cienka podkładka poinstalacyjna i materiał dystrybucyjny pomocnik — ujawnia niewiele na temat tego, co ostatecznie działa. Ta zakodowana dostawa projekt miał mierzalny wpływ na triaż: w całym okresie życia rodziny, wiele potwierdzonych wariantów uznano za bezpieczne na podstawie automatycznej klasyfikacji, a ładunek był na tyle nieprzejrzysty, że całkowicie uniemożliwił automatyczną kontrolę. Zachowania zdradzające rodzinę widoczne są dopiero po zakodowaniu etap zostaje rozszerzony, a środowisko wykonawcze jest odczytywane bezpośrednio.

Oś czasu

Ładunek rodziny pozostał zadziwiająco stabilny, ale zmiany polegają na tym, że nazwa na pudełku. Łuk biegnie od otwartego brandingu „kuźni” w kierunku podszywają się pod niezwiązane z tym narzędzia programistyczne.

Data (2026)Pakiet: wersjaNote
Maj (wcześnie)forge-jsxy:1.0.81, :1.0.90Najwcześniejsze potwierdzone warianty — RAT z szyfrowanym algorytmem C2 AES-256-GCM
19 maja,forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108Kampania w trakcie aktywnej publikacji; wersja 1.0.92 została początkowo błędnie oznaczona jako bezpieczna i wycofana podczas ponownej analizy kodu
Późny majforge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pinoNazwy pakietów pokrewnych, ten sam łańcuch narzędzi
czerwiec 4forge-jsxy:1.0.120Ciąg dalszy; sklasyfikowane jako bezpieczne przez model ML (błąd)
21–23 czerwcaforge-jsxy:1.0.121Zestaw modułów niezmieniony od wersji 1.0.120
lipiec 6zredis-typed:1.0.127„kuźnia” usunięta z nazwy, nadal wysyła forge-jsxy-package.tgz oraz forgeAgent* klucze konfiguracyjne
lipiec 7pinokio-redis:1.0.127Ten sam zestaw narzędzi; nowy C2; określany jako integracja „Autodesk Forge”

Na osi czasu wyróżniają się dwie rzeczy. Po pierwsze, numer wersji 1.0.127 jest powtarzany dosłownie zarówno przez zredis-typed, jak i pinokio-redis – nazewnictwo ulega zmianie, ale linia kompilacji się nie resetuje. Po drugie, odejście od nazw „forge-*” zbiega się z przejściem na nazwy oznaczające zwykłą infrastrukturę (redis, pinokio), zmniejszając ryzyko, że programista pobieżnie przeczyta nazwę i się zawaha.

Wskaźniki kompromisu

Poniższe wskaźniki IOC są odgłoszone. Host C2 obracał się między linią forge-jsxy i najnowsza wersja przy zachowaniu tego samego portu.

WskaźnikWartość:Widziany w
Punkt końcowy C2212.193.3[.]61:9877pinokio-redis:1.0.127
Punkt końcowy C279.108.162[.]160:9877linia forge-jsxy, zredis-typed:1.0.127
Kanał Exfildiscord.com/api/webhooks/… (post webhooka)wszystkie warianty
Kanał Exfildiscord.com/api/v10 (przesyłanie przekaźnikowe)wszystkie warianty
Kanał ExfilPrzesyłanie do HuggingFace Hubwszystkie warianty
Podany artefaktforge-jsxy-package.tgz (przez relayPackageServe)wszystkie warianty
Pliki łańcucha narzędzichromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-*wszystkie warianty
Lista docelowasecret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks)wszystkie warianty
Ukryty czas wykonaniakropkowany …/.forge-jsxy/runtime/v<version>/ ścieżka config-dirlinia forge-jsxy
Trwałość systemu Windowsukryty skrypt autostartu „diagnostyki fałszowania” programu PowerShellwszystkie warianty
Zainstaluj spusthak postinstall wywołujący łańcuch skryptu dist-materializacjiwszystkie warianty

Najtrwalszym sygnałem wykrywania nie jest żaden pojedynczy host ani webhook — te obróć — ale nazwy plików łańcucha narzędzi i forge-jsxy-package.tgz artefakt, który przetrwał w niezmienionej postaci po każdej zmianie nazwy.

Atrybucja i obserwowane zachowanie

Pakiety zostały opublikowane na więcej niż jednym koncie npm. forge-jsxy linia używała wydawcy jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); Najnowszą odmianę pinokio-redis opublikował donimique (donimiqueakers@gmail[.]com). Żadne z kont nie miało zweryfikowanego adresu e-mail ani powiązane repozytorium źródłowe. Linia łącząca konta to łańcuch narzędzi, a nie tożsamość wydawcy — te same nazwy modułów, ta sama podano .tgz, a ten sam projekt exfil powtarza się niezależnie od tego, kto go opublikował.

Kilka obserwowanych zachowań wskazuje na celowe ukrywanie, a nie przypadkowe nadmierne pobranie:

Środowisko wykonawcze umieszczone jest poza node_modules w ukrytym katalogu, więc istnieje dłużej niż pakiet, który je dostarczył.

Agent wyłącza się po wykryciu środowiska CI, ograniczając w ten sposób narażenie na ataki w zautomatyzowanych środowiskach testowych.

Proces agenta jest uruchamiany oddzielnie i okno-ukryte.W w wersjach forge-jsxy komentarz powiązał pominięcie widocznego pola install z tym, że pole to jest „widoczne w npm”.

Publiczne opisy pakietów nie mają związku z kodem — pinokio-redis jest prezentowany jako integracja „Autodesk Forge”.

Warto zwrócić uwagę na jedną powtarzającą się lukę w wykrywaniu, na którą obrońcy polegają automatyczna klasyfikacja: w tej rodzinie potwierdzono wiele wariantów oceniony jako bezpieczny przez klasyfikator ML przed korektą przeglądu kodu werdykt. Stabilne elementy, na których recenzent może się skupić — czas instalacji łańcuch, ukryte środowisko wykonawcze, nazwy plików narzędzi — to dokładnie te same które przetrwają zmiany nazw.

Powyższe opisujemy jako obserwowane zachowanie. Nie przypisujemy kampanię na rzecz dowolnego wymienionego aktora i nie składamy żadnych oświadczeń dotyczących operatora tożsamość lub cele wykraczające poza to, co demonstruje kod i infrastruktura.

Wpływ, trendy i wskazówki dla obrońców

Kto jest narażony. Zestaw kolekcji jest skierowany przede wszystkim do deweloperów maszyny: portfele kryptowalut i magazyny kluczy, rozszerzenia portfeli przeglądarek, historię powłoki i dane uwierzytelniające do chmury/usługi. Każdy, kto instaluje dotknięty pakiet — bezpośrednio lub jako zależność przechodnia — podczas okno, w którym było aktywne, jest w zakresie, a projekt trwałości oznacza, że narażenie nie kończy się w momencie usunięcia opakowania.

Dlaczego wytrwałość jest ważna. Ponieważ etap 1 kopiuje ładunek do ukryty katalog środowiska wykonawczego i rejestry etapu 2, autostart, zwykły instynkt naprawczy (odinstaluj błędną zależność, usuń node_modules, (ponowna instalacja) nie usuwa agenta. Reakcja na incydenty musi szukać środowisko wykonawcze out-of-tree i wpis autostartu, nie tylko pakiet.

Trend. Rodzina ta ilustruje wzór, który warto obserwować: ładunek, który jest stabilny i dojrzały, zawinięty w strumień jednorazowego użytkunazwy pakietów, które migrują z dowolnej nazwy, którą wcześniej usunięto rozpoznawalne, w kierunku nazw, które czytają się jak zwykła infrastruktura. Oparte na nazwach listy blokowanych i reputacja wydawcy szybko się starzeją w porównaniu z tym; zachowanie- a sygnały oparte na artefaktach nie.

Dla programistów i konsumentów

Traktuj skrypty instalacyjne jako główną powierzchnię ryzyka. Instaluj z wyłączonymi skryptami, jeśli to możliwe, i przejrzyj wszelkie zależności, które deklarują po instalacji. Przypnij i sprawdź zależności przechodnie; ten rodzaj złośliwego oprogramowania pojawia się równie łatwo poprzez podzależność, jak i bezpośrednio.

W przypadku podejrzenia o istnieniu hosta należy szukać poza pakietem: należy poszukać ukrytego katalogu środowiska wykonawczego w lokalizacji konfiguracji platformy, nieoczekiwanego wpisu autostartu, i połączenia wychodzące do webhooka Discord lub punktów końcowych :9877.

Załóż, że każda fraza startowa portfela, magazyn kluczy lub dane uwierzytelniające obecne na zainfekowanym hoście w czasie trwania okna narażenia są zagrożone i wykonaj rotację.

Dla rejestrów i obrońców

Alert dotyczący trwałych artefaktów (forge-jsxy-package.tgz, forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload nazwy plików), a nie nazwa pakietu, która się zmienia.

Zaznacz kombinację strukturalną, na której opiera się rodzina — postinstall, która materializuje skrypty w ukrytej ścieżce config-dir plus system operacyjny rejestracja autostartu — niezależnie od konkretnych ciągów znaków.

Nazwa na opakowaniu zmieniała się co najmniej cztery razy; skrzynia w środku nie ma. Wykrywanie oparte na tym, co robi kod, przetrwało dłużej niż kiedykolwiek dotychczasowe ponowne etykietowanie.

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 rozwój i dostarczanie oprogramowania

z pakietem produktów Xygeni