Tracking TeamPCP: Investigating Post-Compromise Attacks Seen in the Wild

How TeamPCP are leveraging stolen secrets from the recent supply chain attacks to compromise cloud environments

Following the recent supply chain attacks targeting the Trivy, KICKS, and LiteLLM projects, the Wiz Customer Incident Response Team (CIRT) and Wiz Research have proactively hunted, notified, and responded to multiple attacks being carried out by the TeamPCP threat actor group.

The TeamPCP Campaign

Wiz Research has tracked the campaign of supply chain operations against popular open source tools carried out by the group calling themselves "TeamPCP" over the past two weeks:

  • March 19 - Trivy: Credential-stealing malware injected into Aqua Security's vulnerability scanner through the binary, GitHub Actions and container images.

  • March 23 - KICS: Same malware injected into Checkmarx's IaC scanner, through the GitHub Action and OpenVSX extensions.

  • March 24 - LiteLLM: Malicious PyPI packages targeting the popular LLM proxy library.

  • March 27 - Telnyx: Malicious versions of the Telnyx Python package were published to PyPI.

All four attacks deployed malware that harvests cloud credentials, SSH keys, Kubernetes configuration files, and CI/CD secrets, encrypting and exfiltrating them to attacker-controlled domains. This blog post details how Wiz has seen these credentials used after they were stolen.

Wiz CIRT saw indications in Cloud, Code, and Runtime evidence that the credentials and secrets stolen in the supply chain compromises were quickly validated and used to explore victim environments and exfiltrate additional data. While the speed at which they were used suggests that it was the work of the same threat actors responsible for the supply chain operations, we are not able to rule out the secrets being shared with other groups and used by them. 

Observed TTPs

Secret Validation

Wiz CIRT identified activity leveraging secrets stolen via the Trivy supply chain compromise as early as March 19, just hours after initial malware was deployed. As is often seen in mass credential harvesting operations, the first steps were  validating the stolen secrets using the open-source tool TruffleHog. TruffleHog can automate credential validation by making live API calls directly to the respective cloud providers. For example, when verifying an AWS access key, the TruffleHog invokes the sts:GetCallerIdentity API call to confirm whether the compromised credentials remain active and usable. The team identified TruffleHog calls against different types of cloud and SaaS keys, including AWS access keys, Azure application secrets, and different SaaS tokens. 

Internal Discovery

After the secrets were  validated, and as quickly as 24 hours after the initial theft, the threat actor began performing AWS discovery operations. This phase focused on enumerating the victims’ environment across several AWS services:

  • Identity and Compute: IAM (ListUsers, ListRoles, ListAttachedUserPolicies), EC2 (DescribeInstances), and Lambda (ListFunctions).

  • Infrastructure and Storage: RDS (DescribeDBInstances), Route 53 (ListHostedZones), and S3 (ListBuckets, GetBucketPublicAccessBlock).

  • Container Environments (ECS): TeamPCP showed a distinct focus on ECS, mapping clusters and task definitions (ListClusters, ListTaskDefinitions, DescribeTaskDefinition, ListTasks, DescribeTasks) to identify targets for interactive container access.

  • Secrets Management: AWS Secrets Manager (ListSecrets), which was targeted to prepare a list of secrets available for bulk exfiltration.

Code Execution and Lateral Movement

Once access had been validated and the layout identified, the actors used a variety of techniques to further their scheme by executing additional code and gaining access to other parts of the victim environments.

  • In multiple instances TeamPCP abused GitHub workflows to execute code within targeted repositories. Using stolen Personal Access Tokens (PATs), the attackers created pull requests containing malicious workflows, which were then triggered to run in the context of the repository. These workflows likely provided access to repository contents and runtime secrets, including environment variables and tokens available during execution. After execution, the attacker deleted the associated workflow logs, likely to remove evidence of their activity and hinder detection. 

  • In other cases, residual evidence indicated that the malicious workflows were created by the Nord Stream GitHub tool.

  • In AWS environments, the ECS Exec feature (leveraging the SSM Agent) was used to execute Bash commands and Python scripts directly on running containers. This access enabled the attackers to explore the environment and exfiltrate sensitive data.

Data Exfiltration

The threat actors targeted valuable information throughout the victim environments, using native techniques to efficiently steal data.  . Beyond its immediate value, the exfiltrated data may also contain additional secrets that enable further access and exploitation.

  • In GitHub, they abused authenticated access via Personal Access Tokens (PATs) to clone repositories at scale using “git.clone”, enabling access to source code, configuration files, and embedded secrets within impacted environments. 

  • Within AWS environments, the attackers used the stolen credentials to access and extract data from services such as S3 buckets, Secrets Manager, and databases, enabling bulk data retrieval and potential exposure of sensitive information.

Adversary Profile

TeamPCP’s post-compromise activities focused on compromising additional secrets and exfiltrating massive amounts of data from code repositories and cloud resources. The exfiltrated data and compromised secrets are potentially being shared with other groups to enable a range of operations.

TeamPCP is not trying to hide or blend in - they prioritized ease of use and speed by using open-source tools with strong signatures, conducting massive operations, and using bold resource names such as “pawn” or “massive-exfil”. Wiz CIRT observed the bulk of TeamPCP’s activity originating from Mullvad Virtual Private Network (VPN) exit nodes and virtual private server hosts such as InterServer.

What should Incident Responders and Threat Hunters do?

To detect and respond to anomalous activity, ensure audit logging is enabled and monitored across your cloud service providers and version control systems. This includes off-by-default logs such as cloud storage logs and IP logging in GitHub audit logs.  

To identify the post supply chain attack compromise, hunt for the following:

  • Any logs source with the known IOCs detailed below, including IP addresses and User agents.

  • Unexpected usage of VPN providers

  • Keys or tokens usage from new/anomalous Autonomous System Organizations (ASOs)

  • Unusual Enumeration Activity, Ex: “ListUsers”, “ListRoles” “DescribeInstances”

  • Unusual Secret Access and Validation, Ex: ”ListSecrets”, “GetCallerIdentity”

  • Many  “GetSecretValue”, or “GetObject” events in a short period of time by a token or a key

  • Anomalous execution of “ExecuteCommand” by a token or a key

  • Anomalous execution on workloads from SSM processes

  • Many “git.clone” events in a short period of time by a token or a key

  • Deletion of a Workflow log by a token or a key

Wiz customers can find a copy of this update in the threat center here

If you are a Wiz Defend customer, you can search for the below Detections:

IDNameNotes
cer-github-data-massPrivateRepoCloneOperationsByUserMass Clone Operations Of Private Repositories Performed By UserPost compromise
cer-github-data-massCloneOperationsByUserMass Clone Operations Performed By UserPost compromise
cer-github-control-workflowLogDeletedWorkflow Log DeletedPost compromise
cer-azure-control-apiCallsUsingOffensiveToolAzure API Calls Using a Known Offensive ToolPost compromise
cer-correlation-id-201AWS Management API Calls by a Known Offensive ToolPost compromise
cer-all-global-apiCallsUsingVPNAPI calls made using a VPNPost compromise
cer-all-global-apiCallUsingThirdPartyVPNAPI Call Using Third-Party VPNPost compromise
cer-github-control-unusualUserAccessThroughThirdPartyVPNUnusual user access to Github through third-party VPNPost compromise
cer-aws-control-unusualGetSecretValueByIAMUserUnusual Secret Value Retrieval By Long Lasting IAM UserPost compromise
cer-aws-identity-unusualGetCallerIdentityUnusual GetCallerIdentity OperationPost compromise
cer-aws-identity-staleIAMAccessKeyUsedIAM Access Key Used After Long Period of InactivityPost compromise
cer-correlation-id-105Anomalous executable not present in container image was executedPost compromise, search for SSMSession context tag
cer-sen-ioc-13Connection to a known malicious IP detectedTrivy Supply Chain Attack
cer-sen-id-1006Process created remote network connection via bash built-insTrivy Supply Chain Attack
cer-sen-id-1417DNS query to typosquatted security tool domainTrivy Supply Chain Attack
cer-sen-id-1304Python script executed base64 encoded codeLiteLLM Supply Chain Attack

For hardening and remediation recommendations, please see Wiz blog posts on Trivy, KICS, and LiteLLM supply chain attacks.

If you suspect you are under attack, reach out to Wiz CIRT.

Indicators of Compromise (IoCs)

Network Indicators

IndicatorASOFirst ObservedLast ObservedNotes
105.245.181.120Vodacom (Callback proxy)March 19 18:47 UTCMarch 20 00:22Secret validation with TruffleHog
138.199.15.172Datacamp Limited (Mullvad VPN)March 19 20:32 UTCMarch 25 10:58 UTCGitHub exfiltrationMalicious workflow pushAWS reconnaissance, execution, and exfiltration
154.47.29.12Datacamp Limited (Mullvad VPN)March 21 02:15 UTCMarch 23 20:05 UTCSecret validationAWS reconnaissance
163.245.223.12Interserver, IncMarch 20 21:13 UTCMarch 20 23:24 UTCGitHub exfiltration
170.62.100.245Datacamp Limited (Mullvad VPN)March 20 23:53 UTCMarch 23 20:19 UTCAWS reconnaissance
185.77.218.4Oy Crea Nova Hosting Solution LtdMarch 26 06:13 UTCMarch 26 08:28 UTCSecret validation with TruffleHog
193.32.126.15731173 Services AB (Mullvad VPN)March 20 00:57 UTCMarch 20 13:47 UTCGitHub exfiltration
209.159.147.239Interserver, IncMarch 20 01:48 UTCMarch 23 20:04UTCSecret validation with TruffleHog
23.234.107.104Tzulo, incMarch 24 07:18 UTCMarch 24 07:38 UTCSecret validation with Trufflehog
34.205.27.48Amazon.com, IncMarch 27 05:34 UTCMarch 27 06:03 UTCSecret validation with TruffleHog
103.75.11.59Host Universal Pty LtdMarch 23, 07:32 UTCN/Ahttps://kudelskisecurity.com/research/investigating-two-variants-of-the-trivy-supply-chain-compromise)

Code Indicators

IndicatorTypeNote
dev_remote_ea5Eu/test/v1branch nameDefault branch name for “Nord Stream”

User Agents

IndicatorNote
TrufflehogSecret validation
git/2.43.0GitHub exfiltrationGit version is over two years old
Boto3/1.42.73 md/Botocore#1.42.73 ua/2.1 os/linux#6.17.10+kali-amd64 md/arch#x86_64 lang/python#3.13.11 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.42.73Boto3 (Kali Linux)

References

Kudelski Security: Investigating Two Variants of the Trivy Supply-Chain Compromise

Continue reading

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management