AI PR campaign abuses pull_request_target to steal CI secrets
TL;DR — The “prt-scan” campaign mass-targeted open-source repos by submitting malicious PRs that exploit pull_request_target workflow misconfigurations to exfiltrate CI secrets and publish compromised npm packages.
What happened
GitHub Actions is GitHub’s CI/CD system, and pull_request_target is a workflow trigger intended to run PR-related workflows using the base repository’s context. Wiz reports that, unlike pull_request, pull_request_target runs with access to the base repo’s secrets even when the PR comes from a fork — a common misconfiguration that turns “untrusted contributor code” into a secrets-exfil path.
On April 2, 2026, researcher Charlie Eriksen publicly identified an automated campaign exploiting pull_request_target. Wiz’s analysis attributes the activity to a single actor operating across multiple GitHub accounts, with the most visible wave using the account ezmtebo to open 475+ malicious PRs in ~26 hours. Wiz reports the actor executed six waves starting March 11, 2026, totaling well over 500 malicious PRs.
Per Wiz, the attacker’s playbook was to fork repos, create a prt-scan-* branch, inject payloads into files that execute during CI (e.g., conftest.py, package.json, Makefile, build.rs), and then open PRs designed to trigger workflows. If triggered, payloads attempted to steal GITHUB_TOKEN, enumerate secret names, probe cloud metadata endpoints (AWS/Azure/GCP), and exfiltrate via workflow logs and PR comments.
This is a concrete example of the broader trend: CI/CD and “repo automation” remain a high-leverage supply-chain choke point, and AI-assisted automation is making mass exploitation of workflow misconfigurations operationally cheap and fast.
Who is impacted
- Organizations and maintainers running GitHub Actions workflows that use
pull_request_targetin ways that allow untrusted PR content to execute while secrets are available. - Repositories targeted by “first-time contributor” PRs titled like the campaign’s signature PRs (see IoCs below).
- npm consumers of the compromised packages Wiz calls out:
@codfish/eslint-config@codfish/actions
| Category | Values called out by Wiz |
|---|---|
| Campaign GitHub accounts | testedbefore, beforetested-boop, 420tb, 69tf420, elzotebo, ezmtebo |
| Malicious branch pattern | prt-scan-[12-character-hex] |
| PR signature | Title: ci: update build configuration / Body: Automated build configuration update. |
| User-Agent | python-requests/2.32.5 |
| Workflow log markers | ==PRT_EXFIL_START_[nonce]== … ==PRT_EXFIL_END_[nonce]== (plus PRT_GIT_AUTH= and other PRT_* markers) |
What to do now
- Follow the investigation guidance as stated in the report.
-
"Review your GitHub organization for Indicators of Compromise (listed below)."
-
- Hunt for campaign artifacts in your org:
- PRs matching the signature title/body.
- Branches matching
prt-scan-[12-character-hex]. - Workflow logs containing the
==PRT_*==markers. - Activity from the listed GitHub accounts.
- If you find evidence that secrets may have been exposed in runner logs or PR comments, treat this as a CI secrets exposure scenario and scope your response around the credentials that could have been reachable by the workflow (e.g., cloud keys, deploy tokens, npm publish tokens).
- Validate your
pull_request_targetusage against your threat model; Wiz points to GitHub hardening guidance for preventative controls.-
"For preventative guidance, you can refer to our blog post on GitHub hardening."
-
Content is AI-assisted and reviewed by our team, but issues may be missed and best practices evolve rapidly, send corrections to [email protected]. Always consult official documentation and validate key implementation decisions before making design or security choices.
