Skip to content

chore(ci): add zizmor workflow for github actions security analysis#9804

Merged
jdx merged 5 commits into
mainfrom
ci/add-zizmor
May 12, 2026
Merged

chore(ci): add zizmor workflow for github actions security analysis#9804
jdx merged 5 commits into
mainfrom
ci/add-zizmor

Conversation

@jdx

@jdx jdx commented May 12, 2026

Copy link
Copy Markdown
Owner

Adds zizmor to audit GitHub Actions workflows for security issues. Runs on push to main and on PRs that change .github/workflows/**. Fails CI on any finding.

🤖 Generated with Claude Code


Note

Medium Risk
Medium risk because it introduces a new required-style workflow check that can fail CI and adjusts GitHub Actions permissions/caching annotations, potentially impacting pipeline behavior.

Overview
Adds a new .github/workflows/zizmor.yml workflow that runs zizmor on pushes to main and on PRs that change workflow files, using minimal contents: read permissions and persist-credentials: false.

Updates existing CI workflows to align with the security audit: tightens test.yml permissions to contents: read, refactors the composite fetch-token action to pass the secret via an env var, and adds inline zizmor suppressions to specific cache steps (read-only or scoped keys) to address cache-poisoning warnings.

Reviewed by Cursor Bugbot for commit ba31bd8. Bugbot is set up for automated code reviews on this repo. Configure here.

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Note

Gemini is unable to generate a review for this pull request due to the file types involved not being currently supported.

Comment thread .github/workflows/zizmor.yml
@greptile-apps

greptile-apps Bot commented May 12, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds a zizmor GitHub Actions security audit workflow and hardens existing workflows to pass the audit. The changes touch only CI/workflow configuration — no product code is affected.

  • New zizmor.yml: Runs zizmorcore/zizmor-action on pushes to main and on PRs touching .github/workflows/**; uses advanced-security: false (no SARIF upload needed) and min-severity: high to gate only on high-severity findings.
  • fetch-token/action.yml: Replaces direct secret interpolation in a shell script with an env block, preventing the API secret from appearing in process listings.
  • test.yml, test-plugins.yml, test-vfox.yml: Drops the unused pull-requests: write permission from test.yml and annotates Rust/tool cache steps with targeted zizmor: ignore[cache-poisoning] comments where the justification (read-only or hash-scoped) is sound.

Confidence Score: 5/5

Safe to merge — all changes are CI-only hardening with no product code touched.

Every change is a security improvement or an accurately justified noise-suppression annotation. The pull-requests: write permission that was removed had no corresponding steps that needed it, so its removal is clean. The one gap (trigger paths not covering .github/actions/**) is a minor coverage hole, not a regression.

zizmor.yml — the pull_request path filter only covers .github/workflows/**, so composite-action-only changes won't trigger the audit.

Important Files Changed

Filename Overview
.github/workflows/zizmor.yml New workflow auditing GitHub Actions for security issues; advanced-security: false correctly avoids needing security-events: write; trigger paths omit .github/actions/**
.github/actions/fetch-token/action.yml Security hardening: secret interpolated directly in shell script replaced with an env var, preventing secret exposure in process listings
.github/workflows/test.yml Drops unused pull-requests: write permission (no PR-comment steps exist), adds zizmor: ignore annotations on Rust cache steps with clear justifications
.github/workflows/test-plugins.yml Adds zizmor: ignore[cache-poisoning] to the read-only Rust cache step; justification (save-if: false) is accurate
.github/workflows/test-vfox.yml Adds zizmor: ignore[cache-poisoning] to the tool-install cache step; justification (hash-scoped key) is accurate

Fix All in Claude Code

Reviews (5): Last reviewed commit: "style(ci): prettier fixup on zizmor.yml" | Re-trigger Greptile

Comment thread .github/workflows/zizmor.yml
@github-actions

github-actions Bot commented May 12, 2026

Copy link
Copy Markdown

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.6 x -- echo 19.7 ± 1.0 17.6 23.8 1.00
mise x -- echo 20.6 ± 2.5 18.3 36.8 1.05 ± 0.14

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.6 env 19.2 ± 0.9 17.4 24.6 1.00
mise env 19.7 ± 1.2 17.7 25.9 1.03 ± 0.08

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.6 hook-env 20.5 ± 1.2 18.6 29.1 1.00
mise hook-env 20.7 ± 1.0 18.8 25.0 1.01 ± 0.07

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.6 ls 16.7 ± 0.9 14.9 22.6 1.00
mise ls 17.0 ± 0.9 15.3 22.6 1.02 ± 0.08

xtasks/test/perf

Command mise-2026.5.6 mise Variance
install (cached) 126ms 127ms +0%
ls (cached) 58ms 58ms +0%
bin-paths (cached) 62ms 63ms -1%
task-ls (cached) 501ms 490ms +2%

@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f64b1c7. Configure here.

Comment thread .github/workflows/zizmor.yml Outdated
push:
branches: [main]
pull_request:
paths: ['.github/workflows/**']

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Zizmor PR trigger misses composite action file changes

Low Severity

The pull_request path filter only includes '.github/workflows/**', but this PR itself fixes a security issue in .github/actions/fetch-token/action.yml — a composite action that zizmor also audits. PRs that only modify files under .github/actions/** won't trigger the zizmor check, so security regressions in composite actions won't be caught until they land on main.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit f64b1c7. Configure here.

jdx and others added 4 commits May 12, 2026 12:23
Fix the 20 high-severity findings reported by zizmor so the new
workflow can serve as a useful CI gate:

- template-injection: move user-controllable interpolations
  (`${{ inputs.* }}`, `${{ github.ref_name }}`, `${{ vars.* }}`)
  into `env:` blocks and reference via shell vars in:
  fetch-token, copr-publish, npm-publish, ppa-publish, docker.
- cache-poisoning: annotate `Swatinem/rust-cache` and
  `actions/cache` steps that already gate writes via `save-if`
  (or use scoped cache keys) with inline zizmor ignores.
- excessive-permissions: replace vestigial
  `pull-requests: write` at the test.yml workflow level with
  `contents: read` (no jobs actually need pull-requests).

Set `min-severity: high` on the zizmor action so the gate only
fails on errors; remaining medium/low/info findings can be
addressed incrementally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jdx jdx force-pushed the ci/add-zizmor branch from f64b1c7 to 2b34594 Compare May 12, 2026 17:24
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jdx jdx enabled auto-merge (squash) May 12, 2026 17:35
@jdx jdx merged commit b825901 into main May 12, 2026
49 of 51 checks passed
@jdx jdx deleted the ci/add-zizmor branch May 12, 2026 17:54
mise-en-dev added a commit that referenced this pull request May 13, 2026
### 🐛 Bug Fixes

- **(backend)** use runtime paths for backend bin dirs by @risu729 in
[#9606](#9606)
- **(ci)** preserve vendor/aqua-registry/ in PPA publish workflow by
@jdx in [#9782](#9782)
- **(ci)** set UTF-8 locale in e2e Docker image by @jdx in
[#9820](#9820)
- **(ci)** pass UTF-8 locale through to e2e tests by @jdx in
[#9823](#9823)
- **(conda)** dedup repodata by archive identifier instead of URL by
@jdx in [#9831](#9831)
- **(github)** use default shell for credential command by @risu729 in
[#9664](#9664)
- **(settings)** distinguish unset known settings from unknown ones by
@jdx in [#9818](#9818)
- **(upgrade)** remove completed progress jobs to prevent duplicate
output by @jdx in [#9779](#9779)
- **(vfox)** resolve GitHub token lazily inside Lua plugins by @jdx in
[#9816](#9816)

### 🚜 Refactor

- **(config)** separate core and backend tool options by @risu729 in
[#9753](#9753)
- **(schema)** reuse env directive property schemas by @risu729 in
[#9651](#9651)

### 📚 Documentation

- **(aliases)** fix Aliased Versions example and drop stale asdf callout
by @jdx in [#9830](#9830)

### ⚡ Performance

- **(aqua)** use phf for baked registry lookups by @risu729 in
[#9763](#9763)
- **(task)** cache per-file content hashes for
source_freshness_hash_contents by @jdx in
[#9819](#9819)

### 🧪 Testing

- **(e2e)** pin aube to known-good version in npm package_manager test
by @jdx in [#9794](#9794)

### 📦 Registry

- replace unsupported exe options by @risu729 in
[#9587](#9587)
- update pi by @garysassano in
[#9792](#9792)

### Chore

- **(ci)** use non-large runners for release builds by @jdx in
[#9786](#9786)
- **(ci)** compare registry PRs from fork point by @risu729 in
[#9643](#9643)
- **(ci)** make build-copr.sh the single source of truth for COPR
chroots by @jdx in [#9788](#9788)
- **(ci)** use crates.io trusted publishing in release-plz by @jdx in
[#9793](#9793)
- **(ci)** remove autofix.ci workflow by @jdx in
[#9801](#9801)
- **(ci)** restore -large runner for Linux release builds by @jdx in
[#9815](#9815)
- **(ci)** add zizmor workflow for github actions security analysis by
@jdx in [#9804](#9804)
- **(ci)** assert mise run render produces no diff by @jdx in
[#9803](#9803)
- **(copr)** publish EL9 builds via centos-stream+epel-next-9 chroot by
@jdx in [#9787](#9787)

### Ci

- remove pull_request_target workflow by @jdx in
[#9799](#9799)
- remove caching from publishing workflows by @jdx in
[#9800](#9800)

### Security

- reject shell metacharacters in version strings and CI inputs by @jdx
in [#9814](#9814)

## 📦 Aqua Registry Updates

### New Packages (11)

- [`Code-Hex/Neo-cowsay`](https://github.com/Code-Hex/Neo-cowsay)
-
[`SonarSource/sonarqube-cli`](https://github.com/SonarSource/sonarqube-cli)
- [`earendil-works/pi`](https://github.com/earendil-works/pi)
- [`hylo-lang/hylo-new`](https://github.com/hylo-lang/hylo-new)
- [`jfernandez/bpftop`](https://github.com/jfernandez/bpftop)
- [`modem-dev/hunk`](https://github.com/modem-dev/hunk)
- [`npm/cli`](https://github.com/npm/cli)
- [`racket/racket/minimal`](https://github.com/racket/racket)
- [`slackapi/slack-cli`](https://github.com/slackapi/slack-cli)
- [`vectordotdev/vector`](https://github.com/vectordotdev/vector)
- [`wasilibs/go-yamllint`](https://github.com/wasilibs/go-yamllint)

### Updated Packages (10)

- [`DataDog/pup`](https://github.com/DataDog/pup)
- [`aquasecurity/trivy`](https://github.com/aquasecurity/trivy)
- [`astral-sh/uv`](https://github.com/astral-sh/uv)
- [`caarlos0/svu`](https://github.com/caarlos0/svu)
-
[`cargo-bins/cargo-binstall`](https://github.com/cargo-bins/cargo-binstall)
- [`foundry-rs/foundry`](https://github.com/foundry-rs/foundry)
- [`gastownhall/beads`](https://github.com/gastownhall/beads)
-
[`gruntwork-io/terragrunt`](https://github.com/gruntwork-io/terragrunt)
- [`pnpm/pnpm`](https://github.com/pnpm/pnpm)
- [`santosr2/TerraTidy`](https://github.com/santosr2/TerraTidy)
3PeatVR pushed a commit to 3PeatVR/mise that referenced this pull request May 14, 2026
### 🐛 Bug Fixes

- **(backend)** use runtime paths for backend bin dirs by @risu729 in
[jdx#9606](jdx#9606)
- **(ci)** preserve vendor/aqua-registry/ in PPA publish workflow by
@jdx in [jdx#9782](jdx#9782)
- **(ci)** set UTF-8 locale in e2e Docker image by @jdx in
[jdx#9820](jdx#9820)
- **(ci)** pass UTF-8 locale through to e2e tests by @jdx in
[jdx#9823](jdx#9823)
- **(conda)** dedup repodata by archive identifier instead of URL by
@jdx in [jdx#9831](jdx#9831)
- **(github)** use default shell for credential command by @risu729 in
[jdx#9664](jdx#9664)
- **(settings)** distinguish unset known settings from unknown ones by
@jdx in [jdx#9818](jdx#9818)
- **(upgrade)** remove completed progress jobs to prevent duplicate
output by @jdx in [jdx#9779](jdx#9779)
- **(vfox)** resolve GitHub token lazily inside Lua plugins by @jdx in
[jdx#9816](jdx#9816)

### 🚜 Refactor

- **(config)** separate core and backend tool options by @risu729 in
[jdx#9753](jdx#9753)
- **(schema)** reuse env directive property schemas by @risu729 in
[jdx#9651](jdx#9651)

### 📚 Documentation

- **(aliases)** fix Aliased Versions example and drop stale asdf callout
by @jdx in [jdx#9830](jdx#9830)

### ⚡ Performance

- **(aqua)** use phf for baked registry lookups by @risu729 in
[jdx#9763](jdx#9763)
- **(task)** cache per-file content hashes for
source_freshness_hash_contents by @jdx in
[jdx#9819](jdx#9819)

### 🧪 Testing

- **(e2e)** pin aube to known-good version in npm package_manager test
by @jdx in [jdx#9794](jdx#9794)

### 📦 Registry

- replace unsupported exe options by @risu729 in
[jdx#9587](jdx#9587)
- update pi by @garysassano in
[jdx#9792](jdx#9792)

### Chore

- **(ci)** use non-large runners for release builds by @jdx in
[jdx#9786](jdx#9786)
- **(ci)** compare registry PRs from fork point by @risu729 in
[jdx#9643](jdx#9643)
- **(ci)** make build-copr.sh the single source of truth for COPR
chroots by @jdx in [jdx#9788](jdx#9788)
- **(ci)** use crates.io trusted publishing in release-plz by @jdx in
[jdx#9793](jdx#9793)
- **(ci)** remove autofix.ci workflow by @jdx in
[jdx#9801](jdx#9801)
- **(ci)** restore -large runner for Linux release builds by @jdx in
[jdx#9815](jdx#9815)
- **(ci)** add zizmor workflow for github actions security analysis by
@jdx in [jdx#9804](jdx#9804)
- **(ci)** assert mise run render produces no diff by @jdx in
[jdx#9803](jdx#9803)
- **(copr)** publish EL9 builds via centos-stream+epel-next-9 chroot by
@jdx in [jdx#9787](jdx#9787)

### Ci

- remove pull_request_target workflow by @jdx in
[jdx#9799](jdx#9799)
- remove caching from publishing workflows by @jdx in
[jdx#9800](jdx#9800)

### Security

- reject shell metacharacters in version strings and CI inputs by @jdx
in [jdx#9814](jdx#9814)

## 📦 Aqua Registry Updates

### New Packages (11)

- [`Code-Hex/Neo-cowsay`](https://github.com/Code-Hex/Neo-cowsay)
-
[`SonarSource/sonarqube-cli`](https://github.com/SonarSource/sonarqube-cli)
- [`earendil-works/pi`](https://github.com/earendil-works/pi)
- [`hylo-lang/hylo-new`](https://github.com/hylo-lang/hylo-new)
- [`jfernandez/bpftop`](https://github.com/jfernandez/bpftop)
- [`modem-dev/hunk`](https://github.com/modem-dev/hunk)
- [`npm/cli`](https://github.com/npm/cli)
- [`racket/racket/minimal`](https://github.com/racket/racket)
- [`slackapi/slack-cli`](https://github.com/slackapi/slack-cli)
- [`vectordotdev/vector`](https://github.com/vectordotdev/vector)
- [`wasilibs/go-yamllint`](https://github.com/wasilibs/go-yamllint)

### Updated Packages (10)

- [`DataDog/pup`](https://github.com/DataDog/pup)
- [`aquasecurity/trivy`](https://github.com/aquasecurity/trivy)
- [`astral-sh/uv`](https://github.com/astral-sh/uv)
- [`caarlos0/svu`](https://github.com/caarlos0/svu)
-
[`cargo-bins/cargo-binstall`](https://github.com/cargo-bins/cargo-binstall)
- [`foundry-rs/foundry`](https://github.com/foundry-rs/foundry)
- [`gastownhall/beads`](https://github.com/gastownhall/beads)
-
[`gruntwork-io/terragrunt`](https://github.com/gruntwork-io/terragrunt)
- [`pnpm/pnpm`](https://github.com/pnpm/pnpm)
- [`santosr2/TerraTidy`](https://github.com/santosr2/TerraTidy)
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