Skip to main content

Security

Every release publishes, under https://downloads.factorhouse.io/fh/<tag>/:

FileWhat it is
fh_<version>_<os>_<arch>.tar.gz, .zipThe archives
<archive>.sbom.jsonSPDX 2.3 software bill of materials for that archive
fh_<version>_vulnerability-report.txtgovulncheck and grype results for every platform build
fh_<version>_grype.jsongrype results as JSON, one entry per platform
fh_<version>_govulncheck.jsongovulncheck results as JSON, one stream per platform
checksums.txtSHA-256 of every file above
checksums.txt.sig, checksums.txt.pemKeyless cosign signature and certificate over checksums.txt

The latest report is always at fh_vulnerability-report.txt.

Verify a download

Use the versioned directory: checksums.txt names the versioned files.

v=0.9.1
base=https://downloads.factorhouse.io/fh/v$v
for f in checksums.txt checksums.txt.sig checksums.txt.pem fh_${v}_darwin_arm64.tar.gz; do
curl -sSfO "$base/$f"
done

cosign verify-blob checksums.txt \
--certificate checksums.txt.pem \
--signature checksums.txt.sig \
--certificate-identity-regexp '^https://github.com/factorhouse/factor-cli/\.github/workflows/release\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com

shasum -a 256 --ignore-missing -c checksums.txt

Verified OK and <archive>: OK mean the archive is the one the release workflow built and signed.

Scan it yourself

The SBOM lists every Go module linked into the binary, with versions:

curl -sSfO "$base/fh_${v}_darwin_arm64.tar.gz.sbom.json"
grype sbom:fh_${v}_darwin_arm64.tar.gz.sbom.json

How releases are gated

A release fails if govulncheck finds a vulnerability reachable from fh's code, or gosec reports a medium or higher issue. grype results are published, not gating: they include modules that are linked but never called. Dependencies with a fixed version available are bumped before the next release.