{"id":371,"date":"2026-03-24T14:08:29","date_gmt":"2026-03-24T14:08:29","guid":{"rendered":"https:\/\/thedigitalfortress.us\/?p=371"},"modified":"2026-03-24T14:08:29","modified_gmt":"2026-03-24T14:08:29","slug":"teampcp-hacks-checkmarx-github-actions-using-stolen-ci-credentials","status":"publish","type":"post","link":"https:\/\/thedigitalfortress.us\/?p=371","title":{"rendered":"TeamPCP Hacks Checkmarx GitHub Actions Using Stolen CI Credentials"},"content":{"rendered":"<div id=\"articlebody\">\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhs6mMRIch1O4gn0txxM6yMSRtvi7D0xmBbphFA0WJimqGO4k48KNvAbF_-an7swi-N0ZHOB2jt1WtJQjubozx7WzJH6Kr0CA0rCkP4TNUHR2NkC8NS6RaJDF9WUyZeyzUIG1NQtK_Betxs3h0gaxKqHMs7laaHTVXSiCMo-vbS_owFokGrDqN9NG7jdwRf\/s1700-e365\/git-check.jpg\" style=\"display: block;  text-align: center; clear: left; float: left;\"><\/a><\/div>\n<p>Two more GitHub Actions workflows have become the latest to be compromised by credential-stealing malware by a threat actor known as TeamPCP, the cloud-native cybercriminal operation also behind the Trivy supply chain attack.<\/p>\n<p>The workflows, both maintained by the supply chain security company Checkmarx, are listed below &#8211;<\/p>\n<p>Cloud security company Sysdig said it observed an identical credential stealer as the one used in TeamPCP&#8217;s operations targeting Aqua Security&#8217;s Trivy vulnerability scanner and its associated GitHub Actions, about four days after the breach on March 19, 2026. The Try supply chain compromise is being tracked under the CVE identifier <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2026-33634\" rel=\"noopener\" target=\"_blank\">CVE-2026-33634<\/a> (CVSS score: 9.4).<\/p>\n<p>\u00abThis suggests that the stolen credentials from the Trivy compromise were used to poison additional actions in affected repositories,\u00bb Sysdig <a href=\"https:\/\/www.sysdig.com\/blog\/teampcp-expands-supply-chain-compromise-spreads-from-trivy-to-checkmarx-github-actions\" rel=\"noopener\" target=\"_blank\">said<\/a>.<\/p>\n<p>The stealer, referred to as \u00abTeamPCP Cloud stealer,\u00bb is designed to steal credentials and secrets related to SSH keys, Git, Amazon Web Services (AWS), Google Cloud, Microsoft Azure, Kubernetes, Docker, .env files, databases, and VPNs, along with CI\/CD configurations, data from cryptocurrency wallets, and Slack and Discord webhook URLs.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/not-fast-enough-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhlXM830ruQd2xT6M7JNeNRjaFa1onD12WjSCHihTFMTzbyfT9h-irPmXy_h3E1HGSs6sdv7FTmnyNVTM5kmSb7BuUtZe8gKoTQt99P1sSzRcqqXpOJP6eoAOhR3DGb6qHx9kOZ_HBZUMmVnsnd0DM7QfUp81bgzTvvgLww6oqB-EhnDfWXH5pWCYhAsyLs\/s728-e100\/tl-d.jpg\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>Like in the case of Trivy, the threat actors have been found to force-push tags to malicious commits containing the stealer payload (\u00absetup.sh\u00bb). The stolen data is exfiltrated to the domain \u00abcheckmarx[.]zone\u00bb (IP address: 83.142.209[.]11:443) in the form of an encrypted archive (\u00abtpcp.tar.gz\u00bb).<\/p>\n<p><a name=\"more\"\/><\/p>\n<p>The new version creates a \u00abdocs-tpcp\u00bb repository using the victim&#8217;s GITHUB_TOKEN to stage the stolen data as a backup method if the exfiltration to the server fails. In the Trivy incident, the threat actors used the repository name \u00abtpcp-docs\u00bb instead.<\/p>\n<p>\u00abThe use of vendor-specific typosquat domains for each poisoned action is a deliberate deception technique,\u00bb Sysdig said. \u00abAn analyst reviewing CI\/CD logs would see curl traffic to what appears to be the action&#8217;s own vendor domain, reducing the likelihood of manual detection.\u00bb<\/p>\n<p>The fact that the stealer&#8217;s primary function is to harvest credentials from CI runner memory allows the operators to extract GitHub personal access tokens (PATs) and other secrets from when a compromised Trivy action executes in a workflow. To make matters worse, if those tokens have write access to repositories that also use Checkmarx actions, the attacker can weaponize them to push malicious code.<\/p>\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi-UP7rY9_9nhSVu2wUcsBDpcFmenvbxOQFOM7nGQnx-qrxbLEXTzUHrqdyho52x2mihYwvhED9O6A5cqnhCW1WaMWR7qtvqB4SGH4wTDG4UveQ4Xxf6KstcIY8jFWvhal2FVI6T3wVrPGcz_CmMkzh56w12viIlMVqZZx_kR6C9j5NQ1FAOYeL9gGjDnrK\/s1700-e365\/check.png\" style=\"display: block;  text-align: center; clear: left; float: left;\"><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi-UP7rY9_9nhSVu2wUcsBDpcFmenvbxOQFOM7nGQnx-qrxbLEXTzUHrqdyho52x2mihYwvhED9O6A5cqnhCW1WaMWR7qtvqB4SGH4wTDG4UveQ4Xxf6KstcIY8jFWvhal2FVI6T3wVrPGcz_CmMkzh56w12viIlMVqZZx_kR6C9j5NQ1FAOYeL9gGjDnrK\/s1700-e365\/check.png\" alt=\"\" border=\"0\" data-original-height=\"620\" data-original-width=\"1584\"\/><\/a><\/div>\n<p>This, in turn, opens the door to a cascading supply chain compromise, where one poisoned action captures secrets that are used to facilitate the poisoning of other actions.<\/p>\n<p>\u00abThe identical payload, encryption scheme, and tpcp.tar.gz naming convention confirm this is the same threat actor expanding their reach beyond the initial Trivy compromise,\u00bb Sysdig noted. \u00abCode review and dependency scanning failed here because the malicious code was injected into a trusted action at the source.\u00bb<\/p>\n<p>According to Wiz, the attack appears to have been carried out via the compromise of the \u00abcx-plugins-releases\u00bb service account, with the attackers also <a href=\"https:\/\/x.com\/ReversingLabs\/status\/2036193573796978729\" rel=\"noopener\" target=\"_blank\">publishing trojanized versions<\/a> of the \u00ab<a href=\"https:\/\/open-vsx.org\/extension\/checkmarx\/ast-results\/\" rel=\"noopener\" target=\"_blank\">ast-results<\/a>\u00bb (version 2.53.0) and \u00ab<a href=\"https:\/\/open-vsx.org\/extension\/checkmarx\/cx-dev-assist\" rel=\"noopener\" target=\"_blank\">cx-dev-assist<\/a>\u00bb (version 1.7.0) Open VSX extensions. The VS Code Marketplace versions are not affected.<\/p>\n<p>Once the extension is activated, the malicious payload checks whether the victim has credentials for at least one cloud service provider, such as GitHub, AWS, Google Cloud, and Microsoft Azure. If any credentials are detected, it proceeds to fetch a next-stage payload from the same domain (\u00abcheckmarx[.]zone\u00bb).<\/p>\n<p>\u00abThe payload attempts execution via npx, bunx, pnpx, or yarn dlx. This covers major JavaScript package managers,\u00bb Wiz researchers Rami McCarthy, James Haughom, and Benjamin Read <a href=\"https:\/\/www.wiz.io\/blog\/teampcp-attack-kics-github-action\" rel=\"noopener\" target=\"_blank\">said<\/a>. \u00abThe retrieved package contains a comprehensive credential stealer. Harvested credentials are then encrypted, using the keys as elsewhere in this campaign, and exfiltrated to &#8216;checkmarx[.]zone\/vsx&#8217; as tpcp.tar.gz.\u00bb<\/p>\n<p>\u00abOn non-CI systems, the malware installs persistence via a systemd user service. The persistence script polls https:\/\/checkmarx[.]zone\/raw every 50 minutes for additional payloads, with a kill switch that aborts if the response contains \u00abyoutube\u00bb. Currently, the link redirects to The Show Must Go On by Queen.\u00bb<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/attack-stories-xmcyber-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi10JhdzuuQKeU6vIJGPRAeffB5FYR9ajRiOfpp6hmgsP5GCmDcMdEKpiEEUZjkua9Y9R__l-63FpqNwAFgZzIdNR5lPIJcvvyBKIAu_nN7Z1TJoVUXrEvfQcWlJ0QhqMshOARvU3_B94NJNDbp-SiKAVfPFPibh_jcBpTfSPmCFxxJkPqL44kIFXL1WGEo\/s728-e100\/fs-d.png\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>To mitigate the threat, users are advised to perform the following actions with immediate effect &#8211;<\/p>\n<ul>\n<li>Rotate all secrets, tokens, and cloud credentials that were accessible to CI runners during the affected window.<\/li>\n<li>Audit GitHub Actions workflow runs for any references to tpcp.tar.gz, scan.aquasecurity[.]org, or checkmarx[.]zone in runner logs.<\/li>\n<li>Search GitHub organization for repositories named \u00abtpcp-docs\u00bb or \u00abdocs-tpcp,\u00bb which indicate successful exfiltration via the fallback mechanism.<\/li>\n<li>Pin GitHub Actions to full commit SHAs rather than version tags, as tags can be force-pushed.<\/li>\n<li>Monitor outbound network connections from CI runners to suspicious domains.<\/li>\n<li>Restrict the Instance Metadata Service (IMDS) from CI runner containers using IMDSv2.<\/li>\n<\/ul>\n<p>In the days following the initial breach, TeamPCP actors have pushed malicious Docker images of Trivy containing the same stealer and hijacked the company&#8217;s \u00abaquasec-com\u00bb GitHub organization to tamper with dozens of internal repositories.<\/p>\n<p>They have also been observed targeting Kubernetes clusters with a malicious shell script that wipes all machines when it detects systems matching the Iranian time zone and locale, highlighting a newfound escalation of the group&#8217;s modus operandi.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Two more GitHub Actions workflows have become the latest to be compromised by credential-stealing malware by a threat actor known as TeamPCP, the cloud-native cybercriminal operation also behind the Trivy&hellip;<\/p>\n","protected":false},"author":1,"featured_media":372,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[802,857,446,71,856,445,855],"class_list":["post-371","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-actions","tag-checkmarx","tag-credentials","tag-github","tag-hacks","tag-stolen","tag-teampcp"],"_links":{"self":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=371"}],"version-history":[{"count":0,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/371\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/media\/372"}],"wp:attachment":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}