New audit: unpinned-tools

I've been thinking about this one recently in the context of trivy's [ongoing issues](https://github.com/aquasecurity/trivy/discussions/10425): it's good to hash-pin actions, but a lot of actions internally just fetch whatever "latest" version of a binary is available as a GitHub release. Consequently, even hash-pinned actions can be a vector for distributing malicious builds, since "latest" is always a mutable concept (and without immutable releases, previous tags may also be mutable). So, we should have an audit for this. Like with `cache-poisoning`, we'll probably want to use the coordinate API and start with a fixed set of well-known actions that are known to install binaries. Some good initial candidates: - `aquasecurity/trivy-action` - `taiki-e/install-action` Each of these will require slightly different coordinates/nuances. For example `trivy-action` has the `version:` input, but `version: latest` should still be flagged. In contrast `install-action` has no `version:` input, but the `tool:` input should have a `@version` suffix. Those are the relatively easy cases; it might also be nice to be able to flag actions like `astral-sh/setup-uv`, but the wrinkle with those is that they also support a `version-file` input and by policy zizmor doesn't attempt to parse files outside of workflows/actions/etc. for supporting information. So `setup-uv` and similar would be subject to higher false positive rates. There are also actions that never make sense to flag, like our own `zizmor-action`: `zizmor-action` has a `version:` input that defaults to `latest`, but under the hood `latest` is actually hash-pinned within the repo itself and is therefore immutable and changes only when the action itself changes. By way of example, here would be some steps that an audit here should flag: ```yaml - uses: aquasecurity/trivy-action@whatever # FLAG: no `version:` input - uses: taiki-e/install-action@whatever with: tool: cargo-hack # FLAG: no `@version` prefix - uses

GitHubToolAISource
0Sign in to voteCopy link

FL score

62

out of 100

Verdict

VALIDATE

medium confidence

Competition

No competitor data yet

Trend

No signal yet

Add a GitHub Actions audit rule to detect when workflows use actions that fetch unpinned binary versions, creating supply chain attack vectors even when the action itself is hash-pinned.

The pain

Security teams using GitHub Actions face a blind spot: they can hash-pin an action to a specific commit, but that action may internally download the latest version of a tool (like Trivy or Cargo), which is mutable and can be replaced with malicious code. This defeats the purpose of pinning and creates a supply chain vulnerability that existing scanners do not detect.

The gap

No current security scanning tool (Trivy, SAST scanners, or GitHub's native checks) flags this pattern. The gap exists because it requires understanding both the action's inputs and the internal behavior of specific well-known actions. Zizmor already has the coordinate API and audit framework to add this, but the rule does not yet exist.

Build angle

Start with two high-confidence actions (trivy-action and install-action) where the unpinned pattern is clear and unambiguous. Build action-specific coordinate logic to detect missing version inputs or unversioned tool suffixes. Accept that some actions (setup-uv) will have higher false positive rates due to file-based version inputs that zizmor cannot parse. Ship the audit as a new rule in zizmor, document the limitations, and iterate based on user feedback.

Strengths

  • Problem is concrete and reproducible: hash-pinned actions with unpinned binary fetches are a real supply chain risk.
  • Fits naturally into zizmor's existing architecture and audit framework, requiring no new infrastructure.
  • Addresses a gap that no competitor currently fills, giving zizmor a differentiation point.
  • Can start narrow (two actions) and expand incrementally as more actions are analyzed.
  • Aligns with growing security industry focus on supply chain attacks and software provenance.

Risks

  • Market is small: only teams using GitHub Actions and caring about supply chain security will benefit, and many may not know this risk exists.
  • Feature is relatively simple to copy once published, so competitive moat is weak.
  • Requires ongoing maintenance as new actions emerge and existing actions change their behavior.
  • False positive rate may be high for actions that support file-based version inputs, reducing user trust.
  • Adoption depends entirely on zizmor's user base and mindshare; if zizmor does not grow, this feature reaches few people.
  • Some actions (like zizmor-action itself) require special-case logic to avoid false positives, increasing complexity.
  • Users may not be willing to pay for this as a standalone product; it only has value as part of a larger security scanning tool.

Questions about this idea?

FlyBot reads the scoring and gives you a second opinion on “New audit: unpinned-tools”.

Open FlyBot