🔍 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-GCM
  • lib/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 fichier LICENSE
  • 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és
  • events-channel : 38 217 963
  • indexed-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 (weed0tinystar368@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.comVT · URLhaus · ThreatFox
  • Domaines : sepolia.infura.ioVT · URLhaus · ThreatFox
  • URLs : https://eth-sepolia.g.alchemy.com/v2/0E6xblLeXLnZSnn280R-OURLhaus
  • URLs : https://sepolia.infura.io/v3/d3d6e819028346a0b973bd5dd371c468URLhaus
  • URLs : https://eth-sepolia.g.alchemy.com/v2/D2-TbkB2m05WXSnSDOCDIURLhaus
  • URLs : https://sepolia.infura.io/v3/dc7257d09fab42eca2c354c32fec1938URLhaus
  • URLs : https://eth-sepolia.g.alchemy.com/v2/NObVGNvMv3xNnlHDx3QYcURLhaus
  • MD5 : 91e020c13cb97a6365135b53b0d0fe5fVT · 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/