RSTR-SEC-002 — GitHub personal access token (ghp_…)
Summary
A string matching GitHub's classic personal access token format
(ghp_ + 36 base62 chars) appears in the repository. Anyone with the
token can act as the user on the GitHub API, including pushing to
private repos, creating releases, and reading workflow secrets.
Severity
High.
Languages
Any scannable text file — source, config, manifests.
What rastray flags
GH_TOKEN = "ghp_EXAMPLEEXAMPLEEXAMPLEEXAMPLEEXAMPLE1234" # ← flagged
The matcher requires the literal ghp_ prefix plus a high-entropy
suffix to avoid flagging documentation snippets that obviously use
filler text (ghp_XXXX...).
What rastray deliberately does not flag
- Tokens read from environment variables:
os.environ['GH_TOKEN']. - Documentation that shows the format with placeholder text
(
ghp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) — low entropy.
How to fix it
-
Revoke immediately at https://github.com/settings/tokens. The token is now public regardless of whether you push the fix; assume hostile use.
-
Generate a fresh token with the smallest scope that does the job.
-
Move the secret to an environment variable or a secret manager, and load it at runtime:
import os GH_TOKEN = os.environ['GH_TOKEN'] -
Rewrite history if the token ever appeared in a commit:
git filter-repo --replace-text expressions.txt git push --force-with-leaseForce-pushing the rewrite alone does not erase the secret — GitHub caches commit blobs for 90 days; the revocation in step 1 is what actually contains the damage.