Six Accounts, One Actor: Inside the prt-scan Supply-Chain Campaign

· Original article ↗

Summary

Wiz Research traced six waves of a campaign abusing GitHub’s pull_request_target workflows to steal credentials and compromise at least two npm packages. The actor opened over 500 malicious PRs, with a reported success rate below 10%.

Key points

  • The campaign began March 11, 2026, and used six GitHub accounts to open more than 500 malicious pull requests across six waves.
  • The attacker abused pull_request_target workflows, which run in the base repository context and may expose repository secrets to pull requests from forks.
  • Payloads evolved from shell scripts to repository-aware, AI-generated injections targeting files such as conftest.py, package.json, Makefile, and build.rs.
  • Across more than 450 analyzed attempts, fewer than 10% succeeded; the research reports at least two compromised npm packages and credential theft involving AWS, Cloudflare, and Netlify tokens.
  • Many attempted payload stages required permissions the stolen tokens did not have, while contributor approval gates and workflow restrictions blocked attacks against several high-profile repositories.
  • The article recommends reviewing repositories for the listed account names, prt-scan branch pattern, pull-request signatures, and workflow-log markers.

Article Details

Attack Vectors
  • Exploited GitHub Actions workflows using the pull_request_target trigger, which runs in the base repository context and may expose repository secrets to pull requests from forks.
  • Opened malicious pull requests containing payloads in CI-executed files, including conftest.py, package.json, Makefile, setup.py, build.rs, action.yml, and workflow-directory scripts.
  • Sought to steal GitHub tokens and secrets from workflow environment variables, git configuration, workflow logs, and later-running processes; probed cloud metadata endpoints and attempted to exfiltrate credentials through workflow logs and pull-request comments.
  • Attempted to publish malicious versions of npm packages when an NPM_TOKEN was available; the article reports confirmed compromise of @codfish/eslint-config and @codfish/actions.
Defensive Notes
  • Require approval for first-time contributors and restrict privileged workflows to trusted actors.
  • Use path-based trigger conditions and review pull_request_target workflows for unsafe execution of pull-request content.
  • Review GitHub organizations for the article's listed account names, branch pattern, pull-request signatures, user agent, and workflow-log markers.
  • The article reports that contributor approval requirements, actor-restricted workflows, and path-based trigger conditions blocked attacks against several high-profile repositories.

Indicators of compromise

TypeIndicatorContext
EMAILelzotebo@proton[.]meEmail associated with the GitHub account elzotebo, identified as part of the campaign.
EMAILelzotebo+88@proton[.]meEmail associated with the GitHub account ezmtebo, identified as part of the campaign.
EMAILtestedbefore@proton[.]meEmail associated with the GitHub account testedbefore, identified as part of the campaign.
EMAILtestedbefore+55@proton[.]meEmail associated with the GitHub account 420tb, identified as part of the campaign.
EMAILtestedbefore+89@proton[.]meEmail associated with the GitHub account beforetested-boop, identified as part of the campaign.
EMAILtestedbefore+99@proton[.]meEmail associated with the GitHub account 69tf420, identified as part of the campaign.
IPV4169[.]254[.]169[.]254Cloud metadata address probed by campaign payloads for credential access.

MITRE ATT&CK

People

Threat Actors

Products

Related Articles