Skip to content

Add zizmor and frizbee CI/CD security checks#290

Merged
tashian merged 10 commits intomainfrom
carl/add-zizmor-frizbee
Mar 3, 2026
Merged

Add zizmor and frizbee CI/CD security checks#290
tashian merged 10 commits intomainfrom
carl/add-zizmor-frizbee

Conversation

@tashian
Copy link
Contributor

@tashian tashian commented Mar 3, 2026

As recommended in this recent security research paper, adds zizmor (workflow security scanner) and frizbee (action pinning checker) as reusable workflows alongside existing actionlint

  • Wires both into goCI.yml (unconditional — no opt-out flags) and ci.yml
  • Pins previously unpinned references: docker://rhysd/actionlint:latest1.7.11@sha256:digest, actions/cache@v5@sha (v5.0.3)

Together the three tools cover: syntax errors (actionlint), security vulnerabilities (zizmor), and supply-chain pinning (frizbee).

New reusable workflows

  • zizmor.yml — uses zizmorcore/zizmor-action@v0.5.0 (pinned to SHA), medium severity/confidence thresholds
  • frizbee.yml — uses stacklok/frizbee-action@v0.0.5 (pinned to SHA), check-only mode with fail on unpinned

Design decision

zizmor and frizbee run unconditionally — unlike actionlint/govulncheck which have run-* boolean flags. Security checks should not be opt-out at the repo level.

Follow-up PRs (separate from this one)

  • Caller workflows (zizmor.yml + frizbee.yml) for all 15 repos that have actionlint callers
  • Pin fixes in agent, docs, prof, crypto repos for existing unpinned actions
  • Org-level ruleset requiring all three checks

Test plan

  • CI passes on this PR (actionlint + zizmor + frizbee all green)
  • Verify zizmor catches a deliberately introduced ${{github.event.issue.title}} injection
  • Verify frizbee catches a deliberately introduced unpinned action reference

🤖 Generated with Claude Code

Add two new reusable workflows alongside existing actionlint:
- zizmor: scans workflows for security vulnerabilities (injection risks,
  secret exposure, unsafe ${{}} expansion)
- frizbee: checks that all actions and container images are pinned to
  commit SHAs or image digests

Both run unconditionally in goCI.yml (no opt-out flags) and in the
workflows repo's own CI.

Also pins previously unpinned references:
- docker://rhysd/actionlint:latest → 1.7.11@sha256:digest
- actions/cache@v5 → @sha (v5.0.3) in goTest.yml and codeql-analysis.yml

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@tashian tashian requested a review from a team as a code owner March 3, 2026 00:52
@github-advanced-security
Copy link

This pull request sets up GitHub code scanning for this repository. Once the scans have completed and the checks have passed, the analysis results for this pull request branch will appear on this overview. Once you merge this pull request, the 'Security' tab will show more code scanning analysis results (for example, for the default branch). Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results. For more information about GitHub code scanning, check out the documentation.

tashian and others added 3 commits March 2, 2026 16:56
Add explicit `permissions: contents: read` to the zizmor and frizbee
job calls in ci.yml and goCI.yml to resolve zizmor's "overly broad
permissions" warnings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix template injection in docker-buildx-push.yml (cosign step)
- Fix spoofable bot-conditions in dependabot-auto-merge.yml
- Add .github/zizmor.yml with targeted ignores for intentional patterns
  (internal unpinned-uses, excessive-permissions on reusable callers)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Explain why each rule is suppressed to aid future reviewers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dopey
dopey previously approved these changes Mar 3, 2026
The frizbee-action requires GITHUB_TOKEN and doesn't have an 'action'
input. Set open_pr: false (we only want check mode) and pass the token
via env.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tashian and others added 5 commits March 2, 2026 17:25
- Pin google-github-actions/auth and setup-gcloud to SHAs in goreleaser.yml
- Normalize Docker image refs to index.docker.io format with digest
  (required by frizbee-action for proper pinning detection)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The frizbee-action Docker image (v0.0.5) bundles an older version of
frizbee that flags cosmetic comment differences as unpinned. Install
the CLI (v0.1.8) directly for consistent behavior with local runs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
code-scan.yml references codeql-analysis.yml within the same repo, so
use ./.github/workflows/ instead of the cross-repo @main ref. Removes
the corresponding unpinned-uses zizmor suppression.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The goreleaser.yml google-github-actions refs are now pinned to SHAs,
so the unpinned-uses suppressions are no longer needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add top-level permissions: contents: read to ci.yml, goCI.yml, and
sync-winget-fork.yml. Add security-events: write to code-scan.yml
and the goCI codeql job (required by CodeQL). Remove redundant
per-job permissions where they now inherit from the workflow level.

This eliminates every excessive-permissions finding, allowing us to
delete .github/zizmor.yml entirely — zero suppressed warnings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@tashian tashian merged commit 39cd0a7 into main Mar 3, 2026
7 checks passed
@tashian tashian deleted the carl/add-zizmor-frizbee branch March 3, 2026 01:41
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