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
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
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.
- Harden-Runner★ 1.3kRated 4 of 5, Recommended
Secret scanning1
Find credentials in code, git history, CI logs and artifacts, before or after they are pushed.
- Gitleaks★ 30kRated 5 of 5, Top pick
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.
- OSV-Scanner★ 11kRated 5 of 5, Top pick
- npm audit★ 10kRated 4 of 5, Recommended
Malicious packages1
Look at what a package does rather than whether it has a CVE: install scripts, network calls, obfuscation, typosquats, sudden maintainer changes.
- Socket CLI★ 323Rated 4 of 5, Recommended
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.
- OpenSSF Scorecard★ 5.7kRated 4 of 5, Recommended
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.
18 of 18 tools. Click a column to sort.
| Category | License | |||||
|---|---|---|---|---|---|---|
| Gitleaks Finds secrets in git history, files or stdin with regex, keyword and entropy rules. | Secret scanning | ★ 30k | Rated 5 of 5, Top pick | n/a | MIT | v8.30.1Mar 2026 |
| Semgrep CE Pattern-based code scanner whose rules look like the code they match. | Code scanning (SAST) | ★ 17k | Rated 4 of 5, Recommended | n/a | LGPL-2.1Open core | v1.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 | ★ 12k | Rated 4 of 5, Recommended | 4.3 | GPL-3.0 | v2.15.1Jul 2026 |
| OSV-Scanner Matches packages from lockfiles, SBOMs and container images against the OSV.dev vulnerability database. | Vulnerable dependencies | ★ 11k | Rated 5 of 5, Top pick | 8.6 | Apache-2.0 | v2.6.0Sep 2026 |
| npm audit npm's built-in check of your dependency tree against the GitHub Advisory Database. | Vulnerable dependencies | ★ 10k | Rated 4 of 5, Recommended | 6.8 | Artistic-2.0 | v12.2.0Sep 2026 |
| CodeQL GitHub's semantic code analysis: code becomes a database, queries do interprocedural taint tracking. | Code scanning (SAST) | ★ 10k | Rated 4 of 5, Recommended | 5.8 | MITSource available | none |
| 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.1k | Rated 5 of 5, Top pick | 7.0 | Apache-2.0Open core | 3.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 | ★ 7k | Rated 1 of 5, Legacy | 4.7 | MIT | v1.28.14May 2025 |
| zizmor Static analysis for GitHub Actions workflows and action.yml files, written in Rust. | Workflow analysis | ★ 6.7k | Rated 5 of 5, Top pick | n/a | MIT | v1.30.1Sep 2026 |
| OpenSSF Scorecard Scores a repository's security practices 0 to 10 from about 18 automated checks. | Org and repo posture | ★ 5.7k | Rated 4 of 5, Recommended | 8.3 | Apache-2.0 | v5.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.2k | Rated 1 of 5, Legacy | n/a | Apache-2.0 | v1.19.9Sep 2024 |
| actionlint Workflow linter that type-checks expressions and runs ShellCheck on run: scripts. | Workflow analysis | ★ 4.3k | Rated 4 of 5, Recommended | 3.6 | MIT | v1.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.3k | Rated 4 of 5, Recommended | 7.0 | n/a | v0.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.7k | Rated 3 of 5, Situational | n/a | Apache-2.0 | v2.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.3k | Rated 4 of 5, Recommended | 7.8 | Apache-2.0Open core | v2.22.1Oct 2026 |
| pinact Rewrites uses: references in workflows to full commit SHAs with the version kept as a comment. | Action pinning | ★ 1.2k | Rated 4 of 5, Recommended | n/a | MIT | v5.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 | ★ 523 | Rated 4 of 5, Recommended | 7.6 | Apache-2.0 | v1.1.6May 2026 |
| Socket CLI Client for Socket, which analyzes what each package version does to spot malware and risky behaviour. | Malicious packages | ★ 323 | Rated 4 of 5, Recommended | n/a | MITOpen client, hosted service | v1.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.
| # | Stage | Tools | Fails the PR on | Notes |
|---|---|---|---|---|
| 1 | Release-age cooldown | Custom script | A new or changed dependency version published fewer than N days ago | Malicious 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. |
| 2 | Version pinning | Custom script | Wildcard ranges or git dependencies without a commit (advisory at first) | Checks the declared ranges in package.json and the lockfile, without installing anything. |
| 3 | Known vulnerabilities | npm audit, OSV-Scanner | Advisories at or above your chosen severity | npm audit asks the registry. OSV-Scanner reads the lockfile and asks OSV.dev. They use overlapping but different data, so running both catches more. |
| 4 | Reachability | OSV-Scanner | Nothing on its own. It only suppresses findings | Drops findings for packages that are not in the artifact you deploy, such as dev-only tooling, and records each decision as an OpenVEX statement. |
| 5 | Workflow analysis | zizmor, actionlint | Findings in .github/workflows and action.yml | Template injection, pull_request_target misuse, unpinned actions, credential persistence. Run offline in PRs and keep online audits for a scheduled job. |
| 6 | Code scanning | Semgrep CE, CodeQL | Rule matches in changed code | Semgrep with the p/ci ruleset and metrics turned off is a fast default. CodeQL goes deeper where you can run it. |
| 7 | Secrets | Gitleaks | Any match not in the baseline or ignore file | Check out with fetch-depth: 0 so the scan sees every commit in the PR, not only the last one. Redact matches in logs. |
| 8 | Malicious packages | Socket CLI | Install scripts, network access, obfuscation or known malware in new dependencies | Catches 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). |
| 9 | IaC and pipeline | Checkov, poutine | Misconfigured Terraform, Dockerfiles and build pipelines | Opt-in per repository. Only worth the minutes where there is IaC or a complex release pipeline. |
| 10 | Gate | Custom script | Any blocking stage above | Every 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 ;; esacFork 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.