Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 34 additions & 34 deletions products/relay-v2/security/advisory-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"sha256:7db505d90756626f425c6c5468eca565c82f589b144ecaa4f411ad9bbf79e614"
],
"application_layer_ids": [
"sha256:6b6ac9bdb2dd2fb70ee79206378fe74ae84b1b056ccf2c165fba4e2bd0402144",
"sha256:c36dc82eab1250c2e3fc430589b275d8f66d8e5c0a18fd030873a8cac6a81982",
Comment thread
jeremi marked this conversation as resolved.
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
],
"config": {
Expand All @@ -52,7 +52,7 @@
"exposed_ports": ["8080/tcp"],
"stop_signal": ""
},
"definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1"
"definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2"
},
"policies": [
{
Expand All @@ -75,8 +75,8 @@
"severity": "Critical",
"status": "accepted_risk",
"owner": "@jeremi",
"rationale": "Debian classifies the Trixie issue as minor/no-DSA and has no Trixie fix. The official v0.23.0 Linux AMD64 Relay candidate had no effective vulnerable allocating-character scanf path in the reviewed bytes. A candidate must retain the complete ordered reference rootfs layers, the production OCI process contract, and the Syft-bound executable closure digests.",
"reviewed_at": "2026-08-20",
"rationale": "Debian classifies the Trixie issue as minor/no-DSA and has no Trixie fix. The official v0.24.0 Linux AMD64 Relay candidate had only fixed-format %lu and %lx sscanf call sites and no effective vulnerable allocating-character scanf path in the reviewed bytes. A candidate must retain the complete ordered reference rootfs layers, the production OCI process contract, and the Syft-bound executable closure digests.",
"reviewed_at": "2026-08-22",
"expires_at": "2026-09-03",
"invalidation_triggers": [
"candidate_image_identity_mismatch",
Expand All @@ -93,14 +93,14 @@
"runtime_config_changed",
"runtime_base_changed"
],
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"component_layer_id": "sha256:3a7299f559d987305122c7669fc3643095eb0955f8ff4a38c9430d54d0b4452e",
"exposure_assertion": {
"kind": "whole_image_fingerprint_equals",
"reference_image_digest": "sha256:bba41cf6d867b319b05282e2e94746cebf6f0bd1dbf7dcc3c1666813f7241847",
"reference_source_revision": "5c4e28578cf3c632faca77bf9d81cd18e95c635f",
"reference_image_digest": "sha256:37d5f594a66a7fdb95cf1d5478e8a47a52ffc14c9b1dc5aad0c3ab340fd5e9be",
"reference_source_revision": "d1a6c7b925faf35dbc5a9f3269991f0d5e722f92",
"reference_provenance": "official_candidate",
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"files": [
{
"path": "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2",
Expand All @@ -120,10 +120,10 @@
},
{
"path": "/usr/local/bin/relay",
"sha256": "sha256:5195ece8083b3641203133e85a78f51728c679cebda50fec24e830df743a4d87"
"sha256": "sha256:2a8f45dc3c70522d2e35714af42a24826fdbbdc1d59deafc475067d0393489ce"
}
],
"definition_digest": "sha256:ec054e4a5d653ee76f29d9a14ec0d3319a3885025ed932e1e8dda10cda907aeb"
"definition_digest": "sha256:3534073aa3178748d2a7fbd445d948c339a4b32a9d788c31fc9ef628e16f438b"
}
},
{
Expand All @@ -133,8 +133,8 @@
"severity": "High",
"status": "accepted_risk",
"owner": "@jeremi",
"rationale": "Debian classifies the Trixie issue as minor/no-DSA and has no Trixie fix. The official v0.23.0 Linux AMD64 Relay candidate had no effective wide-character input path in the reviewed bytes; libc exporting ungetwc is expected. A candidate must retain the complete ordered reference rootfs layers, the production OCI process contract, and the Syft-bound executable closure digests.",
"reviewed_at": "2026-08-20",
"rationale": "Debian classifies the Trixie issue as minor/no-DSA and has no Trixie fix. The official v0.24.0 Linux AMD64 Relay candidate had no effective wide-character input path in the reviewed bytes; libc exporting ungetwc is expected. A candidate must retain the complete ordered reference rootfs layers, the production OCI process contract, and the Syft-bound executable closure digests.",
"reviewed_at": "2026-08-22",
"expires_at": "2026-09-03",
"invalidation_triggers": [
"candidate_image_identity_mismatch",
Expand All @@ -151,14 +151,14 @@
"runtime_config_changed",
"runtime_base_changed"
],
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"component_layer_id": "sha256:3a7299f559d987305122c7669fc3643095eb0955f8ff4a38c9430d54d0b4452e",
"exposure_assertion": {
"kind": "whole_image_fingerprint_equals",
"reference_image_digest": "sha256:bba41cf6d867b319b05282e2e94746cebf6f0bd1dbf7dcc3c1666813f7241847",
"reference_source_revision": "5c4e28578cf3c632faca77bf9d81cd18e95c635f",
"reference_image_digest": "sha256:37d5f594a66a7fdb95cf1d5478e8a47a52ffc14c9b1dc5aad0c3ab340fd5e9be",
"reference_source_revision": "d1a6c7b925faf35dbc5a9f3269991f0d5e722f92",
"reference_provenance": "official_candidate",
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"files": [
{
"path": "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2",
Expand All @@ -178,10 +178,10 @@
},
{
"path": "/usr/local/bin/relay",
"sha256": "sha256:5195ece8083b3641203133e85a78f51728c679cebda50fec24e830df743a4d87"
"sha256": "sha256:2a8f45dc3c70522d2e35714af42a24826fdbbdc1d59deafc475067d0393489ce"
}
],
"definition_digest": "sha256:ec054e4a5d653ee76f29d9a14ec0d3319a3885025ed932e1e8dda10cda907aeb"
"definition_digest": "sha256:3534073aa3178748d2a7fbd445d948c339a4b32a9d788c31fc9ef628e16f438b"
}
},
{
Expand All @@ -191,8 +191,8 @@
"severity": "High",
"status": "accepted_risk",
"owner": "@jeremi",
"rationale": "Debian classifies the Trixie issue as minor/no-DSA and has no Trixie fix. The official v0.23.0 Linux AMD64 Relay candidate had no effective vulnerable DNS-printing path in the reviewed bytes. A candidate must retain the complete ordered reference rootfs layers, the production OCI process contract, and the Syft-bound executable closure digests.",
"reviewed_at": "2026-08-20",
"rationale": "Debian classifies the Trixie issue as minor/no-DSA and has no fixed Trixie version. The official v0.24.0 Linux AMD64 Relay candidate had no effective deprecated resolver-printing path in the reviewed bytes: the reviewed binary imports __res_init and none of the deprecated resolver-printing helpers. A candidate must retain the complete ordered reference rootfs layers, the production OCI process contract, and the Syft-bound executable closure digests.",
"reviewed_at": "2026-08-22",
"expires_at": "2026-09-03",
"invalidation_triggers": [
"candidate_image_identity_mismatch",
Expand All @@ -209,14 +209,14 @@
"runtime_config_changed",
"runtime_base_changed"
],
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"component_layer_id": "sha256:3a7299f559d987305122c7669fc3643095eb0955f8ff4a38c9430d54d0b4452e",
"exposure_assertion": {
"kind": "whole_image_fingerprint_equals",
"reference_image_digest": "sha256:bba41cf6d867b319b05282e2e94746cebf6f0bd1dbf7dcc3c1666813f7241847",
"reference_source_revision": "5c4e28578cf3c632faca77bf9d81cd18e95c635f",
"reference_image_digest": "sha256:37d5f594a66a7fdb95cf1d5478e8a47a52ffc14c9b1dc5aad0c3ab340fd5e9be",
"reference_source_revision": "d1a6c7b925faf35dbc5a9f3269991f0d5e722f92",
"reference_provenance": "official_candidate",
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"files": [
{
"path": "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2",
Expand All @@ -236,10 +236,10 @@
},
{
"path": "/usr/local/bin/relay",
"sha256": "sha256:5195ece8083b3641203133e85a78f51728c679cebda50fec24e830df743a4d87"
"sha256": "sha256:2a8f45dc3c70522d2e35714af42a24826fdbbdc1d59deafc475067d0393489ce"
}
],
"definition_digest": "sha256:ec054e4a5d653ee76f29d9a14ec0d3319a3885025ed932e1e8dda10cda907aeb"
"definition_digest": "sha256:3534073aa3178748d2a7fbd445d948c339a4b32a9d788c31fc9ef628e16f438b"
}
},
{
Expand All @@ -249,8 +249,8 @@
"severity": "High",
"status": "accepted_risk",
"owner": "@jeremi",
"rationale": "Debian marks the Trixie issue postponed with no fixed Trixie version, and Grype reports it wont-fix. The advisory is an unbounded pending-connection queue in the OpenSSL QUIC server path. The official v0.23.0 Linux AMD64 Relay candidate links no OpenSSL library: the reviewed binary declares only libgcc_s.so.1, libm.so.6, libc.so.6, and the program interpreter as NEEDED, contains no libssl.so.3 or libcrypto.so.3 name to load dynamically, and terminates TLS with rustls and aws-lc-rs rather than OpenSSL. libssl3t64 ships in the pinned distroless base and no image process opens it. A candidate must retain the complete ordered reference rootfs layers, which pin every libssl3t64 byte, the production OCI process contract, and the Syft-bound reviewed file digests.",
"reviewed_at": "2026-08-20",
"rationale": "Debian marks the Trixie issue postponed with no fixed Trixie version, and Grype reports it wont-fix. The advisory is an unbounded pending-connection queue in the OpenSSL QUIC server path. The official v0.24.0 Linux AMD64 Relay candidate links no OpenSSL library: the reviewed binary declares only libgcc_s.so.1, libm.so.6, libc.so.6, and the program interpreter as NEEDED, contains no libssl.so.3 or libcrypto.so.3 name to load dynamically, and terminates TLS with rustls and aws-lc-rs rather than OpenSSL. libssl3t64 ships in the pinned distroless base and no image process opens it. A candidate must retain the complete ordered reference rootfs layers, which pin every libssl3t64 byte, the production OCI process contract, and the Syft-bound reviewed file digests.",
"reviewed_at": "2026-08-22",
"expires_at": "2026-09-03",
"invalidation_triggers": [
"candidate_image_identity_mismatch",
Expand All @@ -267,14 +267,14 @@
"runtime_config_changed",
"runtime_base_changed"
],
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"component_layer_id": "sha256:80bb2aedf42cbf9911cb9073be23406c0e7f799f8083bf13a1cd2d460a25e383",
"exposure_assertion": {
"kind": "whole_image_fingerprint_equals",
"reference_image_digest": "sha256:bba41cf6d867b319b05282e2e94746cebf6f0bd1dbf7dcc3c1666813f7241847",
"reference_source_revision": "5c4e28578cf3c632faca77bf9d81cd18e95c635f",
"reference_image_digest": "sha256:37d5f594a66a7fdb95cf1d5478e8a47a52ffc14c9b1dc5aad0c3ab340fd5e9be",
"reference_source_revision": "d1a6c7b925faf35dbc5a9f3269991f0d5e722f92",
"reference_provenance": "official_candidate",
"runtime_definition_digest": "sha256:1b53d7b56025114b448e6a8d613108897641ca9de1299c81e237fa037ed2cce1",
"runtime_definition_digest": "sha256:f5f25e00c19e62d4307f757c4d424e6d647e444d49ecd2410d08742e2a4dc5e2",
"files": [
{
"path": "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2",
Expand All @@ -294,10 +294,10 @@
},
{
"path": "/usr/local/bin/relay",
"sha256": "sha256:5195ece8083b3641203133e85a78f51728c679cebda50fec24e830df743a4d87"
"sha256": "sha256:2a8f45dc3c70522d2e35714af42a24826fdbbdc1d59deafc475067d0393489ce"
}
],
"definition_digest": "sha256:ec054e4a5d653ee76f29d9a14ec0d3319a3885025ed932e1e8dda10cda907aeb"
"definition_digest": "sha256:3534073aa3178748d2a7fbd445d948c339a4b32a9d788c31fc9ef628e16f438b"
}
}
]
Expand Down
11 changes: 9 additions & 2 deletions release/OPERATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ prefix of the candidate's authoritative uncompressed DiffIDs:

```sh
baseline=products/relay-v2/security/advisory-baseline.json
# Evidence and Mint use release/security/<name>-advisory-baseline.json.
# Discovery, Evidence, and Mint use release/security/<name>-advisory-baseline.json.
jq --slurpfile baseline "${baseline}" -e '
.rootfs.diff_ids[0:($baseline[0].runtime.layer_ids | length)]
== $baseline[0].runtime.layer_ids
Expand Down Expand Up @@ -394,7 +394,14 @@ These are `.rootfs.diff_ids`, not the compressed digests in a manifest's
PY
```

5. Check the edited baseline against the regenerated candidate evidence, then
5. Move the live pins in `release/scripts/test_check_advisory_baselines.py`
forward by hand: `LIVE_REFERENCE_IMAGE_DIGESTS`,
`LIVE_REFERENCE_SOURCE_REVISION`, and `LIVE_REVIEW_EVALUATION_DATE`. That
test restates the reviewed evidence instead of reading it back out of the
baselines, so a renewal that skips this step fails it. A service renewed for
the first time also joins `LIVE_BASELINES`, `LIVE_REFERENCE_PROVENANCE`, and
`LIVE_EXECUTABLES`.
6. Check the edited baseline against the regenerated candidate evidence, then
rerun the focused advisory tests and candidate workflow. Never invent a
digest or reuse evidence from a different candidate.

Expand Down
2 changes: 1 addition & 1 deletion release/scripts/check-gates-inventory.py
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@
"Candidate cleanup exact package allowlist",
"release/scripts/cleanup-release-candidates.py",
(
'CANDIDATE_PACKAGES = (\n # Listing an absent package fails closed, so a candidate name joins this\n # allowlist with the release that first publishes it.\n "evidence-candidate",\n "mint-candidate",\n "relay-candidate",\n)',
'CANDIDATE_PACKAGES = (\n # Listing an absent package fails closed, so a candidate name joins this\n # allowlist with the release that first publishes it.\n "discovery-candidate",\n "evidence-candidate",\n "mint-candidate",\n "relay-candidate",\n)',
'PUBLIC_PACKAGES = (\n # Retired public names stay denylisted so cleanup can never delete history.',
' "discovery",\n',
' "evidence",\n',
Expand Down
1 change: 1 addition & 0 deletions release/scripts/cleanup-release-candidates.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
CANDIDATE_PACKAGES = (
# Listing an absent package fails closed, so a candidate name joins this
# allowlist with the release that first publishes it.
"discovery-candidate",
Comment thread
jeremi marked this conversation as resolved.
"evidence-candidate",
"mint-candidate",
"relay-candidate",
Expand Down
14 changes: 9 additions & 5 deletions release/scripts/test_check_advisory_baselines.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,31 @@
CHECKER = Path(__file__).with_name("check-advisory-baselines.py")
LIVE_BASELINES = (
ROOT / "products/relay-v2/security/advisory-baseline.json",
ROOT / "release/security/discovery-advisory-baseline.json",
ROOT / "release/security/evidence-advisory-baseline.json",
ROOT / "release/security/mint-advisory-baseline.json",
)
LIVE_REFERENCE_IMAGE_DIGESTS = {
"relay": "sha256:bba41cf6d867b319b05282e2e94746cebf6f0bd1dbf7dcc3c1666813f7241847",
"evidence": "sha256:8896bc15dd9e16e6c9fff73c1b42f1b953c27f2bc4e3609f6ff567ee60e41979",
"mint": "sha256:94dafa4e93a1864efc1c62ca5e593a5b9f12eddfee71d29aaf4ea68b1f4b5cb5",
"relay": "sha256:37d5f594a66a7fdb95cf1d5478e8a47a52ffc14c9b1dc5aad0c3ab340fd5e9be",
"discovery": "sha256:003c16f68b7231fb43e8c36aa1d549330febf28e6436a617cb9cf3c1ecdb9348",
"evidence": "sha256:010205641f5c90449f50f7de7687572b649e70f6c40c78167e8793a3a5ba63e5",
"mint": "sha256:f6bbc75354bdfc5740555df576e343052c66375dd979cbf3f75fd48a60c42a40",
}
LIVE_REFERENCE_SOURCE_REVISION = "5c4e28578cf3c632faca77bf9d81cd18e95c635f"
LIVE_REFERENCE_SOURCE_REVISION = "d1a6c7b925faf35dbc5a9f3269991f0d5e722f92"
# The date the live exceptions below were reviewed against, stated here rather
# than derived from the baselines: deriving it from their own reviewed_at values
# would make the checker's future-dated guard unreachable for the newest
# exception. Move it forward by hand when the baselines are renewed.
LIVE_REVIEW_EVALUATION_DATE = "2026-08-20"
LIVE_REVIEW_EVALUATION_DATE = "2026-08-22"
LIVE_REFERENCE_PROVENANCE = {
"relay": "official_candidate",
"discovery": "official_candidate",
"evidence": "official_candidate",
"mint": "official_candidate",
}
LIVE_EXECUTABLES = {
"relay": "/usr/local/bin/relay",
"discovery": "/usr/local/bin/discovery",
"evidence": "/usr/local/bin/evidence",
"mint": "/usr/local/bin/mint",
}
Expand Down
2 changes: 2 additions & 0 deletions release/scripts/test_cleanup_release_candidates.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def test_dry_run_uses_server_time_and_does_not_delete(self) -> None:
def test_apply_deletes_expired_versions_from_all_candidates(self) -> None:
client = FakeClient(
{
"discovery-candidate": [version(6, "2026-07-03T00:00:00Z")],
"evidence-candidate": [version(4, "2026-07-03T00:00:00Z")],
"mint-candidate": [version(5, "2026-07-03T00:00:00Z")],
"relay-candidate": [version(3, "2026-07-03T00:00:00Z")],
Expand All @@ -83,6 +84,7 @@ def test_apply_deletes_expired_versions_from_all_candidates(self) -> None:
)
self.assertEqual(
[
("discovery-candidate", 6),
("evidence-candidate", 4),
("mint-candidate", 5),
("relay-candidate", 3),
Expand Down
Loading