Uh oh!
There was an error while loading. Please reload this page.
CI: Remove issues read permission from scan jobs - #52
Merged
ModeSevenIndustrialSolutions merged 1 commit intoSep 2, 2026
Conversation
The Grype scan jobs requested "issues: read" so the CVE bypass lookup could find maintainer-approved bypass issues. A called workflow cannot hold a permission its caller withheld, so every consumer that does not grant "issues: read" fails before it starts. GitHub reports that as a startup failure: zero jobs, no check runs and no annotation. The pull request then looks green because the checks that would fail never run. This estate publishes only public repositories, whose issues any client can read without a token or a scope. The bypass lookup also tolerates failure. It warns, returns an empty bypass list and exits zero, which leaves the vulnerability gate closed. Missing bypass data can only make a scan stricter, never weaker. Drop the request from the reusable workflows, along with the matching grants wherever this repository documents or exercises them, so that consumers no longer need to grant a permission that nothing requires. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Matthew Watkins <mwatkins@linuxfoundation.org>
ModeSevenIndustrialSolutions
requested review from
a team
and
a balanced review from CopilotSeptember 1, 2026 18:41
Copilotstarted reviewing on behalf of ModeSevenIndustrialSolutionsSeptember 1, 2026 18:42 View session
There was a problem hiding this comment.
🟢 Approval recommended
Pull request overview
Removes the unnecessary issues: read permission to restore compatibility for callers of reusable Java workflows.
Changes:
- Removes the permission from Maven and Gradle Grype jobs.
- Updates self-tests and consumer examples accordingly.
File summaries
| File | Description |
|---|---|
examples/maven/build-test/github.yaml | Removes the obsolete caller grant. |
examples/maven/build-test/gerrit.yaml | Removes the obsolete caller grant. |
examples/gradle/build-test/github.yaml | Removes the obsolete caller grant. |
examples/gradle/build-test/gerrit.yaml | Removes the obsolete caller grant. |
.github/workflows/testing.yaml | Updates Maven and Gradle self-test permissions. |
.github/workflows/maven-build-test.yaml | Removes issue access from the Grype job. |
.github/workflows/gradle-build-test.yaml | Removes issue access from the Grype job. |
Review details
- Files reviewed: 7/7 changed files
- Comments generated: 0
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
askb
approved these changes
Sep 2, 2026
ModeSevenIndustrialSolutions
merged commit Sep 2, 2026
b415dbf
into
lfreleng-actions:main
11 checks passed
Uh oh!
There was an error while loading. Please reload this page.
ModeSevenIndustrialSolutions
deleted the
ci/drop-issues-read-permission
branch
September 2, 2026 08:03
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The Grype scan migration (
python-workflowsPR #65 and its siblings across theworkflow families) replaced the inline Grype shell with
lfreleng-actions/grype-scan-action, adding a new capability — maintainer-approvedCVE bypass issues — and requesting
issues: readon the jobs that host the scan.A called workflow cannot hold a permission its caller has not granted. Every
consumer whose caller workflow does not grant
issues: readtherefore fails withstartup_failure: 0 jobs, no check runs, no annotation. The consumer's pullrequest looks green, because the checks that would fail are simply absent. That is
what makes this outage so easy to miss.
The change shipped as a patch release, with no mention of permissions in the
release notes and no breaking-change marker.
This PR is one of six applying the identical fix across
python-,node-,go-,docker-,java-workflowsandworkflows-template.Why remove the permission rather than grant it estate-wide
Granting it in consumers means 40+ changes across the estate to restore a
capability none of these repositories use. Removing it upstream is 6 changes.
Evidence that the permission is unnecessary here — every consumer in this estate
is a public repository:
curlagainst a public repo's issues API → HTTP 200, 3 issues returnedcollect_bypasses.py: with no token →exit=0; with an invalid token →::warning:: …continuing with no bypasses applied,bypasses=[],exit=0set -uo pipefail(no-e); the Evaluate findings step isif: always()and, with an empty bypass list, the vulnerability gate stays closedLosing bypass data can only make a scan stricter, never laxer. The failure mode
is safe in the security-relevant direction.
Known gap, stated plainly
In production the action passes
secrets.GITHUB_TOKENwithoutissues: read. Icould not reproduce a scope-restricted Actions token outside Actions, so I cannot
say whether GitHub returns 200 (the permission is ceremony) or 403 (the feature
genuinely needs it for this token type).
Either outcome is safe: a 403 takes the documented warn-and-continue path shown
in the table above, leaving the gate closed.
Scope of this change
Deletion only. The request is dropped from the two reusable workflows
(
maven-build-test.yaml,gradle-build-test.yaml), and the matching grants aredropped from the Maven and Gradle examples and the self-test workflow, symmetric
with the change that added them together. Leaving the grants behind would document
a requirement that no longer exists.
No
permissions:block is left empty: every deleted line sat beside at least oneother permission. I verified this by parsing all 81 workflow and example files
across the six repositories and asserting that no
permissionskey resolves tonull.
Validation
prek run --files <changed>— all hooks pass (yamllint, actionlint, zizmor, markdownlint, write-good, codespell, reuse, workflow validators)zizmor .github/workflows/— base and head report the same 2 pre-existing low findings (self-repository, unrelated to permissions). This change adds nothing.How to confirm the fix
Confirmation here is indirect. This PR touches only
.github/**, which thebuild/test workflow path-filters out (
'!.github/**'), so the build/test check willnot appear on this PR — its absence is the path filter, not the bug.
Real proof comes from the next PR in a consumer repository that touches a
non-
.githubpath, once a release carrying this change is picked up.Follow-up
After merge this repository needs a new release so consumers pick the fix up via
Dependabot. Repos still pinned to the pre-migration release will otherwise break on
their next bump.
Existing tags should not be deleted — SHA pins still resolve through them, so
deletion breaks reproducibility without fixing anything. Consider annotating the
affected releases as known-broken instead.