đŸ—“ïž Contexte

Le 11 mai 2026, Wiz publie une analyse technique dĂ©taillant une attaque coordonnĂ©e de supply chain menĂ©e par le groupe TeamPCP contre les Ă©cosystĂšmes npm et PyPI. Cette campagne, dĂ©signĂ©e Mini Shai-Hulud, reprĂ©sente une Ă©volution des opĂ©rations prĂ©cĂ©dentes du mĂȘme acteur (SAP, Checkmarx, Bitwarden, Lightning, Intercom, Trivy).

🎯 Packages compromis

Les namespaces et packages impactés incluent :

  • @tanstack : dont @tanstack/react-router (~12 millions de tĂ©lĂ©chargements hebdomadaires)
  • @uipath : outils d’automatisation enterprise (apollo-core, CLI, agent SDKs)
  • @mistralai/mistralai : client TypeScript officiel de Mistral AI
  • guardrails-ai (PyPI) : package Python de guardrails LLM
  • mistralai (PyPI)
  • Plusieurs dizaines d’autres packages npm (voir liste complĂšte)

🔓 Vecteur d’infection TanStack (chaĂźne de 3 vulnĂ©rabilitĂ©s GitHub Actions)

  1. L’attaquant crĂ©e un fork renommĂ© du dĂ©pĂŽt TanStack/router (zblgg/configuration) pour Ă©chapper aux recherches de forks
  2. Ouverture d’une pull request dĂ©clenchant un workflow pull_request_target qui exĂ©cute le code du fork et empoisonne le cache GitHub Actions (pnpm store)
  3. Lors de la fusion de PRs lĂ©gitimes, le workflow de release restaure le cache empoisonnĂ© ; des binaires contrĂŽlĂ©s par l’attaquant extraient des tokens OIDC directement depuis la mĂ©moire du runner (/proc/<pid>/mem)
  4. Publication de versions malveillantes sans vol de credentials npm

🐛 Vecteurs d’infection dans les packages

  • @tanstack : entrĂ©e optionalDependencies pointant vers un commit orphelin + fichier obfusquĂ© router_init.js (~2,3 Mo) dans le tarball
  • @uipath : script preinstall (node setup.mjs) tĂ©lĂ©chargeant le runtime Bun pour exĂ©cuter le payload — mĂȘme mĂ©canisme que le compromis SAP prĂ©cĂ©dent
  • PyPI : 13 lignes de code tĂ©lĂ©chargeant et exĂ©cutant git-tanstack[.]com/tmp/transformers.pyz

💀 Comportement du payload

Le payload est un credential stealer auto-propagant (worm) ciblant :

  • Tokens CI/CD : GitHub Actions OIDC, GitLab, CircleCI
  • Credentials cloud : AWS IMDSv2, GCP, Azure
  • Kubernetes service accounts, HashiCorp Vault
  • Tokens de registres de packages

Il se propage en utilisant les tokens npm et GitHub OIDC volĂ©s pour publier des versions empoisonnĂ©es des packages sur lesquels la victime a des droits d’Ă©criture.

📡 Architecture C2 triple

  1. Domaine typosquat : git-tanstack[.]com
  2. Réseau Session (décentralisé, résistant aux takedowns) : *.getsession.org, recipient ID 05f9e609d79eed391015e11380dee4b5c9ead0b6e2e7f0134e6e51767a87323026
  3. GitHub API dead drops : dĂ©pĂŽts thĂ©matiques Dune créés avec des tokens volĂ©s (description : “Shai-Hulud: Here We Go Again”)

đŸ”„ Daemon de persistance et wiper

Sur les machines développeurs, si un token GitHub valide (ghp_ ou gho_) est détecté avec les droits suffisants, le malware installe un daemon gh-token-monitor :

  • macOS : LaunchAgent ~/Library/LaunchAgents/com.user.gh-token-monitor.plist
  • Linux : service systemd ~/.config/systemd/user/gh-token-monitor.service
  • Polling GitHub toutes les 60 secondes ; en cas de rĂ©vocation du token : exĂ©cution de rm -rf ~/ (wiper du home directory)
  • Le daemon s’arrĂȘte automatiquement aprĂšs 24 heures

🐍 Variante Python

La variante PyPI (guardrails-ai@0.10.1, mistralai@2.4.6) est non obfusquée et modulaire. Elle :

  • S’exĂ©cute uniquement sur Linux avec ≄4 CPUs
  • Cible les coffres de mots de passe (1Password, Bitwarden) — nouveautĂ©
  • Exfiltre vers 83.142.209[.]194 (fallback GitHub, description repo : “PUSH UR T3MPRR”)
  • Sur systĂšmes configurĂ©s en IsraĂ«l ou Iran (timezone/langue) : probabilitĂ© 1/6 de jouer un MP3 Ă  plein volume et d’exĂ©cuter rm -rf

đŸ›Ąïž Évasion

Comme les variantes précédentes, le malware vérifie la langue russe du systÚme et se termine sans exfiltrer si celle-ci est détectée.

đŸ·ïž Attribution

Wiz attribue avec haute confiance cette campagne au groupe TeamPCP, responsable des compromissions précédentes de SAP, Checkmarx, Bitwarden, Lightning, Intercom et Trivy.


📄 Article de type analyse technique publiĂ©e par Wiz, visant Ă  documenter la campagne Mini Shai-Hulud, fournir les IoCs et les packages affectĂ©s pour permettre la dĂ©tection et la rĂ©ponse Ă  incident.

🧠 TTPs et IOCs dĂ©tectĂ©s

Acteurs de menace

TTP

  • T1195.001 — Supply Chain Compromise: Compromise Software Dependencies and Development Tools (Initial Access)
  • T1554 — Compromise Client Software Binary (Persistence)
  • T1053.006 — Scheduled Task/Job: Systemd Timers (Persistence)
  • T1543.001 — Create or Modify System Process: Launch Agent (Persistence)
  • T1552.001 — Unsecured Credentials: Credentials In Files (Credential Access)
  • T1552.007 — Unsecured Credentials: Container API (Credential Access)
  • T1528 — Steal Application Access Token (Credential Access)
  • T1003 — OS Credential Dumping (Credential Access)
  • T1041 — Exfiltration Over C2 Channel (Exfiltration)
  • T1567 — Exfiltration Over Web Service (Exfiltration)
  • T1485 — Data Destruction (Impact)
  • T1027 — Obfuscated Files or Information (Defense Evasion)
  • T1497.001 — Virtualization/Sandbox Evasion: System Checks (Defense Evasion)
  • T1059.006 — Command and Scripting Interpreter: Python (Execution)
  • T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
  • T1584.001 — Compromise Infrastructure: Domains (Resource Development)
  • T1102 — Web Service (Command and Control)

IOC

  • IPv4 : 83.142.209.194 — AbuseIPDB · VT · ThreatFox
  • Domaines : git-tanstack.com — VT · URLhaus · ThreatFox
  • Domaines : seed1.getsession.org — VT · URLhaus · ThreatFox
  • Domaines : seed2.getsession.org — VT · URLhaus · ThreatFox
  • Domaines : seed3.getsession.org — VT · URLhaus · ThreatFox
  • Domaines : filev2.getsession.org — VT · URLhaus · ThreatFox
  • URLs : https://git-tanstack.com/tmp/transformers.pyz — URLhaus
  • SHA256 : ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c — VT · MalwareBazaar
  • SHA256 : 2ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96 — VT · MalwareBazaar
  • SHA256 : 2258284d65f63829bd67eaba01ef6f1ada2f593f9bbe41678b2df360bd90d3df — VT · MalwareBazaar
  • Fichiers : router_init.js
  • Fichiers : setup.mjs
  • Fichiers : transformers.pyz
  • Fichiers : gh-token-monitor.plist
  • Fichiers : gh-token-monitor.service
  • Chemins : ~/Library/LaunchAgents/com.user.gh-token-monitor.plist
  • Chemins : ~/.config/systemd/user/gh-token-monitor.service
  • Chemins : /proc/<pid>/mem

Malware / Outils

  • Mini Shai-Hulud (stealer)
  • router_init.js (loader)
  • setup.mjs (loader)
  • transformers.pyz (stealer)
  • gh-token-monitor (other)

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

  • ✅ wiz.io — source reconnue (liste interne) (20pts)
  • ✅ 15064 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 18 IOCs dont des hashes (15pts)
  • ✅ 2/8 IOCs confirmĂ©s (AbuseIPDB, MalwareBazaar, ThreatFox, URLhaus, VirusTotal) (12pts)
  • ✅ 17 TTPs MITRE identifiĂ©es (15pts)
  • ✅ date extraite du HTML source (10pts)
  • ✅ acteur(s) identifiĂ©(s) : TeamPCP (5pts)
  • ⬜ pas de CVE Ă  vĂ©rifier (0pts)

IOCs confirmés externellement :

  • 83.142.209.194 (ip) → VT (8/92 dĂ©tections)
  • git-tanstack.com (domain) → VT (4/92 dĂ©tections)

🔗 Source originale : https://www.wiz.io/blog/mini-shai-hulud-strikes-again-tanstack-more-npm-packages-compromised