đ 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
- Ă 03:18 UTC : push d’un commit orphelin (
558b09d7) surnrwl/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. - Le commit remplace l’intĂ©gralitĂ© du monorepo par un
package.jsonminimaliste et unindex.jsde 498 KB obfusquĂ©, utilisant le runtime Bun comme environnement d’exĂ©cution. - Ă 12:36 UTC : publication de
nrwl.angular-console v18.95.0sur le VS Code Marketplace avec 2 777 octets de code malveillant injectĂ©s dansmain.js. - Ă 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/*/memsur Linux pour extraire des secrets masquĂ©s - Tentative d’escalade de privilĂšges via
sudo -n trueet 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