🔍 Contexte

Le 28 juillet 2026, l’équipe de recherche de Socket a publié une analyse technique détaillée de la compromission de deux packages npm bêta appartenant à l’espace de noms @joyfill : @joyfill/layouts@0.1.2-2773.beta.0 et @joyfill/components@4.0.0-rc24-2773-beta.4. Joyfill est un éditeur de SDK pour l’intégration de formulaires, documents et PDFs dans des applications web et mobiles.

🎯 Nature de l’attaque

Les deux versions malveillantes contiennent un implant JavaScript injecté au moment du bundling (présent dans les source maps), qui s’exécute au chargement du module (import-time), rendant npm install --ignore-scripts inefficace. L’implant utilise un mécanisme de résolution de payload via des transactions blockchain publiques (Tron, Aptos, BNB Smart Chain) pour récupérer du code chiffré, le déchiffrer par XOR, et l’évaluer dynamiquement.

⚙️ Chaîne d’infection

Stage 0 – Bootstrap :

  • Obfuscation multi-couches (shuffle de caractères, table de chaînes, décompresseur, Function() dynamique)
  • Exposition des primitives Node.js en globaux (global.r, global.m)
  • Lancement de deux branches parallèles : une in-process, une détachée via child_process.spawn("node", ["-e", payload], {detached: true})

Stage 1 – Résolution blockchain :

  • Récupération d’un hash de transaction BSC depuis la dernière transaction sortante d’une adresse Tron (fallback Aptos)
  • Décodage et déchiffrement XOR du payload suivant

Stage 2 – Sélection C2 et second hop blockchain :

  • Loader de 5 849 octets configurant le endpoint Socket.IO (166.88.134.62:443) selon le marqueur _V = A9-0135-3
  • Deuxième résolution blockchain pour récupérer le RAT final

Stage final – RAT Node.js (77 KB) :

  • Versionnée 260605, utilise socket.io-client
  • Commandes : ss_info, ss_eval, ss_eval64, ss_upf, ss_dir, ss_cb, ss_stop, ss_inz, etc.
  • Collecte : informations système, liste de processus Windows, IP publique via ip-api.com, données clipboard
  • Persistance dans VS Code, Cursor, Antigravity (@vscode/deviceid), Discord Desktop, GitHub Desktop, npm CLI global
  • Tags d’injection : /*C250617A*/, /*C250618A*/, /*C260511A*/, /*RS260605*/

Branche détachée – /$/boot downloader :

  • Requête vers 23.27.13.43/$/boot avec header Sec-V: A9-0135-3
  • Déchiffrement XOR (ThZG+0jfXE6VAGOJ) et évaluation du résultat
  • Peut provisionner Python et télécharger un infostealer Python (82 457 octets) identifié comme probable itération d’OmniStealer

🧬 Attribution et familles de malwares

L’implant présente des indicateurs de la famille PolinRider (structure multi-chain, marqueurs globaux, clés XOR). Le RAT final correspond à la famille DEV#POPPER (marqueur Sec-V, endpoint /$/boot, clé ThZG+0jfXE6VAGOJ, commandes ss_*, persistance via outils développeurs). Cette campagne recoupe une analyse eSentire de 2026 impliquant DEV#POPPER et OmniStealer via un clone GitHub weaponisé (“ShoeVista”), mais le vecteur ici semble être une compromission de mainteneur.

📦 Packages affectés

  • @joyfill/layouts@0.1.2-2773.beta.0 (publié 2026-07-28T10:54:57Z)
  • @joyfill/components@4.0.0-rc24-2773-beta.4 (publié 2026-07-28T11:03:59Z)
  • Les versions précédentes (@joyfill/layouts@0.1.1, @joyfill/components@4.0.0-rc24) ne contiennent pas l’implant

📰 Type d’article

Analyse technique approfondie publiée par Socket Research Team, visant à documenter une compromission de chaîne d’approvisionnement npm active, fournir des IoCs exploitables et caractériser les familles de malwares impliquées.

🧠 TTPs et IOCs détectés

Acteurs de menace

TTP

  • T1195.002 — Compromise Software Supply Chain (Initial Access)
  • T1027 — Obfuscated Files or Information (Defense Evasion)
  • T1027.013 — Encrypted/Encoded File (Defense Evasion)
  • T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
  • T1059.006 — Command and Scripting Interpreter: Python (Execution)
  • T1059.004 — Command and Scripting Interpreter: Unix Shell (Execution)
  • T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
  • T1105 — Ingress Tool Transfer (Command and Control)
  • T1115 — Clipboard Data (Collection)
  • T1546 — Event Triggered Execution (Persistence)
  • T1041 — Exfiltration Over C2 Channel (Exfiltration)

IOC

  • IPv4 : 166.88.134.62AbuseIPDB · VT · ThreatFox
  • IPv4 : 23.27.13.43AbuseIPDB · VT · ThreatFox
  • IPv4 : 198.105.127.210AbuseIPDB · VT · ThreatFox
  • IPv4 : 23.27.202.27AbuseIPDB · VT · ThreatFox
  • Domaines : api.trongrid.ioVT · URLhaus · ThreatFox
  • Domaines : fullnode.mainnet.aptoslabs.comVT · URLhaus · ThreatFox
  • Domaines : bsc-dataseed.binance.orgVT · URLhaus · ThreatFox
  • Domaines : bsc-rpc.publicnode.comVT · URLhaus · ThreatFox
  • Domaines : ip-api.comVT · URLhaus · ThreatFox
  • URLs : http://23.27.13.43/$/bootURLhaus
  • URLs : http://166.88.134.62/u/fURLhaus
  • URLs : http://166.88.134.62/0x/jsURLhaus
  • URLs : http://166.88.134.62/verify-human/URLhaus
  • URLs : http://23.27.13.43/$/1URLhaus
  • SHA256 : adc4af90540d33cd1e98f44b51482ae9250fbeb97d6f8d7841c81b618cb2c6e6VT · MalwareBazaar
  • SHA256 : 8e8b90dedd456ded0c5748119836e1ca1066112bc569c1b41ca70eb931d1d4dcVT · MalwareBazaar
  • SHA256 : 5f6a92006ca2ea4b464d66fb41af777edce7296939a7c6ee491e2b3cbfe09848VT · MalwareBazaar
  • SHA256 : bcc93dc55bc7daedf4ca57254f0e7a7f1c40e09851eab98fe10cde801982db17VT · MalwareBazaar
  • SHA256 : 1352ad22c99983d91e600348b7cbf58235131b1ee34cea9f09623206d5b7dea7VT · MalwareBazaar
  • SHA256 : 67c6ef602cc850f10d935fee53fa40440df841adf081563bf4fc2631a71249ceVT · MalwareBazaar
  • SHA256 : c5742ea1875ecd2360022624149994909cd0546e221e4203dffd01f48de45469VT · MalwareBazaar
  • SHA256 : cb46f12d70824ea24ed1f8bcf45bf3f86680e02a9089aafc03b27f691be57be3VT · MalwareBazaar
  • SHA256 : f452f9cfa539f4a1fe25187a99a484391290d5dbaa422ba455edf6b04f81b7d1VT · MalwareBazaar
  • SHA256 : 78f0de8682e0e894a5784eb7e95db4da6088f528918ca3107dd1e76f80a561d8VT · MalwareBazaar
  • SHA256 : ae7565109fd01b88d82acf7f73ab20709cbc2c9f26fdea13e429ccc87a55d4fbVT · MalwareBazaar
  • SHA256 : 26351aed0397158d3a3b8cc8fd3047d4c015d264c9895f10f20f1521b974ed18VT · MalwareBazaar
  • SHA256 : 26e679eaf1e9baeb7c55eb48db482301171d4d26e1728544b23734a90dc70e1bVT · MalwareBazaar
  • SHA256 : 2cfede38fb121a71a2f3607474aa8cd588a99f51b37e5e6f0d8cb789fa275032VT · MalwareBazaar
  • SHA256 : 36ff00b45e67baa7e3674b0c80f48e88737264c61e5c6b3b091200972de8157cVT · MalwareBazaar
  • Fichiers : dist/index.cjs.js
  • Fichiers : dist/index.es.js
  • Fichiers : dist/index.js
  • Fichiers : dist/index.esm.js
  • Fichiers : dist/joyfill.min.js
  • Fichiers : python.zip
  • Fichiers : 7zr.exe
  • Fichiers : python.7z
  • Chemins : %USERPROFILE%\.npm
  • Chemins : /tmp/.npm
  • Chemins : node_modules/npm/lib/cli.js
  • Chemins : resources/app/main.js

Malware / Outils

  • DEV#POPPER RAT (rat)
  • OmniStealer (stealer)
  • PolinRider (loader)

🟢 Indice de vérification factuelle : 95/100 (haute)

  • ✅ socket.dev — source reconnue (liste interne) (20pts)
  • ✅ 21369 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 41 IOCs dont des hashes (15pts)
  • ✅ 4/12 IOCs confirmés (AbuseIPDB, MalwareBazaar, ThreatFox, URLhaus, VirusTotal) (15pts)
  • ✅ 11 TTPs MITRE identifiées (15pts)
  • ✅ date extraite du HTML source (10pts)
  • ✅ acteur(s) identifié(s) : DEV#POPPER (5pts)
  • ⬜ pas de CVE à vérifier (0pts)

IOCs confirmés externellement :

  • 166.88.134.62 (ip) → VT (13/91 détections)
  • 23.27.13.43 (ip) → VT (6/91 détections)
  • 198.105.127.210 (ip) → VT (17/91 détections)
  • bsc-dataseed.binance.org (domain) → VT (5/91 détections)

🔗 Source originale : https://socket.dev/blog/joyfill-npm-beta-releases-compromised