diff --git a/.github/README.md b/.github/CI_NOTES.md similarity index 100% rename from .github/README.md rename to .github/CI_NOTES.md diff --git a/.github/workflows/assign-ids.yml b/.github/workflows/assign-ids.yml index 8718e1383..6b9edce59 100644 --- a/.github/workflows/assign-ids.yml +++ b/.github/workflows/assign-ids.yml @@ -31,7 +31,7 @@ jobs: # Falls back to GITHUB_TOKEN when the App is not configured, so the job # degrades to the old behaviour rather than failing outright. Set the # ASSIGN_IDS_APP_ID variable and ASSIGN_IDS_APP_PRIVATE_KEY secret to - # activate it; see .github/README.md. + # activate it; see .github/CI_NOTES.md. # # Both halves have to be present or create-github-app-token hard-fails, # which would defeat that fallback. Secrets are not readable in `if:`, so diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8e05d142a..c3efd1e6a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,6 +16,9 @@ jobs: permissions: contents: write pull-requests: write + # For build-provenance attestation of release artifacts + id-token: write + attestations: write steps: - name: Checkout @@ -87,6 +90,26 @@ jobs: artifact-name: catalog-sbom.spdx.json output-file: dist/catalog-sbom.spdx.json + # Sigstore build provenance for the release artifacts (SLSA). The + # bundle is also attached to the release as catalog.intoto.jsonl so + # consumers (and OpenSSF Scorecard) can verify it offline. Best-effort: + # a bookkeeping step must never be able to break a release. + - name: Attest build provenance + if: steps.changesets.outputs['has-changesets'] == 'false' + id: attest + continue-on-error: true + uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4 + with: + subject-path: | + dist/catalog.sqlite + dist/catalog-index.json + + - name: Stage provenance bundle for release + if: steps.changesets.outputs['has-changesets'] == 'false' && steps.attest.outcome == 'success' + env: + BUNDLE_PATH: ${{ steps.attest.outputs.bundle-path }} + run: cp "$BUNDLE_PATH" dist/catalog.intoto.jsonl + - name: Get package version if: steps.changesets.outputs['has-changesets'] == 'false' id: pkg @@ -113,6 +136,7 @@ jobs: dist/catalog.sqlite dist/catalog.sqlite.sha256 dist/catalog.sqlite.minisig + dist/catalog.intoto.jsonl dist/catalog-sbom.spdx.json dist/catalog-index.json dist/catalog-index.json.sha256 diff --git a/README.md b/README.md index ec74b1be2..372b83738 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,9 @@ curl -LO https://github.com/existential-engineering/catalog/releases/latest/down sha256sum -c catalog.sqlite.sha256 ``` -Each release also includes a `catalog.sqlite.minisig` signature and a -`catalog-sbom.spdx.json` SBOM. +Each release also includes a `catalog.sqlite.minisig` signature, a +`catalog-sbom.spdx.json` SBOM, and a `catalog.intoto.jsonl` build-provenance +attestation. ### Query it diff --git a/SECURITY.md b/SECURITY.md index ce5e0fe32..ea631331a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,8 +1,12 @@ # Security Policy -## Reporting Issues +## Reporting a Vulnerability -If you discover a security issue, please report it by emailing the maintainers directly rather than opening a public issue. +Please report security issues privately rather than opening a public issue: + +- **Preferred:** use GitHub's private vulnerability reporting via + [Report a vulnerability](https://github.com/existential-engineering/catalog/security/advisories/new) +- **Email:** [jeff@aureo.audio](mailto:jeff@aureo.audio) ## Scope @@ -14,4 +18,13 @@ This repository primarily contains data files (YAML) and build scripts. Security ## Response -We will acknowledge receipt within 48 hours and provide a detailed response within 7 days. +We will acknowledge receipt within 48 hours and provide a detailed response +within 7 days. Please allow us a reasonable disclosure window to investigate +and ship a fix before any public disclosure. + +## Release Integrity + +Every release of `catalog.sqlite` ships with a SHA-256 checksum, a +[minisign](https://jedisct1.github.io/minisign/) signature +(`catalog.sqlite.minisig`), and an SPDX SBOM. Verify downloads against these +before use.