SOC Prime Bias: Critique

12 Jun 2026 18:43 UTC

Attaque Massive de la Chaîne d’Approvisionnement PyPI : Extraction des Identifiants Cloud via des Hooks de Démarrage Python

Author Photo
SOC Prime Team linkedin icon Suivre
Attaque Massive de la Chaîne d’Approvisionnement PyPI : Extraction des Identifiants Cloud via des Hooks de Démarrage Python
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

Une opération coordonnée de chaîne d’approvisionnement connue sous le nom de campagne Hades a compromis 26 packages PyPI pour voler des informations d’identification cloud. L’attaque abuse des fichiers Python .pth pour déclencher du code malveillant lors du démarrage de l’interprète, utilisant le runtime JavaScript Bun pour exécuter la charge utile. Il est conçu pour collecter des secrets liés à AWS, GCP, Azure, Kubernetes et GitHub sur plusieurs systèmes d’exploitation.

Enquête

Orca Security a identifié 37 fichiers wheel malveillants répartis dans les écosystèmes de bioinformatique et de développement d’outils. Leur analyse a révélé une technique inter-runtime dans laquelle le malware télécharge Bun pour exécuter des charges utiles JavaScript obscurcies. La campagne génère également du trafic de diversion vers des services Anthropic AI et utilise des techniques d’injection de prompt pour réduire l’efficacité de l’évaluation de sécurité basée sur les LLM.

Atténuation

Les organisations doivent immédiatement retirer les packages affectés ou épingler des versions sûres et faire tourner tous les identifiants potentiellement exposés. Cela inclut les jetons d’accès cloud, les jetons d’accès personnel GitHub, les clés SSH et les identifiants de registre Docker. Les équipes de sécurité doivent également rechercher les artefacts de persistance connus sur les hôtes Linux, macOS et Windows.

Réponse

En cas de suspicion de compromission, l’isolation du système affecté doit être effectuée avant de faire tourner les informations d’identification pour réduire le risque d’extorsion via le démon gh-token-monitor . Reconstruisez tous les postes de travail des développeurs et les coureurs CI/CD ayant exécuté les packages empoisonnés. Passez en revue les dépôts GitHub pour les commits non autorisés et pour les nouveaux dépôts créés qui correspondent aux modèles de nommage des attaquants.

"graph TB %% Class Definitions Section classDef technique fill:#99ccff %% Blue pour les techniques MITRE ATT&CK classDef tool fill:#cccccc %% Gris pour les outils et logiciels classDef action fill:#ff99cc %% Rose pour les actions ou comportements spécifiques classDef persistence fill:#ccffcc %% Vert pour les mécanismes de persistance %% Node Definitions %% Initial Access and Execution Phase tech_supply_chain["<b>Technique</b> – <b>T1195.001 Compromission de la chaîne d’approvisionnement : Compromettre les dépendances logicielles et outils de développement</b><br/>Fichiers wheel malveillants distribués via PyPI."] class tech_supply_chain technique tech_user_exec["<b>Technique</b> – <b>T1204.005 Exécution utilisateur : Bibliothèque malveillante</b><br/>Déclenchée lors de l’initialisation de l’interprète Python via des fichiers *-setup.pth."] class tech_user_exec technique tech_poison_pipeline["<b>Technique</b> – <b>T1677 Exécution de la pipeline empoisonnée</b><br/>Le code s’exécute automatiquement dans les environnements de développement et CI."] class tech_poison_pipeline technique %% Payload and Execution Phase tool_bun["<b>Outil</b> – <b>Nom</b>: Bun Runtime JavaScript<br/>Téléchargé pour exécuter la charge utile obscurcie."] class tool_bun tool tech_ipc["<b>Technique</b> – <b>T1559.003 Communication inter-processus : Services XPC</b><br/>Utilisé pour exécuter la charge utile _index.js obscurcie."] class tech_ipc technique payload_js["<b>Fichier</b> – <b>Nom</b>: _index.js<br/>Charge utile JavaScript obscurcie."] class payload_js tool %% Persistence Phase tech_persistence["<b>Technique</b> – <b>Persistance</b><br/>Maintien de l’accès sur le système compromis."] class tech_persistence technique tech_launch_daemon["<b>Technique</b> – <b>T1543.004 Création ou modification d’un processus système : Démon de lancement</b><br/>Utilise des services systemd sur Linux et LaunchAgents sur macOS."] class tech_launch_daemon technique svc_monitor["<b>Processus/Service</b> – <b>Nom</b>: gh-token-monitor.service<br/>Exemple de mécanisme de persistance."] class svc_monitor persistence %% Credential Access and Exfiltration Phase tech_cred_access["<b>Technique</b> – <b>T1212 Exploitation pour l’accès aux informations d’identification</b><br/>Extraction de la mémoire des processus pour collecter les jetons AWS, GCP, Azure et GitHub."] class tech_cred_access technique tech_archive["<b>Technique</b> – <b>T1560 Archivage des données collectées</b><br/>Compression des secrets volés en utilisant gzip."] class tech_archive technique tech_exfil["<b>Technique</b> – <b>T1567.001 Exfiltration via un service Web : Exfiltration vers un dépôt de code</b><br/>Envoi de données chiffrées vers des dépôts GitHub contrôlés par l’attaquant."] class tech_exfil technique %% Connections %% Supply chain leads to user execution tech_supply_chain –>|leads_to| tech_user_exec %% User execution leads to poisoned pipeline tech_user_exec –>|triggers| tech_poison_pipeline %% Poisoned pipeline triggers the payload execution tech_poison_pipeline –>|executes| tool_bun %% Tooling uses IPC to run the JS payload tool_bun –>|utilizes| tech_ipc tech_ipc –>|runs| payload_js %% Payload leads to persistence payload_js –>|establishes| tech_persistence tech_persistence –>|implements| tech_launch_daemon tech_launch_daemon –>|creates| svc_monitor %% Persistence enables credential access svc_monitor –>|enables| tech_cred_access %% Credential access leads to archiving tech_cred_access –>|results_in| tech_archive %% Archiving leads to final exfiltration tech_archive –>|prepares_data_for| tech_exfil "

Flux d’attaque

Exécution de la simulation

Prérequis : Le contrôle préalable télémetrie et baseline doit être réussi.

Rationale : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et visent à générer la télémétrie exacte attendue par la logique de détection. Les exemples abstraits ou non liés mèneront à un mauvais diagnostic.

  • Narration d’attaque et commandes : L’adversaire a compromis avec succès le poste de travail d’un développeur via un package PyPI malveillant (campagne Hades). Un hook de démarrage Python a été exécuté, extrayant avec succès un jeton d’authentification Azure de la mémoire/cache local. Pour simuler la détection de cette activité dans les journaux d’audit Azure, nous simulerons la génération d’une entrée de journal d’audit contenant la chaîne spécifique « jetons d’authentification Azure » dans le champ de description, imitant la télémétrie de l’événement qu’un système automatisé pourrait signaler lors de la détection de cette exfiltration.

  • Script de test de régression : Puisque nous ne pouvons pas facilement forcer le backend Azure réel à générer une chaîne de description malveillante spécifique sans une véritable brèche, nous simulons la présence du journal dans le flux de télémétrie (souvent réalisé dans BAS en injectant un journal synthétique dans l’espace de travail).

    # Injection de journal synthétique pour simuler la détection d'exfiltration de jetons
    # Cela simule le champ 'Description' étant peuplé avec la chaîne cible.
    $LogEntry = @{
        TimeGenerated = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ssZ")
        OperationName = "TokenExfiltrationDetected"
        Result = "Success"
        Description = "Activité de malware détectée : des jetons d'authentification Azure ont été exfiltrés d'un processus local."
        Identity = "malicious-python-hook@attacker.com"
    }
    
    Write-Host "Injection de télémétrie synthétique pour valider la règle de détection ..."
    # Dans un BAS réel, cela appellerait l'API Data Collector de Log Analytics
    # À des fins de simulation, nous représentons l'entrée de journal résultante :
    $LogEntry | ConvertTo-Json
  • Commandes de nettoyage :

    # Si des journaux synthétiques ont été injectés via API, supprimez l'ID de corrélation spécifique
    # Pour cette simulation, aucun changement persistant n'a été fait au locataire Azure.
    Write-Host "Nettoyage terminé. Aucun artefact persistant d'adversaire ne reste."