Skip to content

ci: least-privilege Pages token in e2e-kvm, pin actions to digests, hold the noble runner pins - #572

Merged
hanthor merged 1 commit into
mainfrom
claude/wootc-ci-hardening
Oct 9, 2026
Merged

hanthor merged 1 commit into
mainfrom
claude/wootc-ci-hardening

Conversation

@hanthor

@hanthor hanthor commented Oct 8, 2026

Copy link
Copy Markdown
Member

Summary

Workflow permissions (#519, #521, #540)

  • I checked all 25 workflows, and every one already has a top-level permissions: block. These three bot issues come from a false-positive scan, so I will close them as duplicates of [sec-check] wootc: missing top-level permissions blocks in 5 workflows #519.
  • The one real least-privilege gap is e2e-kvm.yml. It granted pages: write and id-token: write at the top level, so the self-hosted e2e job got them too.
    • The top level is now contents: read.
    • Only deploy-pages gets the Pages token.

Pin actions to commit SHAs (#560)

  • renovate.json now extends helpers:pinGitHubActionDigests.
  • Renovate will open one PR that pins every uses: to a digest, with the tag kept as a comment, and will keep the pins current after that.
  • The same-org reusable ste-lint.yml@main stays on main. Pinning it is your call.

Hold the ubuntu-24.04 runner pins (#491)

  • Four workflows pin ubuntu-24.04 on purpose: linux-package-execute, linux-package-runtime, offline-image-bundle and offline-release-plan.
    • The reason is tests/e2e/package-runtime/host-data.py. It resolves the noble suites and pins the noble qemu/ovmf packages.
  • Renovate's chore(deps): update dependency ubuntu to v26 #491 bumps them to 26.04, and its source/controls jobs fail with complete authenticated package/index closure absent.
  • A package rule now stops those bumps. The runner should move together with host-data.py, not on its own. I'll close chore(deps): update dependency ubuntu to v26 #491.

Validation

  • yamllint -d relaxed passes on the changed workflow; it gives only the existing line-length warnings.
  • actionlint reports nothing new; its one finding is the existing custom kvm runner label.
  • renovate.json parses as JSON.

Refs #519, #560

🤖 Generated with Claude Code

https://claude.ai/code/session_017rgdDrtF1Kz1pxzxfcwBUb


Generated by Claude Code

…old the noble runner pins

- e2e-kvm.yml gave pages:write and id-token:write to every job, including
  the self-hosted e2e job, which only needs to read the repository. The
  top level is now contents:read and only deploy-pages gets the Pages
  token. Every other workflow already had a top-level permissions block,
  so this is the one real gap behind #519/#521/#540.
- renovate: extend helpers:pinGitHubActionDigests, so Renovate pins every
  action to a commit SHA (with the tag as a comment) and keeps it current
  (#560).
- renovate: stop proposing a newer runner for the four workflows that pin
  ubuntu-24.04 on purpose. host-data.py resolves the noble suites, and
  PR #491 (ubuntu 26) fails their package closure.

Refs #519, #560

Assisted-by: Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017rgdDrtF1Kz1pxzxfcwBUb
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.

2 participants