ghtier

Open-source tooling

Open-source tools for securing GitHub organizations, Actions workflows and the software supply chain that runs through them. Each tool has a page on how it works under the hood, what it catches, how to run it locally and in CI, what leaves your machine when it runs, and where it falls short.

18 tools in 9 categories · ★ 138k stars between them · GitHub stats fetched 10 October 2026

Security tools are dependencies too. A scanner runs inside your CI with your token and often your secrets. In March 2026 the tags of aquasecurity/trivy-action were rewritten and the KICS GitHub Action was compromised in the same TeamPCP campaign. Pin scanner actions to a full SHA, check the checksum of every binary you download, and give the scanning job a read-only token.

Tools by category

Within each category, tools are listed by GitHub stars. Stars measure popularity, not quality, so read them next to the rating. Tools that also cover a category without being built for it are listed under it as "Also covers this".

Workflow analysis3

Static analysis of .github/workflows and action.yml files: script injection, dangerous triggers, excessive token permissions, unpinned uses.

  • zizmor★ 6.7kRated 5 of 5, Top pick
  • actionlint★ 4.3kRated 4 of 5, Recommended
  • poutine★ 523Rated 4 of 5, Recommended

Also covers this: CodeQL, Checkov, KICS

Action pinning1

Rewrite uses: references to full commit SHAs, keep them current, and check they still match.

  • pinact★ 1.2kRated 4 of 5, Recommended

Runner hardening1

Watch or restrict what a job does while it runs: outbound network, file tampering, and which token permissions it actually used.

Secret scanning1

Find credentials in code, git history, CI logs and artifacts, before or after they are pushed.

Also covers this: Checkov

Vulnerable dependencies2

Match the packages you ship against advisory databases such as OSV.dev, the GitHub Advisory Database and the NVD.

Malicious packages1

Look at what a package does rather than whether it has a CVE: install scripts, network calls, obfuscation, typosquats, sudden maintainer changes.

Code scanning (SAST)2

Pattern matching and dataflow analysis over your own source code.

  • Semgrep CE★ 17kRated 4 of 5, Recommended
  • CodeQL★ 10kRated 4 of 5, Recommended

IaC and container config6

Misconfigurations in Terraform, Kubernetes manifests, Dockerfiles and CI config, caught before they are applied.

Org and repo posture1

Check and enforce GitHub settings across an organization: branch protection, admins, 2FA, Actions policy, stale access.

Also covers this: Checkov

All tools

Sorted by GitHub stars by default. The rating is ghtier's own (see how the ratings work). Scorecard is the tool's own repository scored by OpenSSF Scorecard in its weekly public scan, out of 10. It measures how the project protects itself (branch protection, pinned dependencies, signed releases, token permissions), not how good its findings are. 11 of 18 repositories are in the scan.

Category

18 of 18 tools. Click a column to sort.

CategoryLicense
Gitleaks

Finds secrets in git history, files or stdin with regex, keyword and entropy rules.

Secret scanning★ 30kRated 5 of 5, Top pickn/aMITv8.30.1Mar 2026
Semgrep CE

Pattern-based code scanner whose rules look like the code they match.

Code scanning (SAST)★ 17kRated 4 of 5, Recommendedn/aLGPL-2.1Open corev1.180.0Oct 2026
Hadolint

Lints Dockerfiles against best-practice rules and runs ShellCheck on the shell script in every RUN instruction.

IaC and container config★ 12kRated 4 of 5, Recommended4.3GPL-3.0v2.15.1Jul 2026
OSV-Scanner

Matches packages from lockfiles, SBOMs and container images against the OSV.dev vulnerability database.

Vulnerable dependencies★ 11kRated 5 of 5, Top pick8.6Apache-2.0v2.6.0Sep 2026
npm audit

npm's built-in check of your dependency tree against the GitHub Advisory Database.

Vulnerable dependencies★ 10kRated 4 of 5, Recommended6.8Artistic-2.0v12.2.0Sep 2026
CodeQL

GitHub's semantic code analysis: code becomes a database, queries do interprocedural taint tracking.

Code scanning (SAST)★ 10kRated 4 of 5, Recommended5.8MITSource availablenone
Checkov

Scans Terraform, CloudFormation, Kubernetes, Helm, Dockerfiles, CI workflows and GitHub org settings for misconfigurations using Python and YAML policies.

IaC and container config★ 9.1kRated 5 of 5, Top pick7.0Apache-2.0Open core3.3.26Oct 2026
tfsec

Terraform-only static scanner that evaluates HCL with modules and variables. Its engine now lives in Trivy as trivy config.

IaC and container config★ 7kRated 1 of 5, Legacy4.7MITv1.28.14May 2025
zizmor

Static analysis for GitHub Actions workflows and action.yml files, written in Rust.

Workflow analysis★ 6.7kRated 5 of 5, Top pickn/aMITv1.30.1Sep 2026
OpenSSF Scorecard

Scores a repository's security practices 0 to 10 from about 18 automated checks.

Org and repo posture★ 5.7kRated 4 of 5, Recommended8.3Apache-2.0v5.5.0Apr 2026
TerrascanArchived

Archived Rego-based scanner for Terraform, CloudFormation, ARM, Kubernetes, Helm, Kustomize and Dockerfiles, formerly maintained by Tenable.

IaC and container config★ 5.2kRated 1 of 5, Legacyn/aApache-2.0v1.19.9Sep 2024
actionlint

Workflow linter that type-checks expressions and runs ShellCheck on run: scripts.

Workflow analysis★ 4.3kRated 4 of 5, Recommended3.6MITv1.7.12Mar 2026
Conftest

Tests any structured config file, including workflow YAML, Terraform and Kubernetes manifests, against Rego policies you write.

IaC and container config★ 3.3kRated 4 of 5, Recommended7.0n/av0.71.1Oct 2026
KICS

Runs Rego queries against Terraform, CloudFormation, Kubernetes, Dockerfiles, Ansible, GitHub workflows and other IaC to find misconfigurations.

IaC and container config★ 2.7kRated 3 of 5, Situationaln/aApache-2.0v2.2.0Sep 2026
Harden-Runner

Runner agent from StepSecurity that records and can block outbound network calls, file tampering and processes per job.

Runner hardening★ 1.3kRated 4 of 5, Recommended7.8Apache-2.0Open corev2.22.1Oct 2026
pinact

Rewrites uses: references in workflows to full commit SHAs with the version kept as a comment.

Action pinning★ 1.2kRated 4 of 5, Recommendedn/aMITv5.0.0Sep 2026
poutine

Scans CI pipelines in a repo or a whole GitHub or GitLab org for supply-chain misconfigurations, with rules in Rego.

Workflow analysis★ 523Rated 4 of 5, Recommended7.6Apache-2.0v1.1.6May 2026
Socket CLI

Client for Socket, which analyzes what each package version does to spot malware and risky behaviour.

Malicious packages★ 323Rated 4 of 5, Recommendedn/aMITOpen client, hosted servicev1.1.146

Putting it together: a PR security job

No single tool covers a pull request. This is one way to combine them in a single job, cheapest checks first. It is modelled on a production workflow that runs every scanner, posts one summary comment on the PR, and then fails in a final gate step.

#StageToolsFails the PR onNotes
1Release-age cooldownCustom scriptA new or changed dependency version published fewer than N days agoMalicious releases are usually reported and pulled quickly, so waiting a few days before adopting a new version skips most of them. Renovate (minimumReleaseAge), Dependabot (cooldown) and pnpm (minimumReleaseAge) can do this for you.
2Version pinningCustom scriptWildcard ranges or git dependencies without a commit (advisory at first)Checks the declared ranges in package.json and the lockfile, without installing anything.
3Known vulnerabilitiesnpm audit, OSV-ScannerAdvisories at or above your chosen severitynpm audit asks the registry. OSV-Scanner reads the lockfile and asks OSV.dev. They use overlapping but different data, so running both catches more.
4ReachabilityOSV-ScannerNothing on its own. It only suppresses findingsDrops findings for packages that are not in the artifact you deploy, such as dev-only tooling, and records each decision as an OpenVEX statement.
5Workflow analysiszizmor, actionlintFindings in .github/workflows and action.ymlTemplate injection, pull_request_target misuse, unpinned actions, credential persistence. Run offline in PRs and keep online audits for a scheduled job.
6Code scanningSemgrep CE, CodeQLRule matches in changed codeSemgrep with the p/ci ruleset and metrics turned off is a fast default. CodeQL goes deeper where you can run it.
7SecretsGitleaksAny match not in the baseline or ignore fileCheck out with fetch-depth: 0 so the scan sees every commit in the PR, not only the last one. Redact matches in logs.
8Malicious packagesSocket CLIInstall scripts, network access, obfuscation or known malware in new dependenciesCatches what has no CVE yet. Socket needs an API key, so make the step skip with a warning when the secret is missing (it is on fork PRs).
9IaC and pipelineCheckov, poutineMisconfigured Terraform, Dockerfiles and build pipelinesOpt-in per repository. Only worth the minutes where there is IaC or a complex release pipeline.
10GateCustom scriptAny blocking stage aboveEvery scanner runs with continue-on-error so one failure doesn't hide the others. A PR comment summarizes them, then a single last step fails the check.

A trimmed version of the job. Every scanner step uses continue-on-error, so its outcome records the result while the job keeps going, and the last step decides. Tools are installed at fixed versions, and downloaded binaries are checked against the release's checksum file.

name: Security (PR)

on:
  pull_request:

permissions:
  contents: read

concurrency:
  group: security-pr-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@<sha> # v7.0.1
        with:
          fetch-depth: 0              # gitleaks needs the PR's commits, not just the tip
          persist-credentials: false

      - name: Install scanners at pinned versions
        env:
          OSV_VERSION: "2.6.0"
          OSV_SHA256: "<sha256 of osv-scanner_linux_amd64 from the release's SHA256SUMS>"
          GITLEAKS_VERSION: "8.30.1"
          GITLEAKS_SHA256: "<sha256 of the linux_x64 tarball from the release's checksums.txt>"
        run: |
          set -euo pipefail
          pip install --user "zizmor==1.30.1" "semgrep==1.180.0"
          curl -sSLo osv-scanner "https://github.com/google/osv-scanner/releases/download/v${OSV_VERSION}/osv-scanner_linux_amd64"
          echo "${OSV_SHA256}  osv-scanner" | sha256sum -c -
          curl -sSLo gitleaks.tgz "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz"
          echo "${GITLEAKS_SHA256}  gitleaks.tgz" | sha256sum -c -
          tar -xzf gitleaks.tgz gitleaks
          sudo install -m755 osv-scanner gitleaks /usr/local/bin/

      # Nothing is installed from the project: every scanner reads the lockfile or the source.

      - name: npm audit
        id: audit
        continue-on-error: true
        run: npm audit --package-lock-only --audit-level=high

      - name: OSV-Scanner
        id: osv
        continue-on-error: true
        run: osv-scanner scan -L package-lock.json

      - name: zizmor
        id: zizmor
        continue-on-error: true
        run: zizmor --no-online-audits --format plain .

      - name: Semgrep
        id: semgrep
        continue-on-error: true
        run: semgrep scan --config p/ci --metrics off --error .

      - name: Gitleaks
        id: gitleaks
        continue-on-error: true
        env:
          BASE_SHA: ${{ github.event.pull_request.base.sha }}
        run: gitleaks detect --source . --redact --log-opts="${BASE_SHA}..HEAD"

      - name: Security gate
        if: ${{ !cancelled() }}
        env:
          OUTCOMES: >-
            audit=${{ steps.audit.outcome }}
            osv=${{ steps.osv.outcome }}
            zizmor=${{ steps.zizmor.outcome }}
            semgrep=${{ steps.semgrep.outcome }}
            gitleaks=${{ steps.gitleaks.outcome }}
        run: |
          printf '%s\n' $OUTCOMES
          case " $OUTCOMES " in *=failure*) exit 1 ;; esac

Fork PRs get a read-only token and no secrets, so steps that need an API key (Socket) or write access (the PR comment) should skip cleanly instead of failing. The GitHub Actions page covers why pull_request is the right trigger here and pull_request_target is not.

How the ratings work

The rating is an editorial judgement of how useful a tool is for its job today: accuracy, maintenance, how easy it is to run in CI, and how much works without a paid account. It is relative to the tool's category. A 4 for a niche linter and a 4 for a vulnerability scanner are not the same thing.

  • Rated 5 of 5, Top pickTop pickTop pick: The default choice for its job. Accurate, actively maintained, easy to run in CI, fully usable without a paid account.
  • Rated 4 of 5, RecommendedRecommendedRecommended: Worth running, with a real trade-off: more noise, narrower scope, heavier setup, or the best parts need an account.
  • Rated 3 of 5, SituationalSituationalSituational: Good for a specific need or as a second opinion. Smaller project or slower maintenance.
  • Rated 2 of 5, NicheNicheNiche: Mostly superseded or very narrow. Use it only if you have a specific reason.
  • Rated 1 of 5, LegacyLegacyLegacy: Archived or deprecated. Listed for reference. Plan a migration if you still run it.

Stars, licenses, last release and Scorecard scores are fetched from the GitHub API and the OpenSSF Scorecard API, not written by hand. They were last refreshed on 10 October 2026. Licenses are GitHub's detection of the repository license. Where a hosted service does the main work, the table says so under the license.