fix(release): renew image advisories for v0.23.0 - #791
Merged
Conversation
The v0.23.0 candidate run stopped in the advisory gate. Two causes: the reviewed whole-image fingerprints still named the v0.22.0 candidate images, and Grype now reports CVE-2026-14456 in libssl3t64, a High finding with no exception. Renew all three baselines against the v0.23.0 candidate images built from 5c4e285, and record the reviewed CVE-2026-14456 acceptance. Security review notes: - Only application_layer_ids[0] moved in each image. The pinned 21-layer distroless base prefix is unchanged, so runtime_base_changed is not triggered; the OCI process config is unchanged and was re-reviewed against the production contract. - Every digest here was recomputed from the candidate images themselves: the images were pulled by digest from ghcr.io, scanned with the versions release-candidate.yml pins (syft v1.45.1, grype v0.114.0, crane v0.21.2), and the reviewed file digests were taken from the exported rootfs. No digest was carried over or invented. - The three libc6 acceptances keep their reasoning; their claims were re-verified against the v0.23.0 bytes before the rationale text moved from v0.22.0 to v0.23.0. __isoc23_sscanf is still reached only from fixed-format call sites, the binaries still export no wide-character input path, and no deprecated resolver-printing function is present. - CVE-2026-14456 is an unbounded pending-connection queue in the OpenSSL QUIC server path. Debian marks it postponed for Trixie with no fixed version and Grype reports it wont-fix, so a base bump cannot clear it. No workspace crate links OpenSSL: TLS is rustls with aws-lc-rs, the only OpenSSL-adjacent dependency is openssl-probe (a pure-Rust CA-path finder), and each binary declares only libgcc_s.so.1, libm.so.6, libc.so.6 and the loader as NEEDED with no libssl.so.3 or libcrypto.so.3 name to load dynamically. libssl3t64 ships in the pinned base and no image process opens it. - The acceptances use whole_image_fingerprint_equals rather than a closure assertion. All three binaries import dlsym (evidence and relay also dlopen), so executable_closure() reports an open closure and any closure-based assertion would evaluate as unevaluable. - All four exceptions in a baseline share one reviewed fingerprint. Layer equality already pins every rootfs byte, including the unused libssl3t64 bytes, so a per-advisory file list would add no evidence and would split the reviewed image identity. - The review window keeps the established 14-day cadence: reviewed_at 2026-08-20, expires_at 2026-09-03. The checker's live-baseline test grew a second package, so its synthetic Syft model now derives one artifact per exception from the baseline instead of hard-coding libc6, and it evaluates on the baselines' own review date instead of a pinned literal. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0a68349ba3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The live-baseline evaluability test derived its evaluation date from the maximum reviewed_at across the baseline's own exceptions. That made the checker's future-dated guard unreachable for the newest exception: a baseline committed with a future reviewed_at defined the very "today" it was compared against, so ordinary CI accepted it and only a later release-candidate run against the real clock would have stopped it. State the date independently instead, and cover the guard directly. Security review notes: this restores a release-provenance gate rather than relaxing one. LIVE_REVIEW_EVALUATION_DATE is now a stated constant a reviewer moves by hand at each renewal, so a future-dated reviewed_at fails in ordinary CI. Verified by mutating a live exception's reviewed_at to 2026-08-25, which now fails the live test with "future-dated exception: CVE-2026-14456 libssl3t64 3.5.6-1~deb13u2" and passed silently before. The new test_future_dated_exception_is_invalid covers the checker path itself. No baseline content, digest, or exception changes in this commit. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The v0.23.0 candidate run stopped in the advisory gate. Two causes: the reviewed whole-image fingerprints still named the v0.22.0 candidate images, and Grype now reports CVE-2026-14456 in
libssl3t64, a High finding with no exception.This renews all three baselines against the v0.23.0 candidate images built from
5c4e28578cf3c632faca77bf9d81cd18e95c635f, and records the reviewed CVE-2026-14456 acceptance.Security review notes
application_layer_ids[0]moved in each image. The pinned 21-layer distroless base prefix is unchanged, soruntime_base_changedis not triggered; the OCI process config is unchanged and was re-reviewed against the production contract.release-candidate.ymlpins (syft v1.45.1, grype v0.114.0, crane v0.21.2), reviewed file digests taken from the exported rootfs. No digest was carried over or invented.__isoc23_sscanfis still reached only from fixed-format call sites, the binaries still export no wide-character input path, and no deprecated resolver-printing function is present.wont-fix, so a base bump cannot clear it. No workspace crate links OpenSSL: TLS is rustls with aws-lc-rs, the only OpenSSL-adjacent dependency isopenssl-probe(a pure-Rust CA-path finder), and each binary declares onlylibgcc_s.so.1,libm.so.6,libc.so.6and the loader asNEEDED, with nolibssl.so.3orlibcrypto.so.3name to load dynamically.libssl3t64ships in the pinned base and no image process opens it.whole_image_fingerprint_equalsrather than a closure assertion. All three binaries importdlsym(evidence and relay alsodlopen), soexecutable_closure()reports an open closure and any closure-based assertion would evaluate as unevaluable.libssl3t64bytes, so a per-advisory file list would add no evidence and would split the reviewed image identity.reviewed_at2026-08-20,expires_at2026-09-03.Test change
The checker's live-baseline test grew a second package, so its synthetic Syft model now derives one artifact per exception from the baseline instead of hard-coding libc6, and it evaluates on the baselines' own review date instead of a pinned literal.
Verification
Scans were reproduced locally on linux/amd64 with the pinned scanner versions, then the gate was run exactly as
release-candidate.ymlruns it, against all three candidate images:Also run and green:
python3 -m unittest release/scripts/test_check_advisory_baselines.py(45 tests),test_registry_release.py(68),test_check_release_source_model.py(12),check-release-source-model.sh,registry-release validate release/manifests/registry-stack-beta-34.yaml,products/relay-v2/scripts/check-contracts.sh.Scope note: this spans
release/andproducts/relay-v2/security/, matching the precedent set by #776, since the three baselines are renewed as one reviewed set.