TeamPCP Compromises PyPi Package durabletask
TeamPCP compromised the PyPi package durabletask (versions 1.4.1, 1.4.2, and 1.4.3), stealing credentials for AWS, Azure, GCP, K8s, and Vault, brute-forcing passwords from password managers, and exfiltrating shell history before propagating to up to 5 targets via AWS SSM and Kubernetes.
On May 19, 2026, Wiz reported that TeamPCP compromised the official Microsoft Python client for the Durable Task workflow execution framework, durabletask, specifically versions 1.4.1, 1.4.2, and 1.4.3. This supply chain attack involves a malicious payload similar to previous TeamPCP compromises. Upon execution, the payload targets a wide array of cloud credentials including those for AWS, Azure, GCP, Kubernetes, and Vault. It also attempts to brute-force passwords stored in Bitwarden, 1Password, and pass/gopass, and exfiltrates sensitive shell history files. This campaign matters because it allows attackers to gain unauthorized access to cloud infrastructure, escalate privileges, and potentially compromise entire environments. The worm can propagate to up to 5 targets per infected host.
Attack Chain
- A developer or system administrator installs a compromised version (1.4.1, 1.4.2, or 1.4.3) of the
durabletaskPyPi package. - The compromised package executes malicious code from
__init__.pyortask.py(depending on the durabletask version) which downloads a payload, eithertransformers.pyzorrope.pyz, to/tmp/managed.pyzor/tmp/rope-*.pyz. - A Python interpreter executes the downloaded payload using
python3 /tmp/managed.pyz. - The
managed.pyzpayload attempts to steal credentials for AWS, Azure, GCP, Kubernetes, and Vault, as well as passwords stored in Bitwarden, 1Password, and pass/gopass. - The payload also attempts to brute-force unlock password managers using harvested passwords from environment variables and shell history (.bash_history, .zsh_history).
- The payload exfiltrates collected credentials and shell history to the C2 server via endpoints like
/api/public/version. - The malware attempts to propagate laterally to other systems (up to 5 targets per host) via AWS SSM (using
SSM:SendCommandandSSM:DescribeInstanceInformation) and Kubernetes (usingkubectl exec). - Persistence is established by creating an infection marker file, either
~/.cache/.sys-update-check(AWS/general) or~/.cache/.sys-update-check-k8s(Kubernetes).
Impact
This supply chain attack allows TeamPCP to steal sensitive credentials for major cloud platforms (AWS, Azure, GCP), container orchestration systems (Kubernetes), and secrets management tools (Vault). The attackers also attempt to compromise password managers, and exfiltrate shell history for further reconnaissance. The malware propagates laterally to up to 5 targets per infected host, potentially leading to widespread compromise within an organization’s cloud infrastructure. Success allows the attackers to steal data, escalate privileges, and deploy ransomware.
Recommendation
- Search lockfiles and CI logs for
durabletaskversions 1.4.1, 1.4.2, or 1.4.3 to identify potential exposure. - Look for
/tmp/managed.pyzor/tmp/rope-*.pyzon Linux systems as indicators of downloaded payloads (IOC filepath). - Search for the infection marker
~/.cache/.sys-update-checkor~/.cache/.sys-update-check-k8son affected systems to confirm payload execution (IOC filepath). - Block the C2 domains
check.git-service.comandt.m-kosche.comat the DNS/proxy level (IOC domain). - Monitor process creation events for
python3 /tmp/managed.pyzto identify running malicious payloads, and deploy the Sigma rule provided below (rule:Detect Suspicious Python Payload Execution). - Monitor network connections for outbound traffic to the exfil endpoints
/v1/models,/audio.mp3, and/api/public/version(IOC url).
Detection coverage 2
Detect Suspicious Python Payload Execution
highDetects execution of the downloaded python payload from durabletask supply chain attack
Detect infection marker
highDetects creation of the infection marker file
Detection queries are available on the platform. Get full rules →
Indicators of compromise
2
domain
5
filepath
4
hash_sha256
1
ip
2
url
| Type | Value |
|---|---|
| domain | check.git-service.com |
| domain | t.m-kosche.com |
| url | https://check.git-service[.]com/rope.pyz |
| url | https://t.m-kosche[.]com/rope.pyz |
| ip | 83.142.209.194 |
| hash_sha256 | 069ac1dc7f7649b76bc72a11ac700f373804bfd81dab7e561157b703999f44ce |
| hash_sha256 | 7d80b3ef74ad7992b93c31966962612e4e2ceb93e7727cdbd1d2a9af47d44ba8 |
| hash_sha256 | aeaf583e20347bf850e2fabdcd6f4982996ba023f8c2cd56bbd299cfd56516f5 |
| hash_sha256 | 877ff2531a63393c4cb9c3c86908b62d9c4fc3db971bc231c48537faae6cb3ec |
| filepath | /tmp/managed.pyz |
| filepath | /tmp/rope-*.pyz |
| filepath | ~/.cache/.sys-update-check |
| filepath | ~/.cache/.sys-update-check-k8s |
| filepath | /tmp/.rope_state/ssm_instances.json |