Summary
The release Dockerfile is digest-pinned for its base images but pins the uv binary by tag:
# Dockerfile:12
COPY --from=ghcr.io/astral-sh/uv:0.11.23 /uv /usr/local/bin/uv
Both FROM python:3.14-slim@sha256:cea0e60… lines (Dockerfile:6, 49) are digest-pinned; this is the one mutable image reference in the build.
Failure scenario
A re-pushed or compromised 0.11.23 tag on GHCR delivers an arbitrary uv binary, which then resolves and installs every dependency into the release image — exactly the supply-chain hole the digest pins exist to close (OWASP CICD-SEC-3, Dependency Chain Abuse). Dependabot's docker ecosystem tracks FROM lines, not this COPY --from, so it won't catch a bad pin either.
Suggested fix
Pin by digest: COPY --from=ghcr.io/astral-sh/uv:0.11.23@sha256:<digest> /uv /usr/local/bin/uv.
Found in Fable review of PR #232 → HEAD.
Summary
The release Dockerfile is digest-pinned for its base images but pins the
uvbinary by tag:Both
FROM python:3.14-slim@sha256:cea0e60…lines (Dockerfile:6, 49) are digest-pinned; this is the one mutable image reference in the build.Failure scenario
A re-pushed or compromised
0.11.23tag on GHCR delivers an arbitraryuvbinary, which then resolves and installs every dependency into the release image — exactly the supply-chain hole the digest pins exist to close (OWASP CICD-SEC-3, Dependency Chain Abuse). Dependabot's docker ecosystem tracksFROMlines, not thisCOPY --from, so it won't catch a bad pin either.Suggested fix
Pin by digest:
COPY --from=ghcr.io/astral-sh/uv:0.11.23@sha256:<digest> /uv /usr/local/bin/uv.Found in Fable review of PR #232 → HEAD.