Skip to content

fix(release): renew image advisories for v0.24.0 - #805

Merged
jeremi merged 2 commits into
mainfrom
release/renew-advisories-v0.24.0
Aug 22, 2026
Merged

fix(release): renew image advisories for v0.24.0#805
jeremi merged 2 commits into
mainfrom
release/renew-advisories-v0.24.0

Conversation

@jeremi

@jeremi jeremi commented Aug 22, 2026

Copy link
Copy Markdown
Member

Renews the image advisory fingerprints for the v0.24.0 release and adds the
Discovery baseline the candidate workflow has expected since Discovery joined
RELEASE_IMAGE_NAMES. Without this, candidate run #3 stops at the advisory
scan for all four images.

Evidence

Regenerated from the private candidate packages produced by candidate run
32558441544 attempt 1, at source d1a6c7b925faf35dbc5a9f3269991f0d5e722f92,
following release/OPERATIONS.md with the scanner versions the candidate
workflow pins: syft 1.45.1, grype 0.114.0, crane 0.21.2, plus the
daemon-backed docker pull --platform linux/amd64 that makes the scan
admissible. The grype DB was refreshed and Discovery re-scanned afterwards to
rule out a stale-DB confound; the match IDs were identical.

service candidate digest
discovery sha256:003c16f68b7231fb43e8c36aa1d549330febf28e6436a617cb9cf3c1ecdb9348
evidence sha256:010205641f5c90449f50f7de7687572b649e70f6c40c78167e8793a3a5ba63e5
mint sha256:f6bbc75354bdfc5740555df576e343052c66375dd979cbf3f75fd48a60c42a40
relay sha256:37d5f594a66a7fdb95cf1d5478e8a47a52ffc14c9b1dc5aad0c3ab340fd5e9be

The pinned distroless base is still the exact ordered DiffID prefix of every
candidate, and the four reviewed base libraries are byte-identical to the
v0.23.0 review. Only /usr/local/bin/<service> and the application layer
moved, so the v0.23.0 review of those library bytes carries over and is
re-pinned by digest.

Review surface

Each rationale was re-verified against the v0.24.0 binaries rather than
carried forward.

service sscanf call sites wide-char input resolver symbols OpenSSL TLS stack
discovery 0 none none not linked, no name embedded none linked
evidence 2: %lu, %lx none __res_init only not linked, no name embedded rustls + aws-lc-rs
mint 2: %lu, %lx none __res_init only not linked, no name embedded rustls + aws-lc-rs
relay 2: %lu, %lx none __res_init only not linked, no name embedded rustls + aws-lc-rs

All four declare exactly libgcc_s.so.1, libm.so.6, libc.so.6, and the
program interpreter as DT_NEEDED.

Two rationales are now more precise than the text they replace:

  • CVE-2026-5450 states the sscanf call sites it relies on instead of
    asserting absence. Note glibc 2.38+ routes C23 scanf semantics through
    __isoc23_* aliases; a symbol scan that only looks for __isoc99_* reports
    a false "no scanf imports".
  • CVE-2026-5435 names the resolver symbol actually imported, __res_init,
    which is resolver initialisation rather than resolver printing, so the claim
    holds and is now stated positively.

CVE-2026-14456 holds unchanged for Evidence, Mint, and Relay. Discovery
links no TLS stack at all, so its rationale says that rather than reusing the
rustls clause, which would have been false for it.

expires_at stays 2026-09-03, so renewing does not silently extend the
risk-acceptance window. owner stays @jeremi.

Security-sensitive change

These baselines are the release provenance gate deciding whether a candidate
may publish with known unfixed advisories. Every exception is accepted_risk
over a Debian no-DSA or postponed issue with no fixed Trixie version, and none
is fixable; the generator refuses to write an exception whose finding has
become fixable. Every assertion is re-pinned to the reviewed candidate digest
and runtime definition digest, so a rebuilt or altered image fails closed.

Second commit: discovery-candidate cleanup

discovery-candidate joins the exact cleanup allowlist in
cleanup-release-candidates.py and its pinned copy in the gate inventory. It
was deliberately withheld until the package existed, because listing an absent
package fails closed. The all-candidates cleanup test grows a matching fixture.

release/OPERATIONS.md

The renewal procedure was missing a step this renewal needed: the live pins in
test_check_advisory_baselines.py (LIVE_REFERENCE_IMAGE_DIGESTS,
LIVE_REFERENCE_SOURCE_REVISION, LIVE_REVIEW_EVALUATION_DATE, and for a
first-time service LIVE_BASELINES, LIVE_REFERENCE_PROVENANCE,
LIVE_EXECUTABLES) restate the reviewed evidence instead of reading it back
out of the baselines, so a renewal that skips them fails that test. The stale
"Evidence and Mint" comment now names Discovery too.

Verification

  • The real gate, invoked exactly as release-candidate.yml invokes it, on all
    four images against the regenerated evidence: invalid=0, exit 0.
  • python3 -m unittest release/scripts/test_check_advisory_baselines.py (46)
  • python3 -m unittest release/scripts/test_cleanup_release_candidates.py (13)
  • python3 -m unittest release/scripts/test_registry_release.py
  • python3 -m unittest release/scripts/test_release_workflow_structure.py (39)
  • python3 -m unittest release/scripts/test_check_release_source_model.py (12)
  • python3 release/scripts/check-gates-inventory.py (151 gates)
  • release/scripts/registry-release validate release/manifests/registry-stack-beta-35.yaml

The JSON layout is preserved rather than reformatted: the baselines carry no
formatter config, and the serializer used here reproduces all three committed
files byte-for-byte from their own content before writing. The diff is 34
changed lines per renewed file, with no reordering.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4b9d84f373

ℹ️ 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".

Comment thread release/scripts/cleanup-release-candidates.py
Comment thread products/relay-v2/security/advisory-baseline.json
jeremi added 2 commits August 22, 2026 10:28
Bind Discovery, Evidence, Mint, and Relay to the official v0.24.0 Linux
AMD64 candidates built from d1a6c7b, and
add the Discovery baseline the candidate workflow has expected since
Discovery joined RELEASE_IMAGE_NAMES.

Evidence regenerated from the private candidate packages with the scanner
versions the candidate workflow pins (syft 1.45.1, grype 0.114.0, crane
0.21.2) and a daemon-backed pull, per release/OPERATIONS.md. The pinned
distroless base is still the exact DiffID prefix of every candidate and
the four reviewed base libraries are byte-identical to the v0.23.0
review, so only /usr/local/bin/<service> and the application layer moved.

Each rationale was re-verified against the v0.24.0 binaries rather than
carried forward, and two are now more precise:

- CVE-2026-5450 states the sscanf call sites it relies on. Evidence,
  Mint, and Relay reach __isoc23_sscanf at exactly two fixed-format call
  sites, %lu and %lx. Discovery imports no scanf entry point at all.
- CVE-2026-5435 names the resolver symbol actually imported, __res_init,
  instead of describing the path only by absence.

CVE-2026-14456 holds for the same reason as before for Evidence, Mint,
and Relay: no OpenSSL library is linked or named, and TLS terminates with
rustls and aws-lc-rs. Discovery links no TLS stack at all, so its
rationale says that instead of claiming a rustls terminator it does not
have.

expires_at stays 2026-09-03 so renewal does not silently extend the
risk-acceptance window.

Security-sensitive: these baselines are the release provenance gate that
decides whether a candidate may publish with known unfixed advisories.
Every exception is accepted_risk over a Debian no-DSA or postponed issue
with no fixed Trixie version, and every assertion is re-pinned to the
reviewed candidate digest, so a rebuilt or altered image fails closed.

release/OPERATIONS.md gains the step this renewal needed and the
procedure omitted: the live pins in test_check_advisory_baselines.py
restate the reviewed evidence and must be moved forward by hand.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
The discovery-candidate package now exists, so it joins the exact cleanup allowlist and its pinned copy in the gate inventory. Listing an absent package fails closed, which is why it waited for the release that first published it.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
@jeremi
jeremi force-pushed the release/renew-advisories-v0.24.0 branch from 4b9d84f to a5e339b Compare August 22, 2026 08:28

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a5e339b95e

ℹ️ 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".

Comment thread release/security/discovery-advisory-baseline.json
@jeremi
jeremi merged commit 4bf7c1c into main Aug 22, 2026
36 checks passed
@jeremi
jeremi deleted the release/renew-advisories-v0.24.0 branch August 22, 2026 08:37
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