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.
| ekosystem | Npm |
| Klasa ładunku | wieloetapowy złodziej informacji + agent zdalnego sterowania (RAT) |
| Główne cele | portfele kryptowalutowe, rozszerzenia portfeli przeglądarkowych, dane uwierzytelniające programistów/chmury |
| Uporczywość | ukryte trwałe środowisko wykonawcze + autostart systemu operacyjnego (przetrwa usuwanie pakietów) |
| Exfiltracja | niezgoda w siecihooks + przekaźnik, HuggingFace Hub, zakodowany na stałe C2 na porcie 9877 |
| Obserwowany zakres | Maj 2026 – lipiec 2026 (w toku) |
| Najnowsza nazwa | pinokio-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:
- 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).
- 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.
- 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.
- 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: wersja | Note |
|---|---|---|
| Maj (wcześnie) | forge-jsxy:1.0.81, :1.0.90 | Najwcześ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.108 | Kampania 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 maj | forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino | Nazwy pakietów pokrewnych, ten sam łańcuch narzędzi |
| czerwiec 4 | forge-jsxy:1.0.120 | Ciąg dalszy; sklasyfikowane jako bezpieczne przez model ML (błąd) |
| 21–23 czerwca | forge-jsxy:1.0.121 | Zestaw modułów niezmieniony od wersji 1.0.120 |
| lipiec 6 | zredis-typed:1.0.127 | „kuźnia” usunięta z nazwy, nadal wysyła forge-jsxy-package.tgz oraz forgeAgent* klucze konfiguracyjne |
| lipiec 7 | pinokio-redis:1.0.127 | Ten 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źnik | Wartość: | Widziany w |
|---|---|---|
| Punkt końcowy C2 | 212.193.3[.]61:9877 | pinokio-redis:1.0.127 |
| Punkt końcowy C2 | 79.108.162[.]160:9877 | linia forge-jsxy, zredis-typed:1.0.127 |
| Kanał Exfil | discord.com/api/webhooks/… (post webhooka) | wszystkie warianty |
| Kanał Exfil | discord.com/api/v10 (przesyłanie przekaźnikowe) | wszystkie warianty |
| Kanał Exfil | Przesyłanie do HuggingFace Hub | wszystkie warianty |
| Podany artefakt | forge-jsxy-package.tgz (przez relayPackageServe) | wszystkie warianty |
| Pliki łańcucha narzędzi | chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* | wszystkie warianty |
| Lista docelowa | secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) | wszystkie warianty |
| Ukryty czas wykonania | kropkowany …/.forge-jsxy/runtime/v<version>/ ścieżka config-dir | linia forge-jsxy |
| Trwałość systemu Windows | ukryty skrypt autostartu „diagnostyki fałszowania” programu PowerShell | wszystkie warianty |
| Zainstaluj spust | hak postinstall wywołujący łańcuch skryptu dist-materializacji | wszystkie 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.







