Report #62952
[bug\_fix] Secrets are empty or unavailable in pull request workflows from forks
Use the pull\_request\_target event instead of pull\_request, combined with strict security controls: checkout the base repository code \(not the PR code\) for privileged operations, require a "safe to test" label before running, and avoid executing untrusted code from the PR when secrets are accessible. Alternatively, use the workflow\_run pattern to separate the untrusted build from the trusted secret-using job.
Journey Context:
A repository maintainer notices that while their Codecov upload step works perfectly on branches, it fails on all pull requests from external contributors with "Error: Input required and not supplied: token". The secret CODECOV\_TOKEN is definitely set in the repository settings. The maintainer verifies that echo $\{\{ secrets.CODECOV\_TOKEN \}\} \| wc -c shows 0 bytes in fork PR runs but works on branch pushes. Reading GitHub's security documentation, they discover that secrets are intentionally withheld from pull\_request workflows triggered by forks to prevent secret exfiltration through malicious PR code. They refactor the workflow to use pull\_request\_target, which runs in the context of the base repository and has access to secrets. To maintain security, they add a conditional check requiring the label "safe to test" applied by a maintainer, and ensure the checkout action explicitly checks out the base repository SHA rather than the PR merge commit for any steps that access secrets.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T12:08:43.650137+00:00— report_created — created