🔍 Contexte

Source : StepSecurity (blog officiel), publiĂ© le 18 mai 2026. L’article constitue une analyse technique dĂ©taillĂ©e d’un incident de supply chain ayant ciblĂ© l’extension nrwl.angular-console (Nx Console) pour Visual Studio Code, comptant plus de 2,2 millions d’installations.

🎯 Vecteur d’accĂšs initial

L’attaquant a obtenu un token GitHub personnel (PAT) d’un contributeur Nx lors d’un incident de supply chain antĂ©rieur non identifiĂ© publiquement. Ce token disposait d’un accĂšs en Ă©criture au dĂ©pĂŽt nrwl/nx et, directement ou indirectement, aux credentials de publication VS Code Marketplace (VSCE_PAT).

⛓ ChaĂźne d’attaque

  1. À 03:18 UTC : push d’un commit orphelin (558b09d7) sur nrwl/nx, sans parent, inatteignable depuis les branches normales. Le commit est faussement attribuĂ© Ă  un ancien contributeur (Zachary DeRose) et non signĂ© GPG. Le message de commit contient une menace sociale fictive pour retarder le nettoyage.
  2. Le commit remplace l’intĂ©gralitĂ© du monorepo par un package.json minimaliste et un index.js de 498 KB obfusquĂ©, utilisant le runtime Bun comme environnement d’exĂ©cution.
  3. À 12:36 UTC : publication de nrwl.angular-console v18.95.0 sur le VS Code Marketplace avec 2 777 octets de code malveillant injectĂ©s dans main.js.
  4. À 12:47 UTC : dĂ©tection et retrait par l’Ă©quipe Nx (fenĂȘtre d’exposition : ~11 minutes).

💣 Payload malveillant

Le payload index.js est un stealer multi-Ă©tapes et outil d’empoisonnement de supply chain :

  • Collecteurs parallĂšles ciblant : GitHub (tokens ghp_, gho_, ghs_), npm (OIDC tokens), AWS (IMDS, ECS, Secrets Manager, SSM), HashiCorp Vault, Kubernetes, 1Password, fichiers de configuration Claude Code (~/.claude/settings.json)
  • Lecture mĂ©moire processus via /proc/*/mem sur Linux pour extraire des secrets masquĂ©s
  • Tentative d’escalade de privilĂšges via sudo -n true et injection de rĂšgle sudoers
  • Trois canaux d’exfiltration indĂ©pendants : HTTPS POST (C2 chiffrĂ© port 443), GitHub API (commits/artifacts sur dĂ©pĂŽts victimes), DNS tunneling
  • IntĂ©gration Sigstore complĂšte : vol de tokens OIDC npm, obtention de certificats Fulcio, gĂ©nĂ©ration d’attestations SLSA — permettant de publier des packages npm avec une provenance cryptographiquement valide
  • Backdoor Python persistant (~/.local/share/kitty/cat.py) avec LaunchAgent macOS (com.user.kitty-monitor.plist), utilisant le GitHub Search API comme dead-drop C2, commandes signĂ©es RSA-4096

đŸ›Ąïž Techniques d’obfuscation

  • Tableau de 1 729 chaĂźnes avec alphabet Base64 personnalisĂ©
  • DĂ©rivation de clĂ©s PBKDF2 (200 000 itĂ©rations SHA-512)
  • Noms de variables hexadĂ©cimaux (_0x28c040)
  • 14 blobs binaires chiffrĂ©s embarquĂ©s
  • Portes de sortie anti-sandbox : vĂ©rification CPU < 4 cƓurs, exclusion de zones gĂ©ographiques (CIS/Russie), exclusion de l’infrastructure de l’attaquant

📅 Contexte historique

Il s’agit du deuxiĂšme incident supply chain contre l’Ă©cosystĂšme Nx en moins d’un an (le premier en aoĂ»t 2025 ciblait des packages npm directement).

📄 Nature de l’article

Analyse technique approfondie publiĂ©e par StepSecurity, visant Ă  documenter exhaustivement l’incident, fournir les IoCs et guider les Ă©quipes de rĂ©ponse Ă  incident.

🧠 TTPs et IOCs dĂ©tectĂ©s

TTP

  • T1195.001 — Supply Chain Compromise: Compromise Software Dependencies and Development Tools (Initial Access)
  • T1078.001 — Valid Accounts: Default Accounts (Defense Evasion)
  • T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
  • T1059.006 — Command and Scripting Interpreter: Python (Execution)
  • T1543.001 — Create or Modify System Process: Launch Agent (Persistence)
  • T1552.001 — Unsecured Credentials: Credentials In Files (Credential Access)
  • T1552.004 — Unsecured Credentials: Private Keys (Credential Access)
  • T1003 — OS Credential Dumping (Credential Access)
  • T1041 — Exfiltration Over C2 Channel (Exfiltration)
  • T1071.004 — Application Layer Protocol: DNS (Command and Control)
  • T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
  • T1102.003 — Web Service: One-Way Communication (Command and Control)
  • T1027 — Obfuscated Files or Information (Defense Evasion)
  • T1497.001 — Virtualization/Sandbox Evasion: System Checks (Defense Evasion)
  • T1548.003 — Abuse Elevation Control Mechanism: Sudo and Sudo Caching (Privilege Escalation)
  • T1555 — Credentials from Password Stores (Credential Access)
  • T1552.007 — Unsecured Credentials: Container API (Credential Access)
  • T1036.005 — Masquerading: Match Legitimate Name or Location (Defense Evasion)

IOC

  • IPv4 : 169.254.169.254 — AbuseIPDB · VT · ThreatFox
  • IPv4 : 169.254.170.2 — AbuseIPDB · VT · ThreatFox
  • IPv4 : 127.0.0.1 — AbuseIPDB · VT · ThreatFox
  • Domaines : fulcio.sigstore.dev — VT · URLhaus · ThreatFox
  • Domaines : rekor.sigstore.dev — VT · URLhaus · ThreatFox
  • URLs : https://api.github.com/search/commits?q=firedalazer&sort=committer-date&order=desc&per_page=1 — URLhaus
  • SHA256 : 1a4afce34918bdc74ae3f31edaffffaa0ee074d83618f53edfd88137927340b8 — VT · MalwareBazaar
  • SHA256 : b0cefb66b953e5184b6adb3035e9e267335ac5eabfe1848e07834777b9397b74 — VT · MalwareBazaar
  • SHA256 : e7347d90653efc565f03733a95e9209d78f9cfa81e31ff2b2dd9d48d75a4b8b1 — VT · MalwareBazaar
  • SHA256 : 43f2b001846c4966073ebffa5be8f15e491a1e7d32bbd805d57406ff540e0dd9 — VT · MalwareBazaar
  • SHA1 : 558b09d7ad0d1660e2a0fb8a06da81a6f42e06d2 — VT · MalwareBazaar
  • SHA1 : ba642fe2c7c65e42dd7f6444b83023dc6827e08c — VT · MalwareBazaar
  • SHA1 : acfc3f957a63b4cde93ff645f2b6bf26a8ed1bbf — VT · MalwareBazaar
  • SHA1 : 9d88f040c44b5f4d5f9db15ff89310776c168e99 — VT · MalwareBazaar
  • Fichiers : cat.py
  • Fichiers : com.user.kitty-monitor.plist
  • Fichiers : index.js
  • Fichiers : main.js
  • Chemins : ~/.local/share/kitty/cat.py
  • Chemins : ~/Library/LaunchAgents/com.user.kitty-monitor.plist
  • Chemins : /tmp/kitty-*
  • Chemins : /var/tmp/.gh_update_state
  • Chemins : ~/.vault-token
  • Chemins : /etc/vault/token
  • Chemins : /run/secrets/VAULT_TOKEN

Malware / Outils

  • Nx Console malicious payload (index.js) (stealer)
  • cat.py Python backdoor (backdoor)
  • nx-next dropper (loader)

🟱 Indice de vĂ©rification factuelle : 67/100 (haute)

  • ⬜ stepsecurity.io — source non rĂ©fĂ©rencĂ©e (0pts)
  • ✅ 31435 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 25 IOCs dont des hashes (15pts)
  • ✅ 2/9 IOCs confirmĂ©s (AbuseIPDB, MalwareBazaar, ThreatFox, URLhaus, VirusTotal) (12pts)
  • ✅ 18 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 :

  • fulcio.sigstore.dev (domain) → VT (15/92 dĂ©tections)
  • rekor.sigstore.dev (domain) → VT (16/92 dĂ©tections)

🔗 Source originale : https://www.stepsecurity.io/blog/nx-console-vs-code-extension-compromised