forge-jsxy npm Infostealer : Guide des indicateurs de compromission et de détection

forge-jsxy : Le voleur d’informations npm qui change constamment de nom

TL; DR

Pour environ deux moisUn unique logiciel espion pour npm a refait surface sous différents noms de paquets, tout en transportant une charge utile quasiment inchangée. Il a commencé ouvertement sous le nom de forge-jsxy, engendré forge-jsx3 / forge-jsx4 frères et sœurs, puis ont complètement abandonné la marque « forge » pour se présenter comme une infrastructure de développement — d'abord zredis-typed, Et plus récemment pinokio-redis.

Chaque variante comporte même chaîne d'outils interne: fichiers nommés forge-jsx-explorer-* relayPackageServe module qui sert de forge-jsxy-package.tgzet un environnement d'exécution durable caché sous un répertoire pointé afin qu'il survive à la suppression du package npm.

La charge utile se lit comme suit matériel de portefeuille de cryptomonnaie et les identifiants de développeur de l'hôte et les transmet au site web de Discordhooks, les chargements HuggingFace Hub et un point de terminaison C2 intégré. Il installe un démarrage automatique au niveau du système d'exploitation pour qu'il se relance après un redémarrage, et il capture l'activité du presse-papiers, du clavier et de l'écran. La dernière variante, pinokio-redis, se décrit elle-même comme une intégration « Autodesk Forge » — une description sans rapport avec ce que fait le code.

ÉcosystèmeNPM
classe de charge utileagent de vol d'informations multi-étapes + agent de contrôle à distance (RAT)
Cibles principalesPortefeuilles crypto, extensions de portefeuille pour navigateur, identifiants développeur/cloud
Persistenceenvironnement d'exécution durable caché + démarrage automatique du système d'exploitation (survit à la suppression du paquet)
exfiltrationdiscordehooks + relais, hub HuggingFace, C2 codé en dur sur le port 9877
Étendue observéeMai 2026 – Juillet 2026 (en cours)
Nom le plus récentpinokio-redis:1.0.127

Anatomie de l'attaque

Chaque variante de cette famille s'installe via le même format : un paquet qui semble inerte sur sa page de présentation mais déclare un hook post-installation, donc La charge utile s'exécute dès que le paquet est installé en tant que dépendance. Le crochet entraîne une chaîne à cinq étages.

  • Étape 1 — se matérialiser. Le script d'installation décode un fichier groupé et encodé Il transforme le blob en un ensemble de scripts d'exécution et les écrit dans un répertoire caché sous l'emplacement de configuration de la plateforme (les versions forge-jsxy utilisaient un chemin pointé .forge-jsxy/runtime/v / chemin). Étant donné que cette copie se trouve en dehors de node_modules, la suppression ou la dépublication du package npm ne supprime pas l'agent en cours d'exécution.
  • Étape 2 — persister. La chaîne enregistre une entrée de démarrage automatique du système d'exploitation afin que l'agent se relance au redémarrage. Sous Windows, cette opération s'effectue via un script de diagnostic PowerShell masqué ; le processus de l'agent est lancé de manière indépendante et avec l'option `windowsHide` activée afin qu'aucune fenêtre de console ne s'affiche.
  • Étape 3 — esquiver. Le runtime vérifie la présence de marqueurs d'intégration continue et s'arrête discrètement lorsqu'il détecte un environnement CI ; les environnements de test automatisés ne voient donc rien. Dans les versions forge-jsxy, un commentaire du code source indiquait que le champ forgeInstall visible avait été délibérément omis du fichier package.json « car ce champ serait visible sur npm » : l'opérateur a volontairement masqué les métadonnées du déclencheur dans la liste publique.
  • Étape 4 — collecter. Une fois lancé, l'agent récolte, en un seul passage :
  1. Matériel pour portefeuille crypto. Une liste cible secrète_filename_patterns.json intégrée déclenche une analyse du système de fichiers à la recherche de wallet.dat, *.mnemonic /Fichiers .seed / *.phrase, keypair.json, UTC Ethereum– Le paquet contient des fichiers de clés, ainsi que des fichiers de clés *.p12 / *.pfx / *.jks. Les bibliothèques de dérivation de portefeuille (bip39, secp256k1, base58check et les assistants Solana) sont incluses.
  2. Extensions de portefeuille pour navigateur. Un module chromiumExtensionDbHarvest lit les bases de données de stockage d'extensions locales des navigateurs Chromium, l'emplacement où les extensions de portefeuille basées sur le navigateur conservent leurs données de coffre-fort.
  3. Identifiants et secrets. L'agent analyse l'historique du shell et les fichiers contenant des secrets, lit les identifiants de développeur/cloud, puis encode les identifiants HuggingFace pour le téléchargement.
  4. Entrée en direct. Le contenu du presse-papiers, les saisies au clavier et les captures d'écran sont enregistrés en continu.
  • Étape 5 — exfiltrationLes données collectées quittent l'hôte par trois voies. Canaux fonctionnant en parallèle : Discord Webhooks (discordWebhookPost) et un relais de téléchargement Discord qui communique avec `discord.com/api/v10` (discordRelayUpload), les téléchargements sur HuggingFace Hub (hfUpload), et un Le point de terminaison C2 codé en dur a été atteint via le port 9877. Un relayPackageServe Ce module renvoie également un fichier forge-jsxy-package.tgz — le même Nom de l'artefact à chaque renommage.

Le point structurel important est que les étapes 1 à 3 s'exécutent au moment de l'installation avec aucune interaction de l'utilisateur, et l'étape 1 place la charge utile à un endroit du paquet Le gestionnaire ne fait pas de suivi. Un développeur qui remarque cette dépendance étrange et La commande npm uninstall supprime l'annonce mais pas l'agent.

La charge utile résiste également à une lecture rapide. Les scripts d'exécution ne sont pas fournis. en clair : une étape d'encodage-déploiement préserve la logique opérationnelle sous forme de blob encodé qui ne se déploie en scripts lisibles qu'une fois la chaîne d'installation terminée. le décode dans le répertoire d'exécution caché. Les fichiers visibles sur la liste — la fine cale post-installation et une matérialisation de distribution L'assistant révèle peu de choses sur ce qui s'exécute finalement. Cette livraison codée La conception a eu un effet mesurable sur le triage : tout au long de la vie de la famille, Plusieurs variantes confirmées ont été jugées sûres par classification automatisée. et la charge utile s'est avérée suffisamment opaque pour bloquer purement et simplement l'examen automatisé. Les comportements qui trahissent la famille ne sont visibles qu'après l'encodage. L'interface est étendue et le temps d'exécution est lu directement.

Forum

La charge utile de la famille est restée remarquablement stable ; ce qui change, c'est le Le nom figure sur la boîte. L'arc s'étend de la marque « forge » ouverte vers se dissimulent sous l'apparence d'outils de développement sans rapport.

Rendez-vous (2026) Paquet : version Note
Mai (début) forge-jsxy:1.0.81, :1.0.90 Premières variantes confirmées — RAT avec C2 chiffré AES-256-GCM
Mai 19 forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 Campagne en cours de publication ; la version 1.0.92 a été initialement étiquetée à tort comme sûre et a été corrigée lors d'une nouvelle révision du code.
Fin mai forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino Noms de paquets frères, même chaîne d'outils
juin 4 forge-jsxy:1.0.120 Suite ; classé sûr par le modèle d'apprentissage automatique (erreur)
21-23 juin forge-jsxy:1.0.121 Ensemble de modules inchangé par rapport à la version 1.0.120
juillet 6 zredis-typed:1.0.127 Le terme « forge » a été retiré du nom ; la compagnie maritime continue de naviguer forge-jsxy-package.tgz et forgeAgent* clés de configuration
juillet 7 pinokio-redis:1.0.127 Même chaîne d'outils ; nouveau C2 ; se décrit comme une intégration « Autodesk Forge ».

Deux éléments ressortent de cette chronologie. Premièrement, le numéro de version 1.0.127 est réutilisé à l'identique par zredis-typed et pinokio-redis : le nom change, mais la lignée des versions reste la même. Deuxièmement, l'abandon des noms commençant par « forge-* » coïncide avec l'adoption de noms plus classiques (redis, pinokio), réduisant ainsi le risque qu'un développeur hésite en lisant rapidement le nom.

Indicateurs de compromis

Les indicateurs de compromission (IOC) ci-dessous sont désactivés. L'hôte C2 a alterné entre la ligne forge-jsxy. et la dernière variante tout en conservant le même port.

Indicateur Valeur Vu dans
Point final C2 212.193.3[.]61:9877 pinokio-redis:1.0.127
Point final C2 79.108.162[.]160:9877 ligne forge-jsxy, zredis-typed:1.0.127
Canal d'exfiltration discord.com/api/webhooks/… (publication webhook) toutes les variantes
Canal d'exfiltration discord.com/api/v10 (téléversement par relais) toutes les variantes
Canal d'exfiltration Téléchargement sur HuggingFace Hub toutes les variantes
Artefact servi forge-jsxy-package.tgz (Via relayPackageServe) toutes les variantes
Fichiers de chaîne d'outils chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* toutes les variantes
Liste cible secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) toutes les variantes
Exécution cachée pointillé …/.forge-jsxy/runtime/v<version>/ chemin du répertoire de configuration ligne forge-jsxy
Persistance Windows Script de démarrage automatique PowerShell caché « forge diagnostics » toutes les variantes
Déclencheur d'installation Hook postinstall invoquant une chaîne de scripts de matérialisation de distribution toutes les variantes

Le signal de détection le plus durable n'est pas un hôte ou un webhook en particulier — ceux-ci rotation — mais les noms de fichiers de la chaîne d'outils et le fichier forge-jsxy-package.tgz artefact, qui ont persisté à l'identique malgré chaque changement de nom.

Attribution et comportement observé

Les paquets ont été publiés sous plusieurs comptes npm. Le paquet forge-jsxy ligne utilisée par l'éditeur jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); La dernière variante de Pinokio-Redis a été publiée par Donimique. (donimiqueakers@gmail[.]com). Aucun des deux comptes ne comportait d'adresse électronique vérifiée ou un dépôt de code source lié. Le fil conducteur entre les comptes est le chaîne d'outils, pas l'identité de l'éditeur — mêmes noms de modules, même Le fichier .tgz était servi, et le même modèle d'exfiltration se répétait quel que soit l'éditeur.

Plusieurs comportements observables indiquent une dissimulation délibérée plutôt qu'une dissimulation. collecte excessive accidentelle :

L'environnement d'exécution est placé en dehors de node_modules, dans un répertoire caché, ce qui lui permet de survivre au paquet qui l'a fourni.

L'agent se désactive lorsqu'il détecte un environnement CI, limitant ainsi l'exposition dans les environnements d'analyse automatisée.

Le processus de l'agent est lancé de manière détachée et fenêtre cachée.Dans Dans les versions forge-jsxy, un commentaire liait l'omission d'un champ d'installation visible au fait que ce champ soit « visible sur npm ».

Les descriptions publiques des paquets n'ont aucun rapport avec le code — pinokio-redis se présente comme une intégration « Autodesk Forge ».

Il convient de noter une lacune récurrente en matière de détection pour les systèmes de défense qui s'appuient sur Classification automatisée : plusieurs variants confirmés dans cette famille ont été identifiés. Un classificateur d'apprentissage automatique l'a jugé sûr avant que la revue de code ne corrige le problème. Verdict. Les éléments stables sur lesquels un évaluateur peut s'appuyer : le temps d'installation La chaîne, l'environnement d'exécution caché, les noms de fichiers de la chaîne d'outils — sont exactement ceux-là. qui survivent aux changements de nom.

Nous décrivons ce qui précède comme un comportement observé. Nous n'attribuons pas le campagne à tout acteur nommé, et nous ne faisons aucune déclaration concernant l'opérateur identité ou objectifs allant au-delà de ce que démontrent le code et l'infrastructure.

Impact, tendances et conseils aux défenseurs

Qui est exposé ? Cette collection est clairement destinée aux développeurs. machines : portefeuilles et keystores de cryptomonnaies, extensions de portefeuille pour navigateur, Historique du shell et identifiants cloud/service. Toute personne installant un colis concerné — directement ou en tant que dépendance transitive — pendant la La fenêtre pendant laquelle elle était en direct est concernée, et la conception de persistance signifie que L’exposition ne cesse pas lorsque l’emballage est retiré.

Pourquoi la persévérance est importante. Parce que l'étape 1 copie la charge utile dans un Répertoire d'exécution caché et démarrage automatique des registres de l'étape 2, comme d'habitude instinct de remédiation (désinstaller la dépendance défectueuse, supprimer node_modules, La réinstallation ne supprime pas l'agent. L'équipe de réponse aux incidents doit rechercher… l'environnement d'exécution hors arborescence et le point d'entrée de démarrage automatique, et pas seulement le paquet.

La tendance. Cette famille illustre une tendance à suivre de près : une charge utile stable et mature, enveloppée dans un flux de jetableLes noms de paquets qui s'éloignent de tout nom ayant fait l'objet d'un retrait antérieur ont été effectués. reconnaissables, pour des noms qui évoquent des infrastructures ordinaires. Basé sur le nom Les listes de blocage et la réputation des éditeurs ne résistent pas à cette évolution ; comportement- et les signaux basés sur des artefacts, non.

Pour les développeurs et les consommateurs

Considérez les scripts d'installation comme la principale source de risques. Installez avec les scripts désactivés lorsque cela est possible et examinez toute dépendance qui déclare un post-installation. Identifiez et vérifiez les dépendances transitives ; ce type de logiciel malveillant arrive aussi facilement par le biais d'une sous-dépendance que par une dépendance directe.

Sur un hôte suspect, poursuivez votre recherche au-delà du paquet : recherchez un répertoire d’exécution caché dans l’emplacement de configuration de la plateforme, une entrée de démarrage automatique inattendue, et les connexions sortantes vers les points de terminaison webhook ou :9877 de Discord.

Considérez que toute phrase de récupération de portefeuille, tout fichier de clés ou toute information d'identification présent sur un hôte affecté pendant la période d'exposition est compromis, et effectuez une rotation.

Pour les greffes et les défenseurs

Alerte concernant les artefacts persistants (forge-jsxy-package.tgz, forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload les noms de fichiers) plutôt que le nom du paquet, qui change.

Signalez la combinaison structurelle sur laquelle repose la famille : une post-installation qui matérialise les scripts dans un chemin de répertoire de configuration caché, ainsi qu’un système d’exploitation. Enregistrement au démarrage automatique — indépendamment des chaînes de caractères spécifiques impliquées.

Le nom sur le colis a changé au moins quatre fois ; la caisse à l'intérieur… Non. La détection basée sur le fonctionnement du code a survécu à toutes les autres. Réétiquetage effectué jusqu'à présent.

sca-tools-logiciel-outils-d'analyse-de-composition
Priorisez, corrigez et sécurisez vos risques logiciels
Obtenez votre compte gratuit.
Aucune carte de crédit requise.

Sécurisez le développement et la livraison de vos logiciels

avec la suite de produits Xygeni