🗓️ Contexte
Le 8 juin 2026, StepSecurity publie une analyse technique détaillée de la campagne Hades, une opération de compromission de la chaîne d’approvisionnement Python ciblant l’écosystème PyPI. Cette campagne est attribuée à l’acteur Miasma, déjà documenté dans des attaques npm précédentes.
📦 Packages compromis
Au total, 27 packages PyPI sont identifiés comme compromis, couvrant les domaines de la bioinformatique, du machine learning graphique et de l’analyse génotype-phénotype. Parmi les plus notables :
- ensmallen 0.8.101 (package ML graphique populaire)
- pyphetools 0.9.120, gpsea 0.9.14, dynamo-release 1.5.4
- rlask 3.1.4–3.1.7, magique 0.6.8–0.6.9, pantheon-agents 0.6.1–0.6.2
⚙️ Chaîne d’exécution
Étape 1 – Hook d’import Python : Un hook obfusqué dans __init__.py télécharge le runtime Bun v1.3.14 depuis GitHub et exécute _index.js. Un fichier verrou /tmp/.bun_ran empêche les exécutions multiples.
Étape 2 – Injection de prompt LLM : Le fichier _index.js contient un bloc de texte conçu pour tromper les pipelines d’analyse automatisés basés sur des LLM, leur faisant classifier le package comme sain.
Étape 3 – Déchiffrement modulaire : 16 blobs indépendants chiffrés en AES-256-GCM et compressés en gzip sont déchiffrés à l’exécution selon l’OS cible.
Étape 4 – Scrapers mémoire cross-platform :
- Linux : lecture de
/proc/{pid}/mem - macOS : utilisation des APIs Mach kernel (
task_for_pid,mach_vm_read_overwrite) via ctypes - Windows : script PowerShell compilant du C# avec
VirtualQueryExetReadProcessMemory
Étape 5 – Canaux C2 via GitHub :
DontRevokeOrItGoesBoom: dépôt de tokens GitHub Personal Access volésTheBeautifulSnadsOfTime: payloads JavaScript signés RSA-PSS exécutés viaeval()firedalazer: daemon Pythonupdater.pyinterrogeant GitHub toutes les heures
Étape 6 – Exfiltration : Secrets chiffrés hybride (AES-256-GCM + RSA-2048) poussés vers des dépôts GitHub publics nommés selon le pattern stygian-cerberus-[N] ou tartarean-charon-[N] avec la description “Hades - The End for the Damned”.
Étape 7 – Propagation worm :
- SSH/SCP : lecture de
~/.ssh/known_hostset~/.ssh/configpour se propager - OIDC/SLSA bypass : exploitation des tokens OIDC GitHub Actions pour publier des packages compromis avec une provenance Sigstore valide sur PyPI et npm
- Injection de workflows GitHub Actions : deux méthodes (push-triggered et deployment-triggered) pour extraire les secrets organisationnels via un workflow nommé Run Copilot
- Backdoor IDE/AI : modification de fichiers de configuration pour 14 assistants IA (Claude, Codex, Gemini, Copilot, Cline, Aider, etc.)
Étape 8 – Persistance et wiper : Installation d’un service update-monitor (C2) et d’un service gh-token-monitor qui déclenche rm -rf ~/ si le token volé est révoqué, dissuadant les équipes de sécurité d’agir rapidement.
🎯 Secteurs ciblés
Développeurs Python, équipes CI/CD, organisations utilisant GitHub Actions, écosystème bioinformatique et machine learning.
📋 Type d’article
Analyse technique approfondie publiée par StepSecurity, visant à documenter la chaîne d’attaque complète, fournir les IOCs et alerter les équipes de sécurité sur une campagne active de supply chain.
🧠 TTPs et IOCs détectés
Acteurs de menace
- Miasma (unknown) —
TTP
- T1195.001 — Supply Chain Compromise: Compromise Software Dependencies and Development Tools (Initial Access)
- T1059.006 — Command and Scripting Interpreter: Python (Execution)
- T1059.001 — Command and Scripting Interpreter: PowerShell (Execution)
- T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
- T1027 — Obfuscated Files or Information (Defense Evasion)
- T1055 — Process Injection (Defense Evasion)
- T1003 — OS Credential Dumping (Credential Access)
- T1552.001 — Unsecured Credentials: Credentials In Files (Credential Access)
- T1041 — Exfiltration Over C2 Channel (Exfiltration)
- T1567.001 — Exfiltration Over Web Service: Exfiltration to Code Repository (Exfiltration)
- T1021.004 — Remote Services: SSH (Lateral Movement)
- T1543.001 — Create or Modify System Process: Launch Agent (Persistence)
- T1543.002 — Create or Modify System Process: Systemd Service (Persistence)
- T1485 — Data Destruction (Impact)
- T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
- T1102.002 — Web Service: Bidirectional Communication (Command and Control)
- T1553 — Subvert Trust Controls (Defense Evasion)
- T1601 — Modify System Image (Defense Evasion)
IOC
- Domaines :
fulcio.sigstore.dev— VT · URLhaus · ThreatFox - Domaines :
rekor.sigstore.dev— VT · URLhaus · ThreatFox - URLs :
https://github.com/oven-sh/bun/releases/download/bun-v1.3.14/bun-linux-x64.zip— URLhaus - URLs :
https://github.com/oven-sh/bun/releases/download/bun-v1.3.14/bun-darwin-x64.zip— URLhaus - URLs :
https://github.com/oven-sh/bun/releases/download/bun-v1.3.14/bun-windows-x64.zip— URLhaus - URLs :
https://api.github.com/search/commits?q=firedalazer— URLhaus - URLs :
https://api.github.com/user— URLhaus - Fichiers :
_index.js - Fichiers :
updater.py - Fichiers :
gh-token-monitor.sh - Fichiers :
ai_setup.sh - Fichiers :
ai_init.js - Fichiers :
codeql.yml - Fichiers :
format-results.txt - Chemins :
/tmp/.bun_ran - Chemins :
/tmp/tmp.0144018410.lock - Chemins :
/var/tmp/.gh_update_state - Chemins :
~/.local/share/updater/update.py - Chemins :
~/.config/systemd/user/update-monitor.service - Chemins :
~/.config/systemd/user/gh-token-monitor.service - Chemins :
~/Library/LaunchAgents/com.user.update-monitor.plist - Chemins :
~/Library/LaunchAgents/com.user.gh-token-monitor.plist - Chemins :
~/.local/bin/gh-token-monitor.sh - Chemins :
~/.config/gh-token-monitor/token - Chemins :
.claude/settings.json - Chemins :
.claude/index.js - Chemins :
.claude/setup.mjs - Chemins :
.vscode/tasks.json - Chemins :
.vscode/setup.mjs - Chemins :
.github/workflows/codeql.yml - Chemins :
/tmp/b/bun
Malware / Outils
- Hades Campaign payload (other)
- Bun runtime loader (loader)
- updater.py (C2 daemon) (backdoor)
- gh-token-monitor (wiper) (other)
- macOS Mach VM Scraper (tool)
- Windows MemDump (PowerShell/C#) (tool)
🟢 Indice de vérification factuelle : 67/100 (haute)
- ⬜ stepsecurity.io — source non référencée (0pts)
- ✅ 28893 chars — texte complet (fulltext extrait) (15pts)
- ✅ 31 IOCs (IPs/domaines/CVEs) (10pts)
- ✅ 2/5 IOCs confirmés (ThreatFox, URLhaus, VirusTotal) (12pts)
- ✅ 18 TTPs MITRE identifiées (15pts)
- ✅ date extraite du HTML source (10pts)
- ✅ acteur(s) identifié(s) : Miasma (5pts)
- ⬜ 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/the-hades-campaign-pypi-packages