Skip to content

Commit 448891e

Browse files
hesreallyhimclaude
andcommitted
chore(security): scope workflow token permissions to jobs that need writes
Addresses OSSF Scorecard's Token-Permissions check (currently 0/10). Three workflows granted write scopes at the top level, which leaks permission scope to any future job added to the workflow. Moving the writes to the single job in each file that actually needs them and leaving the top level at contents: read, which is Scorecard's preferred restrictive default. publish-npm.yml: top level: contents: read (was: contents: write, id-token: write) publish-npm job: contents: write (gh release upload), id-token: write (npm trusted publishing OIDC) release-please.yml: top level: contents: read (was: contents: write, pull-requests: write) release-please job: contents: write (release commits and tags), pull-requests: write (release PR updates) upstream-pass-cli-watch.yml: top level: contents: read (was: contents: write, pull-requests: write) watch-upstream job: contents: write (peter-evans/create-pull-request pushes the chore branch), pull-requests: write (open the PR) No functional change - the actions that need the writes still have them via job-level grants. Verified with the ossf-scorecard plugin's workflow-audit skill: token-permissions domain now reports 0 findings. 🤖 Generated with Claude Code Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c04ed6e commit 448891e

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

.github/workflows/publish-npm.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ on:
66
- published
77

88
permissions:
9-
contents: write
10-
id-token: write
9+
contents: read
1110

1211
jobs:
1312
publish-npm:
@@ -16,6 +15,12 @@ jobs:
1615
runs-on: ubuntu-latest
1716
environment:
1817
name: npm-publish
18+
# Job-level write grants only where actually needed:
19+
# contents: write -> `gh release upload` (steps[9])
20+
# id-token: write -> npm trusted publishing OIDC (steps[10])
21+
permissions:
22+
contents: write
23+
id-token: write
1924
steps:
2025
- name: Checkout release tag
2126
uses: actions/checkout@v5

.github/workflows/release-please.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@ on:
77
workflow_dispatch:
88

99
permissions:
10-
contents: write
11-
pull-requests: write
10+
contents: read
1211

1312
jobs:
1413
release-please:
1514
name: Release Please
1615
runs-on: ubuntu-latest
16+
# Job-level write grants only where actually needed:
17+
# contents: write -> release-please creates release commits and tags
18+
# pull-requests: write -> release-please opens and updates the release PR
19+
permissions:
20+
contents: write
21+
pull-requests: write
1722
steps:
1823
- name: Run Release Please
1924
uses: googleapis/release-please-action@v4

.github/workflows/upstream-pass-cli-watch.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@ on:
66
workflow_dispatch:
77

88
permissions:
9-
contents: write
10-
pull-requests: write
9+
contents: read
1110

1211
jobs:
1312
watch-upstream:
1413
name: Watch upstream latest version tag
1514
runs-on: ubuntu-latest
15+
# Job-level write grants only where actually needed:
16+
# contents: write -> peter-evans/create-pull-request pushes a chore branch
17+
# pull-requests: write -> peter-evans/create-pull-request opens the PR
18+
permissions:
19+
contents: write
20+
pull-requests: write
1621
steps:
1722
- name: Checkout
1823
uses: actions/checkout@v5

0 commit comments

Comments
 (0)