Skip to content

fix(release): renew image advisories for v0.25.0 - #813

Merged
jeremi merged 1 commit into
mainfrom
fix/renew-advisories-v0.25.0
Aug 22, 2026
Merged

fix(release): renew image advisories for v0.25.0#813
jeremi merged 1 commit into
mainfrom
fix/renew-advisories-v0.25.0

Conversation

@jeremi

@jeremi jeremi commented Aug 22, 2026

Copy link
Copy Markdown
Member

Why

The application layer DiffID moves with every build, and an advisory baseline
binds its exposure assertions to exact layer IDs. The first candidate of every
release therefore trips them. Candidate run 32574081507 for v0.25.0 stopped at
"Verify and scan exact candidate images" with:

exposure assertion false: affected=['CVE-2026-14456', 'CVE-2026-5435', 'CVE-2026-5450', 'CVE-2026-5928']:
  ordered OCI rootfs.diff_ids changed
advisory baseline: grype image=sha256:8901d3f3... threshold=high findings=16 blocking=4 exceptions=4 invalid=1

This is the routine per-release renewal, not a regression. Precedent: v0.22
(d9a278a55), v0.23 (730cc8417), v0.24 (56caa3c5d).

What moved

Rebinds the four baselines to the official v0.25.0 candidate images built from
130136a2b20ad10d359849ac111316a2fb1cb39e, and moves the live pins in
release/scripts/test_check_advisory_baselines.py to match.

Service Candidate image digest Application layer /usr/local/bin/<svc>
discovery sha256:8901d3f3c52a1781… 9c34752fe979…7ae58ef941e4… beb9eb94306e…89381bc650f6…
evidence sha256:607e0797fec9273d… 07112d7cf975…e2e804985721… 11089b72a1b6…0fa7d38cc671…
mint sha256:01e025a12f410fb9… 87f6c179626b…a788f7502c8e… 628e429a1ada…d598a23ca43b…
relay sha256:e36610df8906a7ba… c36dc82eab12…7c3e77123161… 2a8f45dc3c70…34cf762f9b36…

Nothing else in these files changes: the diff is confined to
application_layer_ids, definition_digest, runtime_definition_digest,
reference_image_digest, reference_source_revision, the one moved file
digest per assertion, and the release number named in each rationale.

Security review notes (release provenance)

  • Evidence regenerated from the exact candidate images in their private
    packages, with the scanner versions .github/workflows/release-candidate.yml
    pins: syft v1.45.1, grype v0.114.0, crane v0.21.2. Pulled through the daemon,
    which is what makes the scan admissible. No digest is carried over from a
    different candidate and none is hand-invented.

  • Base unchanged. The 21 pinned base layers are identical on all four
    images and remain the exact ordered prefix of the candidates'
    rootfs.diff_ids, so only the application layer moved. runtime.image still
    resolves to the same pinned distroless base.

  • Process contract unchanged. runtime.config is equal to each candidate's
    OCI process configuration across user, entrypoint, command,
    working_dir, environment, healthcheck, args_escaped, exposed_ports,
    and stop_signal. Labels are the three OCI identity labels plus the fixed
    uid=65532 / gid=65532 pair.

  • File digests double-sourced. Every asserted digest was taken from Syft and
    confirmed against the exported rootfs; zero disagreements. The four base
    libraries are byte-identical to what was already recorded. Only
    /usr/local/bin/<service> moved.

  • Rationales re-verified against these binaries, not carried forward.

    • CVE-2026-5450 (allocating scanf conversions): Discovery imports no
      scanf-family entry point at all. Evidence, Mint, and Relay reach
      __isoc23_sscanf at exactly two call sites each; the format string at each
      site was recovered by disassembly and is %lu or %lx. Zero allocating
      conversions, zero unresolved sites.
    • CVE-2026-5928 (wide-character input): no ungetwc, getwc, fgetws,
      wscanf, mbrtowc, or fwide import on any of the four.
    • CVE-2026-5435 (deprecated resolver printing): Discovery imports no glibc
      resolver symbol; the other three import only __res_init.
    • CVE-2026-14456 (OpenSSL QUIC server queue): NEEDED is only
      libgcc_s.so.1, libm.so.6, libc.so.6, and the interpreter. No
      libssl.so/libcrypto.so name to load dynamically. The OPENSSL_* strings
      present are AWS-LC statics (aws_lc_0_44_0_OPENSSL_*) beside aws-lc-rs
      and rustls.

    This is a rebind of an unchanged judgement, not a new acceptance.

Verification

$ check-advisory-baselines.py … --subject <svc>-image     # per service
discovery  invalid=0   PASS
evidence   invalid=0   PASS
mint       invalid=0   PASS
relay      invalid=0   PASS

$ python3 -m unittest release/scripts/test_check_advisory_baselines.py
Ran 46 tests in 0.140s
OK (skipped=1)

The single skip is test_real_glibc_definition_passes_but_importing_dependency_fails,
skipped locally as "requires a Linux glibc toolchain"; it runs in CI.

After merge

Re-request the v0.25.0 candidate against the new main, then tag and publish.

The application layer DiffID moves with every build and a baseline binds
its exposure assertions to exact layer IDs, so the first candidate of a
release always trips them. Candidate run 32574081507 stopped on that, as
v0.22, v0.23, and v0.24 each did before it.

Rebind the four baselines to the official v0.25.0 candidate images built
from 130136a, and move the live pins in
the checker test to match.

Security review notes (release provenance):

- Evidence is regenerated from the exact candidate images in their
  private packages, with the scanner versions the candidate workflow
  pins: syft v1.45.1, grype v0.114.0, crane v0.21.2. No digest is
  carried over from a different candidate and none is hand-invented.
- The 21 pinned base layers are unchanged on all four images and remain
  the exact ordered prefix of the candidates' rootfs.diff_ids, so only
  the application layer moved. runtime.image still resolves to the same
  pinned distroless base.
- runtime.config is byte-equal to each candidate's OCI process contract:
  user, entrypoint, command, working_dir, environment, healthcheck,
  args_escaped, exposed_ports, and stop_signal all match. Image labels
  are the three OCI identity labels plus the fixed uid/gid pair.
- Every asserted file digest was taken from Syft and confirmed against
  the exported rootfs. The four base libraries are byte-identical to
  what was already recorded; only /usr/local/bin/<service> moved.
- The four accepted risks were re-verified against these binaries, not
  carried forward. CVE-2026-5450: Discovery imports no scanf entry
  point; Evidence, Mint, and Relay reach sscanf at exactly two call
  sites whose recovered format strings are %lu and %lx, with no
  allocating conversion and no unresolved site. CVE-2026-5928: no
  wide-character input symbol is imported. CVE-2026-5435: only
  __res_init is imported, none of the deprecated resolver-printing
  helpers. CVE-2026-14456: no OpenSSL library is linked or named for
  dynamic loading; TLS is rustls over aws-lc-rs. This is a rebind of an
  unchanged judgement, not a new acceptance.
- check-advisory-baselines.py now reports invalid=0 for all four
  services against the regenerated evidence, and the focused test suite
  passes.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>

@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: 4b68c0356d

ℹ️ 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/test_check_advisory_baselines.py
Comment thread products/relay-v2/security/advisory-baseline.json
@jeremi
jeremi merged commit 6e662d6 into main Aug 22, 2026
36 checks passed
@jeremi
jeremi deleted the fix/renew-advisories-v0.25.0 branch August 22, 2026 13:38
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