🔍 Contexte
Publié le 21 septembre 2026 par JFrog Security Research, cet article présente l’analyse complète d’une campagne de supply-chain npm active depuis mars 2026, baptisée « Equation of Compromise ». La campagne regroupe plusieurs incidents signalés séparément par d’autres vendeurs et cible principalement les développeurs quantitatifs et DeFi.
🎯 Mécanisme d’infection
Le vecteur initial est un package npm malveillant (mathsbase) copiant la bibliothèque légitime mathjs. Le package embarque :
lib/cjs/utils/event.js: loader AES-256-GCMlib/cjs/utils/graph.js: orchestrateur (stage 2, base64 chiffré)lib/cjs/utils/fraction.js: agent Slack (stage 3, base64 chiffré)lib/cjs/utils/bignumber/type.js: copie bundlée d’ethers.js v5.7.2 (~1,5 MB)
Le déclencheur est cryptographiquement conditionnel : le payload ne se déchiffre que si la victime appelle math.lusolve() avec la matrice de Pascal 3×3 symétrique [[1,1,1],[1,2,3],[1,3,6]]. Le facteur LU de cette matrice sert de mot de passe pour dériver la clé AES via scryptSync. Toute autre matrice échoue à l’authentification GCM sans erreur visible.
🏗️ Infrastructure C2
Canal principal — Smart contract Ethereum Sepolia :
- 14 contrats déployés par 5 wallets opérateurs entre mars et septembre 2026
- Noms vérifiés :
WalletDataRegistry,WebDataRegistry,WalletHelloWorld - 1 080 taskings, 2 162 payloads chiffrés (non déchiffrables, clé X25519 éphémère)
- Enrollment via allowlist on-chain, clé de wallet chiffrée dans le contrat
Canal secondaire — Agent Slack (fraction.js) :
- Polling toutes les 10 secondes sur
conversations.history - Payloads transmis en chunks texte, réassemblés et exécutés en
utils/subwatcher - Credentials chiffrés sous le mot de passe déclencheur + DH contre clé serveur hardcodée
- Commande
exitexitexit= désinstallation propre
Canal de reporting — Slack + Telegram :
- Beacon système (platform, hostname, CPU, RAM) posté en Markdown
- Deux bots Telegram distincts avec tokens hardcodés
📦 Marqueur d’infection et persistance
- Marqueur : ligne
REDISTRIBUTION REQUIRES INCLUSION OF THIS LICENSE.ajoutée au fichierLICENSE - Persistance : processus détaché (
detached: true, stdio: "ignore", unref()) - Payload exécuté :
lib/cjs/utils/subwatcher(mode 755)
🏭 Ferme de téléchargements
Trois comptes GitHub publics (andrewstory18, davidbabcock96, azlanrahman322-creator) opèrent 30 dépôts de workers GitHub Actions téléchargeant les packages cibles des millions de fois pour simuler la popularité. La liste cible est chiffrée AES-256-GCM dans commands.json, mais la clé npm_workvr_protect_key_v1 est compilée en clair dans le WASM.
Packages les plus gonflés :
events-sync: 40 715 826 téléchargements simulésevents-channel: 38 217 963indexed-btree: 37 969 615
👤 Attribution et comptes opérateurs
Les opérateurs utilisent des comptes npm/GitHub jetables avec emails @proton.me et @outlook.com. Le pivot clé est le handle tinystar368 réutilisé sur npm (weed0 → tinystar368@gmail.com) et GitHub (UmajiHidekata). 21 comptes npm et 23+ organisations GitHub identifiés dans le cluster.
❓ Inconnues
- Contenu des payloads de tasking (chiffrement X25519 éphémère inviolable)
- Matrice déclencheur de
matrixflow-js@3.2.1(comparaison SHA-256 contre constante) - Mécanisme d’inflation pré-juillet 2026
📄 Type d’article
Publication de recherche technique approfondie (teardown complet) visant à documenter une campagne active, fournir des IoC exploitables et alerter la communauté de sécurité sur une opération de supply-chain npm toujours en cours.
🧠 TTPs et IOCs détectés
TTP
- T1195.002 — Supply Chain Compromise: Compromise Software Supply Chain (Initial Access)
- T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
- T1027 — Obfuscated Files or Information (Defense Evasion)
- T1027.002 — Obfuscated Files or Information: Software Packing (Defense Evasion)
- T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
- T1102 — Web Service (Command and Control)
- T1573.001 — Encrypted Channel: Symmetric Cryptography (Command and Control)
- T1573.002 — Encrypted Channel: Asymmetric Cryptography (Command and Control)
- T1082 — System Information Discovery (Discovery)
- T1543 — Create or Modify System Process (Persistence)
- T1036.003 — Masquerading: Rename System Utilities (Defense Evasion)
- T1105 — Ingress Tool Transfer (Command and Control)
- T1553 — Subvert Trust Controls (Defense Evasion)
- T1608.001 — Stage Capabilities: Upload Malware (Resource Development)
- T1588.001 — Obtain Capabilities: Malware (Resource Development)
IOC
- Domaines :
eth-sepolia.g.alchemy.com— VT · URLhaus · ThreatFox - Domaines :
sepolia.infura.io— VT · URLhaus · ThreatFox - URLs :
https://eth-sepolia.g.alchemy.com/v2/0E6xblLeXLnZSnn280R-O— URLhaus - URLs :
https://sepolia.infura.io/v3/d3d6e819028346a0b973bd5dd371c468— URLhaus - URLs :
https://eth-sepolia.g.alchemy.com/v2/D2-TbkB2m05WXSnSDOCDI— URLhaus - URLs :
https://sepolia.infura.io/v3/dc7257d09fab42eca2c354c32fec1938— URLhaus - URLs :
https://eth-sepolia.g.alchemy.com/v2/NObVGNvMv3xNnlHDx3QYc— URLhaus - MD5 :
91e020c13cb97a6365135b53b0d0fe5f— VT · MalwareBazaar - Emails :
tinystar368@gmail.com - Emails :
tinystar368@proton.me - Emails :
elenahorn97@proton.me - Emails :
allennightgale0812@outlook.com - Emails :
lin.n.ping@proton.me - Emails :
hunterhicks18@proton.me - Emails :
jamesmorse82@proton.me - Emails :
mona.willis@outlook.com - Emails :
andrew.story18@outlook.com - Emails :
david.babcock96@outlook.com - Emails :
azlanrahman322@gmail.com - Emails :
mattpalmer0602@gmail.com - Emails :
justin.campos454@outlook.com - Emails :
gerry.smith2026@outlook.com - Emails :
wesley.moses97@outlook.com - Emails :
joseph.jordan93@outlook.com - Emails :
lesstafford24@outlook.com - Emails :
angelinaparrish18@outlook.com - Emails :
bradley.steven93@outlook.com - Emails :
ignacionunez91@outlook.com - Emails :
moniquemeza22@outlook.com - Fichiers :
event.js - Fichiers :
graph.js - Fichiers :
fraction.js - Fichiers :
type.js - Fichiers :
subwatcher - Fichiers :
commands.json - Fichiers :
index.js - Fichiers :
worker_wasm_bg.wasm - Fichiers :
run-worker.yml - Chemins :
lib/cjs/utils/event.js - Chemins :
lib/cjs/utils/graph.js - Chemins :
lib/cjs/utils/fraction.js - Chemins :
lib/cjs/utils/bignumber/type.js - Chemins :
lib/cjs/utils/subwatcher
⚠️ À propos de ces IOC — ils sont extraits automatiquement de l’article original le 22 septembre 2026 et n’ont pas fait l’objet d’une vérification externe. Un indicateur peut avoir été réattribué depuis : une IP de C2 peut redevenir un service légitime, un domaine sinkholé peut changer de propriétaire. Aucune garantie d’exactitude ni d’actualité — contrôlez leur validité avant tout usage opérationnel, en particulier avant de les injecter dans une blocklist ou un SIEM.
Malware / Outils
- mathsbase npm loader (event.js) (loader)
- graph.js orchestrator (backdoor)
- fraction.js Slack agent (rat)
- npm download farm (WASM worker) (tool)
🟡 Indice de vérification factuelle : 55/100 (moyenne)
- ⬜ research.jfrog.com — source non référencée (0pts)
- ✅ 28323 chars — texte complet (fulltext extrait) (15pts)
- ✅ 43 IOCs dont des hashes (15pts)
- ⬜ 0/5 IOCs confirmés externellement (0pts)
- ✅ 15 TTPs MITRE identifiées (15pts)
- ✅ date extraite du HTML source (10pts)
- ⬜ aucun acteur de menace nommé (0pts)
- ⬜ pas de CVE à vérifier (0pts)
🔗 Source originale : https://research.jfrog.com/post/equation-of-compromise/