Skip to content

ci: --require-hashes for the locked installs, base image pinned by digest - #329

Merged
maximilianfeix merged 3 commits into
mainfrom
ci/require-hashes-and-pin-base-image
Oct 14, 2026
Merged

maximilianfeix merged 3 commits into
mainfrom
ci/require-hashes-and-pin-base-image

Conversation

@maximilianfeix

@maximilianfeix maximilianfeix commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

Supply-chain hardening from the OpenSSF Scorecard Pinned-Dependencies check (currently 6/10: 0 of 2 container images and 3 of 12 pip commands pinned).

  • pip install -r .github/requirements/*.txt → pip install --require-hashes -r … in all workflows. The files were already fully hash-locked (pip-compile --generate-hashes), so behavior is unchanged – but an unhashed line now fails the build instead of silently installing, and Scorecard recognizes it.
  • Dockerfile: both stages use python:3.12-slim@sha256:a6e34c59… – the multi-arch OCI index digest (verified to include linux/amd64 and linux/arm64), so the amd64/arm64 image build keeps working.
  • dependabot.yml: new docker ecosystem entry (weekly). Without it a digest pin would freeze the base image and its security patches; with it the pin is refreshed weekly via PR.

Not changed: installing the freshly built wheel (pip install dist/*.whl) in the package/release smoke tests stays unpinned on purpose – it tests what users get from PyPI.

Verified: pip install --dry-run --require-hashes resolves for run, lint, hf, bot and test locks; full test suite passes locally.

Added: the mcp-registry release job (which holds an OIDC token) downloaded mcp-publisher with curl | tar unchecked. It is now verified with sha256sum -c against a06c9096…, the value from the official registry_1.8.1_checksums.txt (cross-checked by downloading the archive). curl -f makes an HTTP error fail the step instead of untarring an error page.

…gest

The requirement files were already hash-locked; --require-hashes makes that a rule
(an unhashed line now fails instead of installing unchecked) and lets OpenSSF
Scorecard see it. The Docker base image is pinned to the python:3.12-slim
multi-arch index digest, and a docker entry for Dependabot keeps that digest
current so the base image's security fixes still arrive weekly.
@maximilianfeix
maximilianfeix force-pushed the ci/require-hashes-and-pin-base-image branch from a15a274 to 79be022 Compare October 14, 2026 18:27
…ing it

The mcp-registry job runs with id-token: write. The publisher binary was piped
from curl into tar unchecked; it is now verified against the sha256 from the
v1.8.1 release's checksums file.
@maximilianfeix
maximilianfeix merged commit 91bf940 into main Oct 14, 2026
23 checks passed
@maximilianfeix
maximilianfeix deleted the ci/require-hashes-and-pin-base-image branch October 14, 2026 18:32
@maximilianfeix maximilianfeix mentioned this pull request Oct 14, 2026
maximilianfeix added a commit that referenced this pull request Oct 14, 2026
Security: the rotating server refuses to run as an open proxy (--serve-host
off loopback needs a password or --serve-open, #328); hash-enforced CI
installs, digest-pinned base image, checked mcp-publisher (#329).
Adds docs/MAINTENANCE.md, the maintenance log.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant