Skip to content

Determine some more criteria for actions review #686

Open

Description

@potiuk

Following the discussion in #674 (comment)

Possible criteria:

Goal not criteria:

  • Reject actions with suspicious builds, e.g. those that use different dependencies than what the source implies (proposed by @dave2wave) — partially addressed by verify-action-build warnings

Rejected:

- [ ] Attestations

Maybe others?

I would love to hear what others think.

Activity

  1. potiuk commented on Apr 9, 2026

    @potiuk
    MemberAuthor

    I'd personally add [x] hash pinning and [x] Compatible licencing (even if optional and default is not-compatible). Possibly we should add some checks for the latter if the actions are used properly.

  2. potiuk commented on Apr 9, 2026

    @potiuk
    MemberAuthor

    Also I think good idea when we reject some action we should follow up with the 3rd party - to at least let them know they should fix things (or even create PR). That should be IMHO default behaviour when we reject things.

  3. dave2wave commented on Apr 9, 2026

    @dave2wave
    Member

    #683 is for discussion of what cooldown periods should be recommended.

  4. dave2wave commented on Apr 9, 2026

    @dave2wave
    Member

    What is the point of enforcing "compatible licensing"? Policy allows any build tool as long as it is unmodified.

  5. dave2wave commented on Apr 9, 2026

    @dave2wave
    Member
    • Reject actions with suspicious builds like those that use different dependencies than what the source implies.
  6. potiuk commented on Apr 9, 2026

    @potiuk
    MemberAuthor
    • Reject actions with suspicious builds like those that use different dependencies than what the source implies.

    I don't think this was "suspicious" - there is clear explanation on why it happened (and why it could have happened for others). The problem was (see my PR SonarSource/sonarqube-scan-action#228 ) was that their dependabot PRs did not have a check if dist was rebuilt and release was made after that without rebuiliding it with the new tools.

    This likely common pattern that might happen to others. Problem with rebuilding in dependabot PRs is that such dependabot PRs will always fail and will have to be manually updated - when such compiled javascript is committed to the repo. Or there must be another mechanism implemented to prevent the release if rebuild is not done (let's see what SonarQube will respond to my PR). So I think there is nothing "suspicious" about it - this is an innocent build/release pipeline bug.

  7. dave2wave commented on Apr 13, 2026

    @dave2wave
    Member

    One criteria would be to list which repositories are impacted by the approval. We have capability to survey periodically all repositories and provide an inventory. This inventory could be inverted to list out every use of an action along with its current pin. The users of the action should be able to help judge the correctness of any upgrade.

  8. ppkarwasz commented on Apr 17, 2026

    @ppkarwasz
    Member

    I was experimenting with using Ampel to automatically check how actions have been released during a Dependabot PR.

    For example aquasecurity/trivy-action now releases attestation that can be verified.

  9. potiuk commented on Apr 17, 2026

    @potiuk
    MemberAuthor

    Do you know how well it stacks against the actions we currently have in our "approved" list ?

  10. ppkarwasz commented on Apr 17, 2026

    @ppkarwasz
    Member

    I am working on it.

  11. ppkarwasz commented on Apr 19, 2026

    @ppkarwasz
    Member

    I perused an LLM to check which actions have additional authentication factors we could use. As it turns out aquasecurity/trivy-action seems the only one to publish an attestation.

    Thinking about it a little bit more, attestations don't seem to be very relevant here, since they can only attest that the action's distribution was build from the source. Unless I am mistaken, actions are always built locally and committed to the same commit that does source code changes.

    Actions with attestations (non-empty store)

    Only pypa/cibuildwheel has actual attestations — 44 entries covering wheel releases
    from v2.23.4 through v3.4.1. All other repos with an attestation store are empty.

    Note: attestations cover the published wheel packages, not the action source itself.

    Actions with attestations attached to the release

    Only aquasecurity/trivy-action seems to publish an attestation, which is no longer allowed.

    Actions with GPG-signed tags (verified=valid)

    Repository Tag
    1Password/load-secrets-action v4.0.0
    browser-actions/setup-firefox v1.7.1
    dorny/test-reporter v3.0.0
    erisu/license-checker-action v2.1.0
    ilammy/setup-nasm v1.5.2
    sbt/setup-sbt v1.1.22

    Notable findings

    • helm/chart-releaser-action has an annotated tag with reason=bad_cert — signed
      but the certificate is no longer trusted.
    • 9 repos use unsigned annotated tags: bazel-contrib/setup-bazel, biomejs/setup-biome,
      JetBrains/qodana-action, JustinBeckwith/linkinator-action, matlab-actions/run-tests,
      matlab-actions/setup-matlab, mozilla-actions/sccache-action, nwtgck/actions-netlify,
      pypa/cibuildwheel, runs-on/action.
    • The remaining 60+ actions use lightweight tags with no signing at all.
    • 2 entries (browser-actions/setup-geckodriver, damccorm/tag-ur-it) have no tag
      comment in action.yml and were not checked.
  12. potiuk commented on Apr 19, 2026

    @potiuk
    MemberAuthor

    Thinking about it a little bit more, attestations don't seem to be very relevant here, since they can only attest that the action's distribution was build from the source. Unless I am mistaken, actions are always built locally and committed to the same commit that does source code changes.

    Quite agree.

  13. potiuk commented on Apr 19, 2026

    @potiuk
    MemberAuthor

    I updated the issue to reflect the current state of proposed checks:

    Also @dave2wave

    • Reject actions with suspicious builds like those that use different dependencies than what the source implies.

    I think that really depends on the type of "issue" - but I would agree in general. I am continuously updating the "verify" action whenever we find an action that needs it - so this rule might also be pretty conditional. My idea is that if:

    a) we are able to explain what's going on
    b) there is no security risk

    Warning and action of addressing it (for example opening a PR or issue in action repository) might be better choice than blocking. In the verify script those things might cause "error" (this is what I did with lack of dist rebuilding after dependencies updated in #662 - is a good "middle ground" for those - they will be flagged with failing check, but from the output it will be clear if the only issue is because old dependencies were used to build it (which is a relatively common issue for those who implemented trivial dependabot upgrade check without running rebuild after.

  14. potiuk commented on Apr 19, 2026

    @potiuk
    MemberAuthor

    I also updated the issue to link to the appropriate PRs that implemented those checks already.

  15. potiuk commented on Apr 19, 2026

    @potiuk
    MemberAuthor

    Opened #743 to implement the binary download verification check.

    It scans Dockerfiles, action.yml run: blocks and referenced scripts for binary/script downloads (curl, wget, Invoke-WebRequest, Dockerfile ADD <url>, pipe-to-shell) and requires a detectable verification step nearby — sha*sum, shasum, openssl dgst, gpg --verify, cosign verify, slsa-verifier, gh attestation verify, minisign, ssh-keygen -Y verify, CertUtil -hashfile, Get-FileHash. Package-manager invocations (apt/apk/pip/npm/brew/cargo/…) are skipped since they bring their own integrity checks.

    Files that contain downloads but no verification patterns fail the run. The check recurses through composite nested actions (MAX_DEPTH=3, skipping trusted orgs actions/github) and is toggleable via --no-binary-download-check (on by default).

  16. dave2wave commented on Apr 19, 2026

    @dave2wave
    Member

    @potiuk

    Reject actions with suspicious builds like those that use different dependencies than what the source implies.
    I think that really depends on the type of "issue" - but I would agree in general. I am continuously updating the "verify" action whenever we find an action that needs it - so this rule might also be pretty conditional. My idea is that if:

    a) we are able to explain what's going on
    b) there is no security risk

    I think this is an overall goal and we will always find cases we decide to address by adding to verify-action-build. I would just remove it from the rule list.

  17. potiuk commented on Apr 19, 2026

    @potiuk
    MemberAuthor

    What is the point of enforcing "compatible licensing"? Policy allows any build tool as long as it is unmodified.

    Good question. I think in this case it really refers to "gradle" case - where at some point in time they added "mandatory" licence approval.

  18. potiuk commented on Apr 19, 2026

    @potiuk
    MemberAuthor

    @potiuk

    Reject actions with suspicious builds like those that use different dependencies than what the source implies.
    I think that really depends on the type of "issue" - but I would agree in general. I am continuously updating the "verify" action whenever we find an action that needs it - so this rule might also be pretty conditional. My idea is that if:
    a) we are able to explain what's going on
    b) there is no security risk

    I think this is an overall goal and we will always find cases we decide to address by adding to verify-action-build. I would just remove it from the rule list.

    I saw you modified - it - I moved it to a separate section.

  19. potiuk commented on May 7, 2026

    @potiuk
    MemberAuthor

    Adding one more proposed criterion based on #809:

    • Reject actions that ship pre-compiled native binaries (Go, Rust, C, etc.) in-tree without verifiable build provenance. The case-in-point is runs-on/action@v2.1.1: ~10 MB of UPX-packed Go binaries committed directly to the repo, run as root via a tiny index.js launcher. verify-action-build's JS-rebuild check only verifies the launcher, not the opaque binaries — so the action's actual code can't be reconciled with its source. An action in this shape should fail review unless upstream provides SLSA attestations (actions/attest-build-provenance) or a signed SHA256SUMS file we can verify against.

    Concrete follow-ups, with task estimates:

  20. potiuk commented on May 7, 2026

    @potiuk
    MemberAuthor

    cc: @ppkarwasz @dave2wave @raboof WDYT? This runs-on action sounds fishy

  21. dave2wave commented on May 7, 2026

    @dave2wave
    Member

    @gmcdonald was testing runs-on as it is a commercial product that may allow Cheaper GH Runners that can have consistent IP addresses.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions