TL; DR
Voor ongeveer twee maandenEen enkele npm infostealer is opnieuw opgedoken onder een steeds wisselende pakketnaam, terwijl de payload vrijwel ongewijzigd blijft. Het begon openlijk als forge-jsxy, voortgebracht forge-jsx3 / forge-jsx4 broers en zussen, waarna ze de merknaam "forge" volledig lieten vallen om zich voor te doen als ontwikkelaarsinfrastructuur — eerst zredis-typeden meest recent pinokio-redis.
Elke variant heeft de dezelfde interne gereedschapsketen: bestanden met de naam forge-jsx-explorer-*, een relayPackageServe module die dienst doet als een forge-jsxy-package.tgzen een duurzame runtime die verborgen is in een map met puntnotatie, zodat deze ook na verwijdering van het npm-pakket behouden blijft.
De gegevens lezen materiaal voor cryptowallets en de ontwikkelaarsgegevens van de host en verzendt deze naar Discord web.hooksHuggingFace Hub uploadt bestanden en heeft een hardgecodeerd C2-eindpunt. Het installeert autostart op besturingssysteemniveau, zodat het na een herstart opnieuw wordt uitgevoerd, en het registreert klembord-, toetsenbord- en schermactiviteit. De nieuwste variant, pinokio-redisHet omschrijft zichzelf als een "Autodesk Forge"-integratie, een omschrijving die niets te maken heeft met wat de code doet.
| Ecosysteem | NPM |
| Payload-klasse | meertraps infodiefstal + agent voor afstandsbediening (RAT) |
| Primaire doelen | cryptowallets, browserextensies voor wallets, ontwikkelaars-/cloudreferenties |
| Volharding | verborgen duurzame runtime + automatisch opstarten van het besturingssysteem (blijft behouden na verwijdering van het pakket) |
| exfiltratie | Discord-webhooks + relais, HuggingFace Hub, hardgecodeerde C2 op poort 9877 |
| Waargenomen spanwijdte | Mei 2026 – juli 2026 (doorlopend) |
| Laatste naam | pinokio-redis:1.0.127 |
Aanvalsanatomie
Elke variant in deze familie wordt op dezelfde manier geïnstalleerd: via een pakket. dat er op de productpagina inactief uitziet, maar een postinstall-hook declareert, dus De payload wordt uitgevoerd zodra het pakket als afhankelijkheid is geïnstalleerd. De haak drijft een vijftrapsketting aan.
- Fase 1 — materialiseren. Het installatiescript decodeert een gebundeld, gecodeerd bestand. De blob wordt in een set runtime-scripts geplaatst en vervolgens naar een verborgen map onder de platformconfiguratielocatie geschreven (de forge-jsxy-versies gebruikten een puntnotatie .forge-jsxy/runtime/v). / pad). Omdat deze kopie zich buiten node_modules bevindt, wordt de actieve agent niet verwijderd wanneer het npm-pakket wordt verwijderd of gedeactiveerd.
- Fase 2 — volhouden. De keten registreert een opstartitem in het besturingssysteem, zodat de agent bij het herstarten opnieuw wordt gestart. Op Windows wordt dit uitgevoerd via een verborgen PowerShell-diagnosescript; het agentproces wordt losgekoppeld gestart en met de eigenschap `windowsHide` ingesteld, zodat er geen consolevenster verschijnt.
- Fase 3 — ontwijken. De runtime controleert op markers voor continue integratie en stopt stilzwijgend wanneer een CI-omgeving wordt gedetecteerd, waardoor geautomatiseerde build-sandboxes niets zien. In de forge-jsxy-versies stond in een broncommentaar dat een zichtbaar forgeInstall-veld opzettelijk was weggelaten uit package.json "omdat dat veld zichtbaar zou zijn op npm" — de beheerder hield de trigger-metadata bewust weg uit de openbare lijst.
- Fase 4 — verzamelen. Eenmaal gestart, verzamelt de agent in één keer het volgende:
- Materiaal voor cryptowallets. Een gebundelde doellijst secret_filename_patterns.json stuurt een bestandssysteemscan aan voor wallet.dat, *.mnemonic /..seed / *.phrase-bestanden, keypair.json, Ethereum UTC– Keystores, en *.p12 / *.pfx / *.jks keystores. Wallet-derivatiebibliotheken (bip39, secp256k1, base58check en Solana helpers) zijn in de bundel aanwezig.
- Browser-wallet-extensies. Een chromiumExtensionDbHarvest-module leest de lokale extensieopslagdatabases van Chromium-browsers, de locatie waar browsergebaseerde wallet-extensies hun kluisgegevens bewaren.
- Referenties en geheimen. De agent scant de shellgeschiedenis en bestanden met geheime gegevens, leest de inloggegevens van ontwikkelaars/cloudproviders en codeert vervolgens de HuggingFace-inloggegevens voor upload.
- Live invoer. De inhoud van het klembord, toetsenbordinvoer en schermafbeeldingen worden continu vastgelegd.
Fase 5 — UitfiltratieDe verzamelde gegevens verlaten de host via drie kanalen. kanalen die parallel werken: Discord-webhooks (discordWebhookPost) en een Discord-relay-uploader die communiceert met `discord.com/api/v10` (discordRelayUpload), HuggingFace Hub-uploads (hfUpload), en een Het hardgecodeerde C2-eindpunt is bereikt via poort 9877. Een relayPackageServe De module geeft bovendien een forge-jsxy-package.tgz terug — hetzelfde bestand. De naam van het artefact wordt bij elke hernoeming behouden.
Het belangrijke structurele punt is dat fases 1-3 tijdens de installatie worden uitgevoerd met geen gebruikersinteractie, en fase 1 plaatst de payload ergens in het pakket. De manager houdt dit niet bij. Een ontwikkelaar die de vreemde afhankelijkheid opmerkt en Het commando `npm uninstall` verwijdert de vermelding, maar niet de agent.
De payload is bovendien moeilijk snel uit te lezen. De runtime-scripts worden niet meegeleverd. in het ongewisse: een coderings- en implementatiestap zorgt ervoor dat de operationele logica als een gecodeerde blob die pas in leesbare scripts wordt omgezet zodra de installatieketen is voltooid decodeert het in de verborgen runtime-directory. De bestanden die zichtbaar zijn. op de lijst — de dunne postinstallatie-shim en een dist-materialisatie helper — onthult weinig over wat er uiteindelijk gebeurt. Deze gecodeerde levering Het ontwerp heeft een meetbaar effect gehad op de triage: gedurende het hele leven van het gezin, Meerdere bevestigde varianten werden door geautomatiseerde classificatie als veilig beoordeeld. En de gegevens waren zo ondoorzichtig dat geautomatiseerde beoordeling volledig vastliep. Het gedrag dat de familie verraadt, wordt pas zichtbaar na de codering. Het podium wordt uitgebreid en de runtime wordt direct uitgelezen.
Timeline
Het laadvermogen van de familie is opmerkelijk stabiel gebleven; wat verandert is de naam op de doos. De boog loopt van open "forge"-merknaam naar doet zich voor als ongerelateerde ontwikkelaarstools.
| Datum (2026) | Pakket: versie | Note |
|---|---|---|
| Mei (begin) | forge-jsxy:1.0.81, :1.0.90 | Vroegst bevestigde varianten — RAT met AES-256-GCM-gecodeerde C2 |
| mei 19 | forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 | Campagne in actieve publicatie; versie 1.0.92 werd aanvankelijk ten onrechte als veilig bestempeld en na herziening van de code teruggedraaid. |
| Eind mei | forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino | Namen van verwante pakketten, dezelfde toolchain. |
| juni 4 | forge-jsxy:1.0.120 | Vervolg; door het ML-model als veilig geclassificeerd (een misser) |
| 21-23 juni | forge-jsxy:1.0.121 | Module set ongewijzigd ten opzichte van 1.0.120 |
| juli 6 | zredis-typed:1.0.127 | "Forge" is uit de naam verdwenen; er worden nog steeds schepen verzonden. forge-jsxy-package.tgz en forgeAgent* configuratiesleutels |
| juli 7 | pinokio-redis:1.0.127 | Dezelfde toolchain; nieuwe C2; beschrijft zichzelf als een "Autodesk Forge"-integratie |
Twee dingen vallen op in de tijdlijn. Ten eerste wordt het versienummer 1.0.127 letterlijk hergebruikt door zowel zredis-typed als pinokio-redis — de naamgeving verandert, maar de build-geschiedenis blijft hetzelfde. Ten tweede valt de verschuiving weg van "forge-*"-namen samen met een verschuiving naar namen die klinken als gewone infrastructuur (redis, pinokio), waardoor de kans kleiner wordt dat een ontwikkelaar de naam vluchtig leest en aarzelt.
Indicatoren van compromis
De onderstaande IOC's zijn onschadelijk gemaakt. De C2-host roteerde tussen de forge-jsxy-lijn. en de nieuwste variant, waarbij dezelfde poort behouden blijft.
| Indicator | Waarde | Gezien in |
|---|---|---|
| C2-eindpunt | 212.193.3[.]61:9877 | pinokio-redis:1.0.127 |
| C2-eindpunt | 79.108.162[.]160:9877 | forge-jsxy regel, zredis-typed:1.0.127 |
| Exfiltratiekanaal | discord.com/api/webhooks/… (webhook-bericht) | alle varianten |
| Exfiltratiekanaal | discord.com/api/v10 (relay upload) | alle varianten |
| Exfiltratiekanaal | HuggingFace Hub upload | alle varianten |
| Geserveerd artefact | forge-jsxy-package.tgz (via relayPackageServe) | alle varianten |
| Toolchain-bestanden | chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* | alle varianten |
| Doellijst | secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) | alle varianten |
| Verborgen runtime | stippel …/.forge-jsxy/runtime/v<version>/ configuratiemap pad | forge-jsxy regel |
| Windows-persistentie | verborgen PowerShell-script voor automatisch opstarten met "Forge-diagnostiek" | alle varianten |
| Trigger installeren | postinstall-hook die een dist-materialisatie-scriptketen aanroept | alle varianten |
Het meest betrouwbare detectiesignaal is niet één enkele host of webhook, maar juist die signalen die het meest betrouwbaar zijn. roteren — maar de toolchain-bestandsnamen en het forge-jsxy-package.tgz-bestand blijven behouden. artefacten, die bij elke hernoeming ongewijzigd zijn gebleven.
Toeschrijving en geobserveerd gedrag
De pakketten werden onder meerdere npm-accounts gepubliceerd. De forge-jsxy De regel is afkomstig van de uitgever jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); De nieuwste Pinokio-Redis-variant werd gepubliceerd door Donimique. (donimiqueakers@gmail[.]com). Geen van beide accounts had een geverifieerd e-mailadres of een gekoppelde bronnenrepository. De rode draad door alle accounts is de toolchain, niet de identiteit van de uitgever — dezelfde modulenamen, hetzelfde De bestanden werden als .tgz aangeboden, en hetzelfde exfiltratieontwerp keert terug, ongeacht wie ze publiceert.
Verschillende waarneembare gedragingen wijzen eerder op opzettelijke verhulling dan op... onbedoelde oververzameling:
De runtime bevindt zich buiten de node_modules-map in een verborgen directory, waardoor deze langer meegaat dan het pakket dat deze heeft geleverd.
De agent stopt wanneer hij een CI-omgeving detecteert, waardoor de blootstelling in geautomatiseerde analyse-sandboxes wordt beperkt.
Het agentproces wordt losgekoppeld gestart en venster verborgen.In In de forge-jsxy-versies koppelde een opmerking het ontbreken van een zichtbaar installatieveld aan het feit dat dat veld "zichtbaar is op npm".
De openbare pakketbeschrijvingen hebben niets met de code te maken — pinokio-redis presenteert zich als een "Autodesk Forge"-integratie.
Een terugkerend detectieprobleem is het vermelden waard voor verdedigers die afhankelijk zijn van... geautomatiseerde classificatie: meerdere bevestigde varianten in deze familie werden werd door een machine learning-classificator als veilig beoordeeld voordat de code werd gecorrigeerd. oordeel. De stabiele elementen waarop een recensent zich kan baseren — de installatietijd chain, de verborgen runtime, de toolchain-bestandsnamen — dat zijn precies de juiste die de naamswijzigingen overleven.
We beschrijven het bovenstaande als waargenomen gedrag. We schrijven het gedrag niet toe aan de waarnemingen. campagne gericht aan een willekeurige genoemde persoon, en we doen geen uitspraak over de operator. identiteit of doelstellingen die verder gaan dan wat de code en infrastructuur aantonen.
Impact, trends en richtlijnen voor verdedigers
Wie wordt blootgesteld? De collectie is specifiek gericht op ontwikkelaars. machines: cryptocurrency wallets en keystores, browser wallet-extensies, shellgeschiedenis en cloud-/servicegegevens. Iedereen die een installatie uitvoert, krijgt toegang tot de shellgeschiedenis en cloud-/servicegegevens. getroffen pakket — direct of als een transitieve afhankelijkheid — tijdens de Het venster waarin het live was, valt binnen het toepassingsgebied, en het persistentieontwerp betekent dat... De blootstelling eindigt niet wanneer de verpakking wordt verwijderd.
Waarom volharding belangrijk is. Omdat fase 1 de payload kopieert naar een verborgen runtime-directory en fase 2-registers autostart, het gebruikelijke herstelinstinct (de slechte afhankelijkheid verwijderen, node_modules verwijderen, (Opnieuw installeren) verwijdert de agent niet. Incidentrespons moet op zoek gaan naar de agent. Het gaat om de runtime buiten de broncode en de autostart-vermelding, niet alleen om het pakket zelf.
De trend. Deze familie illustreert een patroon dat de moeite waard is om in de gaten te houden: een stabiele en volwassen lading, verpakt in een stroom wegwerpartikelenpakketnamen die afwijken van elke naam die eerder door een verwijderingsactie is gebruikt. herkenbaar, richting namen die klinken als gewone infrastructuur. Op naam gebaseerd Blokkeerlijsten en de reputatie van uitgevers verliezen hierdoor snel aan kracht; gedrag- en signalen die gebaseerd zijn op artefacten doen dat niet.
Voor ontwikkelaars en consumenten
Beschouw installatiescripts als het grootste risico. Installeer waar mogelijk met scripts uitgeschakeld en controleer elke afhankelijkheid die een script declareert. na installatie. Identificeer en controleer transitieve afhankelijkheden; dit type malware kan zich net zo gemakkelijk via een subafhankelijkheid als via een directe afhankelijkheid verspreiden.
Zoek op een verdachte host verder dan het pakket zelf: kijk of er een verborgen runtime-directory in de platformconfiguratiemap zit, of een onverwachte autostart-vermelding. en uitgaande verbindingen naar Discord-webhook- of :9877-eindpunten.
Ga ervan uit dat elke wallet seed phrase, keystore of inloggegevens die tijdens de blootstellingsperiode op een getroffen host aanwezig zijn, gecompromitteerd zijn, en vervang deze.
Voor registers en verdedigers
Waarschuwing voor de duurzame artefacten (forge-jsxy-package.tgz, forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload) bestandsnamen) in plaats van de pakketnaam, die verandert.
Markeer de structurele combinatie waarop de familie vertrouwt: een postinstallatie die scripts materialiseert in een verborgen configuratiemap plus een besturingssysteem. Autostartregistratie — onafhankelijk van de specifieke gebruikte tekenreeksen.
De naam op de verpakking is minstens vier keer veranderd; de krat erin Niet dus. Detectie gebaseerd op wat de code doet, heeft alle andere methoden overleefd. Tot nu toe is er sprake van herlabeling.



