forge-jsxy npm Infostealer: Ghid de detectare și IOC-uri

forge-jsxy: Furtul de informații npm care își schimbă mereu numele

TL; DR

Pentru aproximativ două luni, un singur infostealer npm a reapărut sub o serie rotativă de nume de pachete, livrând în același timp o sarcină utilă aproape neschimbată. A început în mod deschis ca forge-jsxy, generat forge-jsx3 / forge-jsx4 frați, apoi au renunțat complet la brandingul „forjă” pentru a se prezenta drept infrastructură pentru dezvoltatori — mai întâi zredis-typed, și cel mai recent pinokio-redis.

Fiecare variantă poartă același lanț de instrumente intern: fișiere numite forge-jsx-explorer-*, A relayPackageServe modul care deservește un forge-jsxy-package.tgzși un runtime durabil ascuns sub un director punctat, astfel încât să supraviețuiască ștergerii pachetului npm.

Sarcina utilă citește material pentru portofelul de criptomonede și acreditările de dezvoltator de la gazdă și le transmite către Discord webhooks, încărcări HuggingFace Hub și un endpoint C2 codificat. Instalează pornirea automată la nivel de sistem de operare, astfel încât să ruleze din nou după repornire și capturează activitatea clipboard-ului, a tastaturii și a ecranului. Cea mai recentă variantă, pinokio-redis, se descrie ca o integrare „Autodesk Forge” — o descriere fără legătură cu ceea ce face codul.

SnowGemNPM
Clasa de sarcină utilăinfostealer multi-etapă + agent de control de la distanță (RAT)
Țintele primareportofele cripto, extensii de portofel de browser, acreditări de dezvoltator/cloud
Persistențăruntime durabil ascuns + pornire automată a sistemului de operare (supraviețuiește eliminării pachetului)
Exfiltrareadiscordia webhooks + releu, HuggingFace Hub, C2 codificat hardcoded pe portul 9877
Interval observatMai 2026 – Iulie 2026 (în desfășurare)
Ultimul numepinokio-redis:1.0.127

Anatomia atacului

Fiecare variantă din această familie se instalează prin aceeași formă: un pachet care pare inert pe pagina sa de listare, dar declară un hook postinstalare, deci sarcina utilă rulează în momentul în care pachetul este instalat ca o dependență. cârligul acționează un lanț în cinci trepte.

  • Etapa 1 — materializare. Scriptul de instalare decodează un fișier inclus, codificat blob într-un set de scripturi runtime și le scrie într-un director ascuns sub locația de configurare a platformei (versiunile forge-jsxy foloseau un .forge-jsxy/runtime/v punctat /cale). Deoarece această copie se află în afara node_modules, eliminarea sau anularea publicării pachetului npm nu elimină agentul care rulează.
  • Etapa 2 — persistă. Lanțul înregistrează o intrare de pornire automată a sistemului de operare, astfel încât agentul se relansează la repornire. Pe Windows, aceasta se execută printr-un script de diagnosticare PowerShell ascuns; procesul agentului este generat detașat și cu windowsHide setat, astfel încât nu apare nicio fereastră de consolă.
  • Etapa 3 — evitarea. Runtime-ul verifică markerii de integrare continuă și se închide în liniște când detectează un mediu CI, astfel încât sandbox-urile de compilare automată nu văd nimic. În versiunile forge-jsxy, un comentariu sursă afirma că un câmp forgeInstall vizibil a fost omis în mod deliberat din package.json „deoarece acel câmp ar fi vizibil pe npm” - operatorul a păstrat metadatele declanșatorului în afara listei publice în mod intenționat.
  • Etapa 4 — colectare. Odată ce rulează, agentul recoltează, într-o singură trecere:
  1. Material pentru portofelul cripto. O listă de ținte secret_filename_patterns.json inclusă în pachet determină o verificare a sistemului de fișiere pentru wallet.dat, *.mnemonic /fișiere .seed / *.phrase, keypair.json, Ethereum UTC– keystore-uri și keystore-uri *.p12 / *.pfx / *.jks. Bibliotecile de derivare a portofelelor (bip39, secp256k1, base58check și helpere Solana) sunt prezente în pachet.
  2. Extensii pentru portofelul de browser. Un modul chromiumExtensionDbHarvest citește bazele de date locale de stocare a extensiilor din browserele Chromium, locația în care extensiile de portofel bazate pe browser își păstrează datele din seif.
  3. Acreditări și secrete. Agentul scanează istoricul shell-ului și fișierele care conțin secrete, citește acreditările dezvoltatorului/cloud, apoi codifică acreditările HuggingFace pentru încărcare.
  4. Intrare live. Conținutul clipboard-ului, datele introduse de la tastatură și capturile de ecran sunt înregistrate în mod continuu.
  • Etapa 5 — exfiltratDatele colectate părăsesc gazda prin trei canale care funcționează în paralel: Discord webhooks (discordWebhookPost) și un încărcător Discord care comunică cu `discord.com/api/v10` (discordRelayUpload), încărcări HuggingFace Hub (hfUpload) și o Punctul final C2 codificat hardcore a fost atins prin portul 9877. Un relayPackageServe modulul servește suplimentar o redirecționare forge-jsxy-package.tgz — la fel numele artefactului la fiecare redenumire.

Punctul structural important este că etapele 1-3 se execută în momentul instalării cu nicio interacțiune cu utilizatorul, iar etapa 1 plasează sarcina utilă undeva în pachet managerul nu urmărește. Un dezvoltator care observă dependența ciudată și Rulează npm uninstall și elimină listarea, dar nu și agentul.

De asemenea, sarcina utilă rezistă la o citire rapidă. Scripturile de execuție nu sunt livrate. în clar: o etapă de codificare-implementare menține logica operațională ca blob codificat care se extinde în scripturi lizibile doar după lanțul de instalare îl decodează în directorul ascuns de execuție. Fișierele care sunt vizibile pe listare — elementul subțire de postinstalare și o materializare dist ajutor — dezvăluie puține lucruri despre ce se execută în cele din urmă. Această livrare codificată Designul a avut un efect măsurabil asupra triajului: pe tot parcursul vieții familiei, mai multe variante confirmate au fost evaluate ca fiind sigure prin clasificare automată, iar sarcina utilă a fost suficient de opacă pentru a bloca complet revizuirea automată. Comportamentele care trădează familia sunt vizibile doar după codificarea Stage-ul este extins, iar timpul de execuție este citit direct.

Companiei

Sarcina utilă a familiei a rămas remarcabil de stabilă; ceea ce se schimbă este numele de pe cutie. Arcul pornește de la brandingul „forjă” deschis spre deghizează în instrumente de dezvoltare fără legătură.

Data (2026) Pachet: versiune notițe
Mai (începutul) forge-jsxy:1.0.81, :1.0.90 Cele mai vechi variante confirmate — RAT cu C2 criptat cu AES-256-GCM
Mai 19 forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 Campanie în curs de publicare; versiunea 1.0.92 a fost inițial etichetată greșit ca sigură și anulată la revizuirea codului
Sfârșitul lunii mai forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino Nume de pachete surori, același lanț de instrumente
iunie 4 forge-jsxy:1.0.120 Continuare; clasificată ca sigură conform modelului ML (o eroare)
21–23 iunie forge-jsxy:1.0.121 Setul de module este neschimbat față de versiunea 1.0.120
iulie 6 zredis-typed:1.0.127 „forjă” a fost eliminat din nume; încă se livrează nave forge-jsxy-package.tgz și forgeAgent* chei de configurare
iulie 7 pinokio-redis:1.0.127 Același lanț de instrumente; C2 nou; se descrie ca o integrare „Autodesk Forge”

Două lucruri ies în evidență de-a lungul cronologiei. În primul rând, numărul versiunii 1.0.127 este reutilizat ad litteram atât de zredis-typed, cât și de pinokio-redis — denumirea se schimbă, dar linia de compilare nu se resetează. În al doilea rând, trecerea de la numele „forge-*” coincide cu o trecere către nume care se citesc ca infrastructură obișnuită (redis, pinokio), reducând șansa ca un dezvoltator să treacă peste nume și să ezite.

Indicatori de compromis

IOC-urile de mai jos sunt dezactivate. Gazda C2 a fost rotită între linia forge-jsxy și cea mai recentă variantă, păstrând în același timp același port.

Indicator Valoare Văzut în
Punct final C2 212.193.3[.]61:9877 pinokio-redis:1.0.127
Punct final C2 79.108.162[.]160:9877 linie forge-jsxy, zredis-typed:1.0.127
Canalul Exfil discord.com/api/webhooks/… (postare webhook) toate variantele
Canalul Exfil discord.com/api/v10 (încărcare prin releu) toate variantele
Canalul Exfil Încărcare HuggingFace Hub toate variantele
Artefact servit forge-jsxy-package.tgz (Via relayPackageServe) toate variantele
Fișierele Toolchain chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* toate variantele
Listă de ținte secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) toate variantele
Runtime ascuns punctat …/.forge-jsxy/runtime/v<version>/ calea directorului de configurare linie forge-jsxy
Persistența Windows Script de pornire automată ascuns PowerShell „diagnosticare forjare” toate variantele
Instalați declanșatorul hook postinstalare care invocă un lanț de scripturi dist-materialization toate variantele

Cel mai durabil semnal de detecție nu este o singură gazdă sau un singur webhook - acelea rotește — dar numele fișierelor toolchain și fișierul forge-jsxy-package.tgz artefacte, care au persistat ad litteram prin fiecare redenumire.

Atribuire și comportament observat

Pachetele au fost publicate sub mai multe conturi npm. forge-jsxy linie folosită de editorul jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); Cea mai recentă variantă Pinokio-Redis a fost publicată de Donimique (donimiqueakers@gmail[.]com). Niciunul dintre conturi nu avea o adresă de e-mail verificată sau un depozit sursă legat. Linia de legătură între conturi este lanțul de instrumente, nu identitatea editorului — aceleași nume de module, aceleași a fost difuzat .tgz, iar același design exfil se repetă indiferent de cine a publicat.

Mai multe comportamente observabile indică o ascundere deliberată, mai degrabă decât supracolectare accidentală:

Runtime-ul este plasat în afara node_modules într-un director ascuns, deci are o durată de viață mai lungă decât pachetul care l-a livrat.

Agentul se închide atunci când detectează un mediu CI, limitând expunerea în sandbox-urile de analiză automată.

Procesul agentului este lansat detașat și fereastră ascunsă.În În versiunile forge-jsxy, un comentariu a legat omiterea unui câmp de instalare vizibil de faptul că acel câmp era „vizibil pe npm”.

Descrierile pachetelor publice nu au legătură cu codul — pinokio-redis se prezintă ca o integrare „Autodesk Forge”.

O lacună recurentă în detecție merită menționată pentru apărătorii care se bazează pe Clasificare automată: au fost confirmate mai multe variante din această familie evaluat ca sigur de către un clasificator ML înainte ca revizuirea codului să corecteze verdict. Elementele stabile pe care un recenzent se poate baza — timpul de instalare lanțul, timpul de execuție ascuns, numele fișierelor toolchain — sunt exact cele care supraviețuiesc redenumirilor.

Descriem cele de mai sus ca fiind comportament observat. Nu atribuim campanie către orice actor numit și nu facem nicio afirmație cu privire la operatorul identitate sau obiective dincolo de ceea ce demonstrează codul și infrastructura.

Impact, tendințe și îndrumări Defender

Cine este expus. Colecția este destinată în mod direct dezvoltatorilor mașini: portofele și keystore-uri pentru criptomonede, extensii pentru portofelul de browser, istoricul shell-ului și acreditările cloud/servicii. Oricine instalează un pachetul afectat — direct sau ca dependenta tranzitiva — în timpul fereastra în care era activă este în domeniul de aplicare, iar designul persistenței înseamnă că expunerea nu se termină odată cu îndepărtarea ambalajului.

De ce contează perseverența. Deoarece etapa 1 copiază sarcina utilă într-un directorul de execuție ascuns și înregistrările din etapa 2 autostart, obișnuitul instinct de remediere (dezinstalați dependența proastă, ștergeți node_modules, reinstalarea) nu elimină agentul. Răspunsul la incident trebuie să caute timpul de execuție în afara arborelui și intrarea de pornire automată, nu doar pachetul.

Tendința. Această familie ilustrează un model care merită urmărit: o sarcină utilă stabilă și matură, învelită într-un flux de materiale de unică folosințănume de pachete care migrează de la orice nume care a fost eliminat anterior recunoscute, spre nume care se citesc ca infrastructură obișnuită. Bazate pe nume listele de blocare și reputația editorului se deteriorează rapid din cauza acestui comportament iar semnalele bazate pe artefacte nu.

Pentru dezvoltatori și consumatori

Tratați scripturile din timpul instalării ca principala suprafață de risc. Instalați cu scripturile dezactivate acolo unde este posibil și examinați orice dependență care declară o postinstalare. Fixați și verificați dependențele tranzitive; această clasă de programe malware ajunge la fel de ușor printr-o subdependență ca și direct.

Pe o gazdă suspectă, căutați dincolo de pachet: căutați un director de execuție ascuns în locația de configurare a platformei, o intrare neașteptată de pornire automată, și conexiuni de ieșire către webhook-ul Discord sau endpoint-uri :9877.

Presupuneți că orice frază de porțiune (seed phrase), keystore sau credențială prezentă pe o gazdă afectată în timpul ferestrei de expunere este compromisă și rotiți-o.

Pentru registre și apărători

Alertă privind artefactele durabile (forge-jsxy-package.tgz, forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload) nume de fișiere) în loc de numele pachetului, care se schimbă.

Semnalează combinația structurală pe care se bazează familia — o postinstalare care materializează scripturile într-o cale ascunsă de director de configurare plus un sistem de operare înregistrare cu pornire automată — independentă de șirurile specifice implicate.

Numele de pe ambalaj s-a schimbat de cel puțin patru ori; lada dinăuntru nu a făcut-o. Detecția bazată pe ceea ce face codul a rezistat mai mult decât fiecare reetichetarea până acum.

sca-tools-software-instrumente-de-analiză-a-compoziției
Prioritizați, remediați și securizați riscurile software
Obține-ți contul gratuit.
Nu este necesar un card de credit.

Securizează-ți dezvoltarea și livrarea de software

cu suita de produse Xygeni