feat(release): renew advisory baselines from rehearsal evidence - #1074
Merged
Merged
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
jeremi
enabled auto-merge (squash)
September 15, 2026 10:15
Renewing reviewed advisory exceptions for a new release meant hand-editing evidence bindings, recomputing canonical definition digests with inline Python, and moving live test pins by hand. Each release repeated the same error-prone steps before a human could review the actual exposure claim. Add `registry-release renew-advisory-baselines`, which moves only the machine bindings of already-reviewed exceptions onto review-only rehearsal evidence. It refuses changed bases or process contracts, missing or new findings, expired exceptions, non-fingerprint assertions, and any result that fails the strict advisory check, and it writes nothing unless every image renews. The rehearsal evidence collector also writes a review-only ELF exposure report per image, listing loader inputs and located dlsym or dlvsym uses with provable constant names, so reviewers start from facts rather than ad-hoc disassembly. It is not a gate. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
CodeQL flags a module imported with both import and import from. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
jeremi
force-pushed
the
feat/release-advisory-renewal-tooling
branch
from
September 15, 2026 17:28
0423086 to
a386867
Compare
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.
Pull Request
Summary
Release tooling (
release/). This automates the mechanical part of renewing advisory baselines from rehearsal evidence, so human review can focus on whether each exposure claim still holds. It also adds a review-only ELF exposure report to the rehearsal evidence artifact.registry-release renew-advisory-baselines(release/scripts/advisory_renewal.py) takes a downloadedrelease-advisory-evidence-*artifact and a source revision copied independently of it. It moves only the machine bindings of already-reviewed exceptions onto that evidence:reviewed_atlocal_reproductionprovenancetest_check_advisory_baselines.pyA dry run is the default;
--writeis required to change files.ELF exposure report (
release/scripts/image_exposure.py): the rehearsal collector now writesexposure/<name>.jsonfor each image's Entrypoint executable. The report lists:DT_NEEDED, the interpreter, and undefined dynamic symbolsdlsym/dlvsymdlsym/dlvsymcall, jump, or address reference, via the PLT or the GOTA constant symbol name is reported only when a RIP-relative
leainto%rsican be proven with no branch target in between. Anything else is markedreview_requiredwith a reason. The report is not a gate.release/OPERATIONS.md: the rehearsal advisory section now uses the subcommand (dry run, review,--write, then a second dry run that must report no changes) instead of hand-run jq checks and inline Python digest recomputation. It also describes the exposure report.Smaller changes:
release_candidate.advisory_baseline_pathis now the single mapping from image name to baseline path.Checks
test_advisory_renewal.py: 24 tests covering every refusal, all-or-nothing writes, idempotency, and CLI wiring.test_image_exposure.py: 48 tests. On macOS 2 are skipped; they are Linux-only and compile real PLT and-fno-pltGOT binaries.test_collect_rehearsal_advisory_evidence.py: 16 tests.test_check_advisory_baselines,test_registry_release,test_release_candidate,test_release_rehearsal,test_release_workflow_structure,test_check_gates_inventory.check-gates-inventory.pypasses.ubuntu:24.04with binutils 2.42, with no skips.--writereproduced the merged v0.32.0 baselines and live pins. The only differences were the exception rationales, which the tool deliberately never edits.main, the dry run reports 0 files to change.dlsymforwarding wrapper (mov %rdx,%rsi; jmp dlsym@plt), reported asname_argument_not_constant._dl_find_object,getrandom, and__pthread_get_minstack, matching the manual disassembly review done for v0.32.0.Notes
Security review notes (release provenance). This changes how reviewed advisory baselines are produced, so please review these points:
expires_at. It refuses rather than accepting a new blocking finding, a finding that became fixable, or a finding that disappeared. Human review still owns the vulnerability decision, and the release candidate still enforces the result against its own protected-main image bytes.--source-revisionis required and must equalcollection.json'srevision. The documented procedure copies it fromgh run view --json headSha, GitHub's record of the dispatched commit, not from the artifact.collection.jsonmust have exactly the expected fields,review_onlypurpose, both acceptance flags false, and the exact version and source.release_candidate._candidate_image_names(version).--no-same-owner --no-same-permissionsand rejected if it contains special files.whole_image_fingerprint_equals.--today.expires_atprecedes the review date.validate_v4_baselineandcheck_grype_findingsagainst the extracted rootfs before any file is written. The live-pin rewrite requires each pin assignment to match exactly once and to cover exactly the renewed roster.advisory_evidence=truerehearsal runs.readelfandobjdumpcome from the runner's binutils: Ubuntu 24.04 runner images ship binutils 2.42. The collector checks for them before doing any work.Deliberately unchanged.
official_candidateprovenance, which this tool does not write.collection.jsonis unchanged; it does not list the exposure reports.Possible follow-ups, not in this PR. Report
dlopencall sites and their library-name arguments the same way. Optionally teach the candidate procedure to reuse the renewal once its evidence layout matches.DCO
Signed-off-bytrailer.