mrkeyoor.com_
Tue 01 Sept 17:44 UTC
Dev Toolsevaluationupdated 26 Aug 2026

zizmor review

zizmor is a security-focused static analyzer for GitHub Actions, Dependabot configuration, and experimental pre-commit inputs. It reads CI files without executing them and reports risky permissions, expression injection, unpinned actions, credential exposure, confusing refs, and other mistakes that can turn a pull request into code execution.

+34stars / 7d
Verdict

Our zizmor install took 352 seconds, while the build needed only 5 seconds and pip-audit found 0 known vulnerabilities in the installed Python packages. Use a packaged binary instead of building this source checkout unless you are contributing, then run the regular persona on every workflow change. Pair it with actionlint, review all fixes, and configure SARIF branch rules so a green upload job cannot hide real findings.

We ran it

Lab card: what happened when we ran zizmorScreenshot of zizmor (docs.zizmor.sh)
Install✓ · 352s34 packages · 62 MB
Build✓ · 5s
Testsn/ano test script
Known vulns0(pip-audit)
Repo657 files~55,578 lines of source · 3.9 MB · 11 CI workflows · Dockerfile

Answers from our run

Does zizmor build from source?

Dependencies installed in 352 seconds (34 packages), and the build succeeded in 5 seconds. We cloned commit 11bbf7e into a clean Debian container with 3 CPUs and no project-specific setup.

Does zizmor have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Does zizmor have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use zizmor?

Teams whose pipelines live mainly in GitLab CI, CircleCI, Jenkins, or another non-GitHub format: the documented audits center on GitHub Actions, Dependabot, and pre-commit.

What are the alternatives to zizmor?

actionlint, Secure Repo, CodeQL. Our zizmor install took 352 seconds, while the build needed only 5 seconds and pip-audit found 0 known vulnerabilities in the installed Python packages.

Setup3/5Many binary options, but our source install took 352 seconds
Docs5/5Detailed audits, modes, fixes, ignores, exits, and CI examples
Community5/56,394 stars with same-day push and active technical issues
Maturity4/5Broad stable audits, with experimental inputs and known gaps

Who it’s for

GitHub maintainers who want CI security checks in pull requests or before commits.
Security reviewers auditing workflow triggers, permissions, third-party actions, and secret handling.
Teams that need plain, JSON, SARIF, or GitHub annotation output from one scanner.
Developers who want safe automatic fixes for a subset of findings and explicit suppressions for accepted risks.

Who it’s NOT for

Teams whose pipelines live mainly in GitLab CI, CircleCI, Jenkins, or another non-GitHub format: the documented audits center on GitHub Actions, Dependabot, and pre-commit.
Operators expecting every check to work offline: remote collection and several ref, action, and vulnerability audits need GitHub API access.
Users treating a green SARIF job as proof of no findings: the integration guide says SARIF mode exits 0 when findings exist unless an internal error occurs.
Auditors who require complete coverage of reusable-workflow references today: issue 2324 reports that two ref audits miss job-level uses entries.
Organizations with nonstandard self-hosted runner labels that expect exact classification: issue 286 says the current audit relies on the self-hosted label.

Setup reality

Our sandbox install succeeded in 352 seconds, adding 34 packages and using 62 MB. The build then passed in 5 seconds, and pip-audit found 0 known vulnerabilities. The harness found no test script or target, so it skipped tests.

Most users should install a packaged binary through Homebrew, PyPI, crates.io, Docker, Conda, Nix, or a distribution package. Local files work without credentials; remote repositories and online audits need a GitHub token, with private repos requiring suitable read access.

The repository is Rust with Python packaging support, while our harness classified the install path as Python. Its 3.9 MB checkout has 657 files and about 55,578 source lines. Online results depend on GitHub API availability, and SARIF output needs a separate code-scanning rule if findings should block merges.

Security rules target the dangerous parts of workflow YAML

zizmor statically inspects GitHub Actions workflows and actions, Dependabot files, and experimental pre-commit configuration. Its audit list covers template injection, excessive permissions, persisted credentials, unpinned actions and images, impostor commits, ref confusion, secret inheritance, self-hosted runners, cache poisoning, and unsafe release patterns. It reads definitions without executing the workflow, which makes it suitable for pull requests containing untrusted changes.

The distinction from a general YAML linter matters. A workflow can be syntactically valid and still run attacker-controlled text in a privileged shell, leave checkout credentials on disk, or grant more token scope than a job needs. zizmor models GitHub concepts and points findings at the relevant span. Use actionlint beside it for expression and syntax checking; neither tool replaces the other.

Packaged installs avoid a 352-second source setup

Users can install zizmor through Homebrew, PyPI, crates.io, Docker, Conda, Nix, and several Linux package repositories. The docs warn ordinary users away from direct source installs and call release binaries best effort because libc compatibility can vary. PyPI wheels are also offered on a best-effort basis, so a pinned package-manager path is preferable to grabbing an arbitrary executable.

The source project is Rust, with Python packaging that exposes the command through common Python installers. Cargo users are told to pass --locked so dependency resolution matches upstream testing. A team standardizing the scanner should pin both the zizmor version and its delivery channel. That prevents a developer laptop, pre-commit hook, and CI runner from silently evaluating the same workflow with different rule sets.

What happened when we ran it

Our sandbox installed commit 11bbf7e in 352 seconds. That step added 34 packages and occupied 62 MB, while the build finished successfully in 5 seconds. Pip-audit reported 0 known vulnerabilities in the installed Python packages. The checkout itself was 3.9 MB, with 657 files and approximately 55,578 lines of source.

The lab did not run tests because its Python-oriented harness found no test script or target. The repository has Rust test code nested under its crates, but there was no top-level tests directory in our signal scan. This result is therefore install and build evidence, not a claim that the project's test suite passed. We also found 11 CI workflow files and a Dockerfile.

The 352-second install is the main local cost in our run, especially compared with the 5-second build. A precompiled package should remove much of that contributor-oriented work for ordinary use. We did not measure scan speed, finding accuracy, or false-positive rate, so teams should trial the tool against several known-safe workflows and a few intentionally vulnerable fixtures before making it a required check.

Offline mode skips audits that need GitHub facts

Local workflow files can be scanned with no token. Without GH_TOKEN, GITHUB_TOKEN, or ZIZMOR_GITHUB_TOKEN, the command defaults to offline mode. Remote repository inputs and online audits need API access. Private repositories also require read permission appropriate to the token type, while a GitHub Actions integration may need contents: read and other permissions for SARIF upload.

Online checks add useful facts, such as whether a commit belongs to an expected repository or whether an action reference is stale. They also add network and rate-limit dependencies. The --no-online-audits option can fetch remote inputs while skipping online rule work. Security teams should decide which findings must remain available during a GitHub outage and document that offline output is a reduced scan, not equivalent coverage.

SARIF needs policy because findings still exit zero

zizmor emits terminal text, versioned JSON, SARIF, and GitHub workflow annotations. SARIF fits GitHub code scanning, while annotations work without Advanced Security. The integration guide warns that GitHub displays only 10 annotations from one step, so longer result sets remain in logs. JSON is the better input when another system needs every finding and its severity, confidence, location, and suggested fixes.

SARIF mode intentionally returns exit code 0 when findings exist. Consumers expect results inside the SARIF file and reserve nonzero status for producer errors. A workflow can therefore show green after uploading serious alerts. Repositories that want blocking behavior need code-scanning rulesets, while command-line integrations can use zizmor's severity-based exit codes. That setup detail belongs in the acceptance test, not in a later incident review.

Automatic fixes are limited and still require review

The regular persona aims for high-signal findings. Pedantic and auditor modes widen the net for style concerns or security review. Teams can filter by severity and confidence, suppress one line with an inline comment, ignore paths in zizmor.yml, remap severity, or disable a rule. The docs caution that disabling a rule hides even the suppressed count, making narrow ignores easier to audit later.

Safe auto-fixes are available for a subset of findings, and unsafe fixes require an explicit mode. Fixes modify local files in place, do not apply to remote inputs, and may need GitHub access to choose a current commit. Review the diff even in safe mode because workflow permissions and pinned refs control deployment authority. An automatic edit can be mechanically sound while conflicting with an organization's release policy.

Active development still leaves edge-case gaps

GitHub recorded a push on August 26, 2026. Release v1.29.0 arrived on August 1, and the repository had 6,394 stars with 163 combined issues and pull requests when fetched. The release added experimental pre-commit scanning and an insecure URL rule, while changing ref and image pinning responsibilities. Frequent rule changes are a reason to pin versions and read release notes.

Issue 2324 reports that ref-version-mismatch and stale-action-refs skip job-level reusable-workflow calls. Issue 2321 describes a confusing diagnostic when a tag and branch share a name. Issue 286 tracks self-hosted runners that omit the usual label. These are bounded gaps, not reasons to dismiss the scanner. They are reasons to keep human workflow review and avoid treating one clean zizmor result as proof that CI is safe.

Alternatives

ProjectWhat it isPick it when
actionlint gh↗A fast static checker for GitHub Actions syntax, expressions, and shell integration.pick this instead when workflow correctness and syntax errors are the main concern rather than security audits.
Secure RepoA tool that applies and coordinates GitHub Actions security hardening changes.pick this instead when you want guided repository hardening and StepSecurity integration rather than a local analyzer alone.
CodeQLGitHub's query framework for code scanning across application languages.pick this instead when the application source is the main target; use both when code and workflows need separate security coverage.

What people are saying

  1. [github-trending] zizmorcore/zizmor

Sources

  1. zizmor README
  2. zizmor installation guide
  3. zizmor usage guide
  4. zizmor integrations guide
  5. zizmor v1.29.0 release
  6. Issue 2324: reusable-workflow audit gap
  7. Issue 286: self-hosted runner labels

More dev tools reviews

workmux · v2rayNG · SecLists · hashcat · eslint · fastfetch · the whole board →