Skip to content

ci: declare least-privilege workflow-level contents: read#181

Closed
arpitjain099 wants to merge 1 commit into
denoland:mainfrom
arpitjain099:chore/declare-workflow-perms
Closed

ci: declare least-privilege workflow-level contents: read#181
arpitjain099 wants to merge 1 commit into
denoland:mainfrom
arpitjain099:chore/declare-workflow-perms

Conversation

@arpitjain099
Copy link
Copy Markdown

Small CI hardening: declares an explicit workflow-level permissions: contents: read on 1 workflow(s) that currently inherit the default broad read-write GITHUB_TOKEN.

I inspected each file before including it; none publish, push, comment on issues/PRs, or otherwise write via the GitHub API, so the read-only default does not change behavior. Workflows that need to write (stale, release, gh-pages-deploy, publish actions, etc.) are intentionally left out of this PR.

This is the post-CVE-2025-30066 hardening pattern for default token scope.

Declares an explicit workflow-level permissions: contents: read on 1 workflow that currently inherit the default broad read-write GITHUB_TOKEN. Each file was inspected and only reads the checkout; none publish, push, or write via the GitHub API. Post-CVE-2025-30066 hardening default.

Signed-off-by: Arpit Jain <arpitjain099@gmail.com>
@CLAassistant
Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@bartlomieju
Copy link
Copy Markdown
Member

Thanks for the contribution, and for being careful to inspect each workflow first.

We're going to pass on this one, though. The change targets release.yml, which only runs on workflow_dispatch (manual, maintainer-only), so it has no untrusted-input attack surface — and its actual privilege comes from DENOBOT_PAT (used for both checkout and the release step), not the default GITHUB_TOKEN. Restricting the default token to contents: read therefore doesn't constrain anything this workflow meaningfully uses, and the CVE-2025-30066 / tj-actions threat model (a malicious action abusing the token on PR-triggered runs) doesn't apply to a manually-dispatched release job.

The workflow where this hardening would actually add defense-in-depth is ci.yml, since that's triggered by pull_request (including forks) and currently inherits the broad default token. If you'd like to pursue that, please open an issue first so we can discuss the right shape (likely a job-level contents: read with the publish step getting only what it needs).

Closing for now — appreciate the effort!

@bartlomieju bartlomieju closed this Jun 1, 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.

3 participants