Massiccio attacco alla catena di approvvigionamento PyPI raccoglie credenziali cloud tramite hook di avvio Python
Detection stack
- AIDR
- Alert
- ETL
- Query
Riepilogo
Un’operazione coordinata nella supply chain nota come Campagna Hades ha compromesso 26 pacchetti PyPI per rubare credenziali cloud. L’attacco sfrutta file .pth per attivare codice malevolo durante l’avvio dell’interprete, utilizzando il runtime JavaScript Bun per eseguire il payload. È progettato per raccogliere segreti legati a AWS, GCP, Azure, Kubernetes, e GitHub su diversi sistemi operativi.
Indagine
Orca Security ha identificato 37 file wheel malevoli diffusi tra gli ecosistemi di bioinformatica e strumenti per sviluppatori. La loro analisi ha rivelato una tecnica cross-runtime in cui il malware scarica Bun per eseguire payload JavaScript offuscati. La campagna genera anche traffico diversivo verso i servizi di Anthropic AI e utilizza tecniche di prompt injection per ridurre l’efficacia delle revisioni di sicurezza basate su LLM.
Mitigazione
Le organizzazioni dovrebbero immediatamente rimuovere i pacchetti affetti o fissare versioni sicure e ruotare tutte le credenziali potenzialmente esposte. Questo include token di accesso al cloud, token di accesso personale di GitHub, chiavi SSH e credenziali del registro Docker. I team di sicurezza dovrebbero anche cercare i noti artefatti di persistenza su host Linux, macOS e Windows.
Risposta
Quando si sospetta una compromissione, isolare il sistema affetto prima di ruotare le credenziali per ridurre il rischio di estorsione tramite il daemon gh-token-monitor . Ricostruire qualsiasi workstation per sviluppatori e runner CI/CD che hanno eseguito i pacchetti avvelenati. Revisare i repository GitHub per commit non autorizzati e per nuovi repository creati che corrispondono ai modelli di denominazione degli attaccanti.
"graph TB %% Class Definitions Section classDef technique fill:#99ccff %% Blue for MITRE ATT&CK Techniques classDef tool fill:#cccccc %% Grey for Tools and Software classDef action fill:#ff99cc %% Pink for specific Actions or behaviors classDef persistence fill:#ccffcc %% Green for Persistence mechanisms %% Node Definitions %% Initial Access and Execution Phase tech_supply_chain["<b>Technique</b> – <b>T1195.001 Supply Chain Compromise: Compromise Software Dependencies and Development Tools</b><br/>Malicious wheel files distributed via PyPI."] class tech_supply_chain technique tech_user_exec["<b>Technique</b> – <b>T1204.005 User Execution: Malicious Library</b><br/>Triggered during Python interpreter initialization via *-setup.pth files."] class tech_user_exec technique tech_poison_pipeline["<b>Technique</b> – <b>T1677 Poisoned Pipeline Execution</b><br/>Code executes automatically in developer and CI environments."] class tech_poison_pipeline technique %% Payload and Execution Phase tool_bun["<b>Tool</b> – <b>Name</b>: Bun JavaScript Runtime<br/>Downloaded to execute obfuscated payload."] class tool_bun tool tech_ipc["<b>Technique</b> – <b>T1559.003 Inter-Process Communication: XPC Services</b><br/>Used to run the obfuscated _index.js payload."] class tech_ipc technique payload_js["<b>File</b> – <b>Name</b>: _index.js<br/>Obfuscated JavaScript payload."] class payload_js tool %% Persistence Phase tech_persistence["<b>Technique</b> – <b>Persistence</b><br/>Maintaining access on the compromised system."] class tech_persistence technique tech_launch_daemon["<b>Technique</b> – <b>T1543.004 Create or Modify System Process: Launch Daemon</b><br/>Uses systemd services on Linux and LaunchAgents on macOS."] class tech_launch_daemon technique svc_monitor["<b>Process/Service</b> – <b>Name</b>: gh-token-monitor.service<br/>Example persistence mechanism."] class svc_monitor persistence %% Credential Access and Exfiltration Phase tech_cred_access["<b>Technique</b> – <b>T1212 Exploitation for Credential Access</b><br/>Scraping process memory to harvest AWS, GCP, Azure, and GitHub tokens."] class tech_cred_access technique tech_archive["<b>Technique</b> – <b>T1560 Archive Collected Data</b><br/>Compressing stolen secrets using gzip."] class tech_archive technique tech_exfil["<b>Technique</b> – <b>T1567.001 Exfiltration Over Web Service: Exfiltration to Code Repository</b><br/>Sending encrypted data to attacker-controlled GitHub repositories."] 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 "
Flow dell’attacco
Rilevamenti
Creazione sospetta di file Plist in LaunchAgents o LaunchDaemons (via file_event)
Visualizza
Processi grafici NodeJS sospetti [Linux] (via cmdline)
Visualizza
Creazione di file di servizio nella cartella Systemd (via file_event)
Visualizza
Possibile creazione di un file di hook di configurazione sito-specifico (via file_event)
Visualizza
Script Linux creato in cartelle temporanee (via file_event)
Visualizza
IOCs pacchetti Python malevoli (via cmdline)
Visualizza
Rilevamento del scraping dei token di autenticazione di GCP da parte della Campagna Hades [Google Cloud Platform]
Visualizza
Campagna Hades – Esfiltrazione dei token di autenticazione di Azure [Azure Activity Logs]
Visualizza
Raccolta di credenziali cloud AWS tramite attacco alla supply chain PyPI [AWS Cloudtrail]
Visualizza
Esecuzione simulazione
Prerequisito: Il Telemetry & Baseline Pre-flight Check deve essere passato.
Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e il racconto DEVONO riflettere direttamente i TTP identificati e mirare a generare la telemetria esatta prevista dalla logica di rilevamento. Esempi astratti o non correlati porteranno a diagnosi errate.
-
Narrativa e Comandi dell’Attacco: L’avversario ha compromesso con successo la workstation di uno sviluppatore tramite un pacchetto PyPI malevolo (Campagna Hades). Un hook di avvio di Python è stato eseguito, effettuando con successo lo scraping di un token di autenticazione Azure dalla memoria/cache locale. Per simulare il rilevamento di questa attività nei Log di Audit di Azure, simuleremo la generazione di una voce di Log di Audit che contiene la stringa specifica “token di autenticazione Azure” nel campo descrittivo, imitando la telemetria dell’evento che un sistema automatico potrebbe riportare quando rileva tale esfiltrazione.
-
Script Test di Regressione: Poiché non possiamo facilmente forzare il backend di Azure reale a generare una stringa descrittiva malevola specifica senza una violazione reale, simuleremo la presenza del log nel flusso di telemetria (spesso fatto in BAS iniettando un log sintetico nello spazio di lavoro).
# Synthetic Log Injection to simulate the detection of token exfiltration # This simulates the 'Description' field being populated with the target string. $LogEntry = @{ TimeGenerated = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ssZ") OperationName = "TokenExfiltrationDetected" Result = "Success" Description = "Malware activity detected: Azure authentication tokens were exfiltrated from a local process." Identity = "malicious-python-hook@attacker.com" } Write-Host "Injecting synthetic telemetry to validate detection rule..." # In a real BAS, this would call the Log Analytics Data Collector API # For simulation purposes, we represent the resulting log entry: $LogEntry | ConvertTo-Json -
# Iniezione di Log Sintetici per simulare il rilevamento dell’esfiltrazione di token # Questo simula il campo ‘Descrizione’ che viene popolato con la stringa target. $LogEntry = @{ TimeGenerated = (Get-Date).ToString(“yyyy-MM-ddTHH:mm:ssZ”) OperationName = “TokenExfiltrationDetected” Result = “Success” Description = “Attività malevola rilevata: token di autenticazione Azure erano esfiltrati da un processo locale.” Identity = “malicious-python-hook@attacker.com” } Write-Host “Iniettando telemetria sintetica per convalidare la regola di rilevamento…” # In un vero BAS, si chiamerebbe l’API del Log Analytics Data Collector # Per scopi di simulazione, rappresentiamo la voce di log risultante: $LogEntry | ConvertTo-Json
# Se i log sintetici sono stati iniettati tramite API, cancellare l'ID di correlazione specifico # Per questa simulazione, non sono state effettuate modifiche persistenti al Tenant di Azure. Write-Host "Pulizia completa. Nessun artefatto di avversario persistente rimane."