🔍 Contexte

Publié le 17 juin 2026 par la Microsoft Defender Security Research Team, cet article documente une attaque supply chain npm de grande envergure ciblant l’écosystème Mastra. Microsoft Threat Intelligence a identifié la compromission et partagé ses conclusions avec l’équipe de sécurité npm, qui a supprimé les packages affectés et révoqué les droits de publication du compte compromis.

⚔️ Déroulement de l’attaque

L’attaque s’est déroulée en six phases :

  1. Compromission de compte : Prise de contrôle du compte npm ehindero, mainteneur légitime avec droits de publication sur le scope @mastra.
  2. Création du typosquat : Publication de easy-day-js, impersonation de la bibliothèque légitime dayjs (57M+ téléchargements hebdomadaires), via un compte anonyme Tutamail.
  3. Empoisonnement massif : Publication de nouvelles versions de 140+ packages @mastra injectant easy-day-js@^1.11.21 comme dépendance, toutes taguées latest.
  4. Livraison : La plage SemVer ^1.11.21 résout vers la version 1.11.22 contenant le hook postinstall malveillant.
  5. Exécution : Le hook déclenche un dropper obfusqué de 4 572 octets (setup.cjs) qui désactive la vérification TLS et contacte le C2.
  6. Payload de second stade : Téléchargement et exécution d’un implant Node.js multiplateforme (~41 Ko) en processus détaché.

🎯 Stratégie de livraison en deux phases

  • Phase 1 (leurre propre) : easy-day-js@1.11.21 publié le 16 juin 2026 à 07:05 UTC — code dayjs légitime, sans payload.
  • Phase 2 (armement) : easy-day-js@1.11.22 publié le 17 juin 2026 à 01:01 UTC — ajout de setup.cjs et du hook postinstall.

🛠️ Analyse technique du payload

Stage 0 — Dropper obfusqué (setup.cjs) : Tableau de 40 chaînes Base64 mélangées via un seed numérique (0x4c11d), décodées par une fonction personnalisée.

Séquence d’attaque en 5 étapes :

  • Désactivation de la vérification TLS (NODE_TLS_REJECT_UNAUTHORIZED = '0')
  • Dépôt de marqueurs filesystem : $TMPDIR/.pkg_history et $TMPDIR/.pkg_logs (XOR 0x80)
  • Requête GET vers https://23.254.164.92:8000/update/49890878 pour télécharger le payload de second stade
  • Écriture du payload sous un nom hexadécimal aléatoire (<12 hex bytes>.js) et exécution en processus détaché
  • Auto-suppression du dropper (fs.rmSync(__filename))

Sur Windows : Injection réflexive d’assembly .NET en mémoire dans cmd.exe, chaîne entièrement fileless.

🔒 Persistance multiplateforme

OS Mécanisme Artefact
Windows Registry Run key (HKCU) NvmProtocalprotocal.cjs
macOS LaunchAgent (RunAtLoad) com.nvm.protocal.plist
Linux systemd user unit nvmconf.service

📤 Collecte et exfiltration

  • Inventaire de 166 extensions de wallets crypto (MetaMask, Phantom, Coinbase, Binance, TronLink…)
  • Historique de navigation (SQLite) depuis Chrome, Edge, Brave
  • Reconnaissance hôte : hostname, architecture, plateforme, UID, applications installées, processus en cours
  • Exfiltration via protocole ICAP-like sur HTTPS POST avec User-Agent IE8 spoofé

📋 Type d’article

Analyse technique détaillée et post-mortem d’une attaque supply chain npm, publiée par Microsoft Threat Intelligence, visant à documenter la chaîne d’attaque complète et fournir des indicateurs de compromission exploitables.

🧠 TTPs et IOCs détectés

TTP

  • T1195.001 — Supply Chain Compromise: Compromise Software Dependencies and Development Tools (Initial Access)
  • T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
  • T1059.001 — Command and Scripting Interpreter: PowerShell (Execution)
  • T1547.001 — Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder (Persistence)
  • T1543.001 — Create or Modify System Process: Launch Agent (Persistence)
  • T1543.002 — Create or Modify System Process: Systemd Service (Persistence)
  • T1055 — Process Injection (Defense Evasion)
  • T1620 — Reflective Code Loading (Defense Evasion)
  • T1070.004 — Indicator Removal: File Deletion (Defense Evasion)
  • T1553.004 — Subvert Trust Controls: Install Root Certificate (Defense Evasion)
  • T1041 — Exfiltration Over C2 Channel (Exfiltration)
  • T1082 — System Information Discovery (Discovery)
  • T1083 — File and Directory Discovery (Discovery)
  • T1217 — Browser Information Discovery (Discovery)
  • T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
  • T1132.001 — Data Encoding: Standard Encoding (Command and Control)
  • T1027 — Obfuscated Files or Information (Defense Evasion)
  • T1608.001 — Stage Capabilities: Upload Malware (Resource Development)
  • T1586.003 — Compromise Accounts: Cloud Accounts (Resource Development)

IOC

  • IPv4 : 23.254.164.92AbuseIPDB · VT · ThreatFox
  • IPv4 : 23.254.164.123AbuseIPDB · VT · ThreatFox
  • URLs : https://23.254.164.92:8000/update/49890878URLhaus
  • SHA256 : B122A9873BEDF145AE2A7FD024B5F309007DBB025149F4DC4AC3F7E4F32A36A4VT · MalwareBazaar
  • SHA256 : AE70DD4F6BC0D1C8C2848E4E6B51934626C4818DCB5AF99D080DDBD7DC337185VT · MalwareBazaar
  • SHA256 : 4A8860240E4231C3A74C81949BE655A28E096A7D72F38FBE84E5B37636B98417VT · MalwareBazaar
  • SHA256 : B73DE25C053C3225A077738A1FCBD9CA6966D7B3CD6F5494A30F0AA0EAE55C7EVT · MalwareBazaar
  • SHA256 : 221c45a790dec2a296af57969e1165a16f8f49733aeab64c0bbd768d9943badfVT · MalwareBazaar
  • Emails : ehindero2016@tutamail.com
  • Emails : sergey2016@tutamail.com
  • Fichiers : setup.cjs
  • Fichiers : protocal.cjs
  • Fichiers : easy-day-js-1.11.22.tgz
  • Fichiers : easy-day-js-1.11.21.tgz
  • Fichiers : mastra-1.13.1.tgz
  • Chemins : $TMPDIR/.pkg_history
  • Chemins : $TMPDIR/.pkg_logs
  • Chemins : C:\ProgramData\NodePackages\
  • Chemins : ~/Library/NodePackages/
  • Chemins : ~/.config/systemd/nvmconf/

Malware / Outils

  • easy-day-js (loader)
  • setup.cjs (loader)
  • protocal.cjs (backdoor)

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

  • ✅ microsoft.com — source reconnue (liste interne) (20pts)
  • ✅ 23564 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 20 IOCs dont des hashes (15pts)
  • ✅ 4/6 IOCs confirmés (AbuseIPDB, MalwareBazaar, ThreatFox, URLhaus, VirusTotal) (15pts)
  • ✅ 19 TTPs MITRE identifiées (15pts)
  • ✅ date extraite du HTML source (10pts)
  • ⬜ aucun acteur de menace nommé (0pts)
  • ⬜ pas de CVE à vérifier (0pts)

IOCs confirmés externellement :

  • 23.254.164.92 (ip) → VT (15/91 détections)
  • 23.254.164.123 (ip) → VT (15/91 détections)
  • B122A9873BEDF145… (sha256) → VT (13/75 détections)
  • AE70DD4F6BC0D1C8… (sha256) → VT (11/75 détections)

🔗 Source originale : https://www.microsoft.com/en-us/security/blog/2026/06/17/postinstall-payload-inside-mastra-npm-supply-chain-compromise/