Skip to content

fix(ci): do not persist the job token in .git/config in the public-repo guard - #31

Closed
yakimoto wants to merge 1 commit into
mainfrom
fix/1870-persist-credentials-false
Closed

yakimoto wants to merge 1 commit into
mainfrom
fix/1870-persist-credentials-false

Conversation

@yakimoto

@yakimoto yakimoto commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Why

actions/checkout without persist-credentials: false writes the job's GITHUB_TOKEN into
.git/config, where any later step — or anything those steps execute — can read it. This is the
security gate that DOWNLOADS AND EXECUTES the gitleaks binary, and the workflow's own comment
already reasons about tampered downloads ("so a tampered or MITM'd download can never execute
inside the security gate"), so the threat model is written down and only the credential half of
the mitigation is missing. Found by zizmor as warning[artipacked]: credential persistence through GitHub Actions artifacts.

Safety

Verified this job only: checks out, installs gitleaks (pinned + checksum), runs
gitleaks detect --no-git, installs ripgrep, runs content-policy.sh. permissions: contents: read. Nothing pushes, calls gh, or reads GITHUB_TOKEN/GH_TOKEN, so the token was never needed
in .git/config in the first place.

Refs wave-av/claude-workstation#1870.


Note

Low Risk
Single CI hardening change with no runtime or application logic impact; reduces credential exposure in a security gate workflow.

Overview
Sets persist-credentials: false on the actions/checkout step in the public-repo-guard workflow so the job’s GITHUB_TOKEN is not stored in .git/config.

That matters because later steps download and run the pinned gitleaks binary and execute content-policy.sh; without this flag, anything in those steps could read the token from git config even though the job only needs contents: read and never uses the token for push or gh.

Reviewed by Cursor Bugbot for commit af2560c. Configure here.

Review in cubic

…po guard

actions/checkout without persist-credentials:false leaves GITHUB_TOKEN readable
in .git/config for every later step — including the one that downloads and
executes the gitleaks binary. Nothing in this job uses the credential
(contents:read, gitleaks runs --no-git, no gh/push steps). Refs #1870.
@cursor

cursor Bot commented Aug 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_62185daf-61dd-4bf5-aef1-5143701df29a)

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

Open in Devin Review

Comment on lines 45 to +47
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
persist-credentials: false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Consider applying the same hardening to sibling workflows

This repo's other workflows also use actions/checkout without persist-credentials: false; for consistency with the stated hardening intent, they may deserve the same treatment (and the vendored guard is meant to be copied verbatim into other WAVE repos, so the upstream template should carry this too).

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@macroscopeapp

macroscopeapp Bot commented Aug 6, 2026

Copy link
Copy Markdown

Approvability

Verdict: Approved af2560c

Minor CI security hardening that adds persist-credentials: false to prevent job token from persisting in git config. Standard best practice with no runtime impact on the application.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 31 minutes

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 831b8f3e-363c-40a5-884c-26e2d97bd650

📥 Commits

Reviewing files that changed from the base of the PR and between 8c55aee and af2560c.

📒 Files selected for processing (1)
  • .github/workflows/public-repo-guard.yml

Comment @coderabbitai help to get the list of available commands.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

CI hardening: disable credential persistence in public-repo-guard checkout

⚙️ Configuration changes 🕐 Less than 5 minutes

Grey Divider

AI Description

• Prevent actions/checkout from writing GITHUB_TOKEN into .git/config
• Reduce credential exposure in the workflow that downloads and executes gitleaks
Diagram

graph TD
  A["public-repo-guard job"] --> B["actions/checkout (no creds)"] --> C["download gitleaks"] --> D["run gitleaks + policy"]
  B --> E[(".git/config")] -."no token".-> D
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Unset credentials after checkout
  • ➕ Works even if a different checkout action (or custom git clone) is used
  • ➕ Can be applied conditionally per step/job
  • ➖ Easy to miss edge cases (multiple remotes, helpers, submodules)
  • ➖ Leaves a window where later steps could still read credentials if ordering changes
2. Use `actions/checkout` with `token: ''` (where possible)
  • ➕ Prevents token use entirely for checkout in read-only scenarios
  • ➖ Can break private repo/submodule access and some checkout behaviors
  • ➖ Less standard than persist-credentials: false and can be confusing to maintainers

Recommendation: Keep the PR’s approach (persist-credentials: false). It is the most direct, least error-prone mitigation for preventing GITHUB_TOKEN from being written to .git/config, and it aligns with a read-only job that downloads/executes binaries.

Files changed (1) +2 / -0

Other (1) +2 / -0
public-repo-guard.ymlDisable checkout credential persistence for public-repo-guard +2/-0

Disable checkout credential persistence for public-repo-guard

• Adds 'with: persist-credentials: false' to the 'actions/checkout' step so the job’s 'GITHUB_TOKEN' is not stored in '.git/config' for later steps to read.

.github/workflows/public-repo-guard.yml

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

@qodo-code-review

Copy link
Copy Markdown

Qodo Fixer

No findings are available for this PR yet. Findings appear here once Qodo has reviewed the PR.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 1 file

Confidence score: 5/5

  • Automated review surfaced no issues in the provided summaries.
  • No files require special attention.

Re-trigger cubic

@yakimoto

yakimoto commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

This PR is redundant with #28 (chore/guard-canonical-sync), which is already open and already contains this exact change.

Evidence — #28's diff to .github/workflows/public-repo-guard.yml includes:

+          # tree. Nothing here pushes -- the scan is `--no-git` over the working tree --
+          # so no step needs authenticated Git; drop it. (zizmor: artipacked)
+          persist-credentials: false

#28 is also broader than this PR: it syncs the whole vendored public-repo-guard trio to
the canonical source (wave-foundation/scaffolder/public-repo-guard) byte-for-byte, verified by
git blob SHA, rather than adding this one line in isolation.

Closing as redundant. This duplicate exists because the fan-out that opened this PR
(refs claude-workstation#1870) did not check for in-flight PRs touching the same file before
going out — #28 was already open. Merge #28 instead.

@yakimoto yakimoto closed this Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant