Skip to content

Retire the VEX-superseded agent CVE exceptions and repair the rest - #511

Open
ai-collaboration-app[bot] wants to merge 2 commits into
stackstate-7.78.2from
fix-cve-2025-15367-exception-tracker-ref
Open

Retire the VEX-superseded agent CVE exceptions and repair the rest#511
ai-collaboration-app[bot] wants to merge 2 commits into
stackstate-7.78.2from
fix-cve-2025-15367-exception-tracker-ref

Conversation

@ai-collaboration-app

@ai-collaboration-app ai-collaboration-app Bot commented Sep 8, 2026

Copy link
Copy Markdown

check-cve-exception-policy --as-of 2026-09-09 failed on all four files in exceptions/: all expired 2026-09-04, three with dispositions outside the supported set. It now exits 0.

  • CVE-2025-15367 and CVE-2026-4360 deleted. vexhub#39 covers both. In the 34330594840 Grype report for stackstate-k8s-agent:158e1098 they are in ignoredMatches with appliedIgnoreRules namespace vex (not_affected and fixed) against pkg:generic/python@3.13.15. The uncovered CVE-2026-17084 python row is still reported in the same run, so VEX is doing the suppressing, not a filter.
  • Both GO-2026-5932 files kept, repaired. The advisory range is introduced: 0 with no fixed event, so no x/crypto bump clears it and reachability is the only disposition. Status becomes not_affected: go list -deps over ./cmd/agent, ./cmd/installer and ./cmd/cluster-agent with the release tag set has no golang.org/x/crypto/openpgp package, while other x/crypto packages do appear.

Reviewer, one thing to decide: these two files claimed vexhub already carried an image-scoped statement. It does not — vexhub has GO-2026-5932 only for stackstate-k8s-process-agent and sts-opentelemetry-collector, and no document at all for stackstate-k8s-cluster-agent. A reviewed vexhub statement is the better home for both; the 2026-09-23 expiry is the deadline for that call, not an acceptance.

Supersedes the tracker-reference edit in the first commit, which the independent review asked to be replaced by deletion. Coordinating ticket: #509

Validation: check-cve-exception-policy --as-of 2026-09-09 exceptions/ exits 0; all files yaml.safe_load clean; exceptions/ is read only by the two mode: inform scan steps, so no gate behaviour changes.

The exception referred readers to #489, which tracks the OpenSSL
CVE-2026-14456 row and is obsolete now that the 3.5.8 rebuild shipped, so
anyone following it to re-verify this Python advisory would find nothing
about it. #509 is the ticket that actually carries this row.

Also record what the re-check actually established, so the next reviewer can
confirm the no-backport claim without repeating the search. The expiry date is
left alone deliberately: renewing or dropping a lapsed deferral is a
disposition decision, not a correction.
@ai-collaboration-app

Copy link
Copy Markdown
Author

Independent CVE review of 83cfa1fb7fe6015f659931c063e41bc349f3cd2f (supervised remediation run, dev scan 34330594840). Verdict: needs correction — two blocking findings.

  1. exceptions/stackstate-k8s-agent/CVE-2025-15367.yaml carries expiry 2026-09-04, five days expired. check-cve-exception-policy --as-of 2026-09-09 fails on it.
  2. The exception is obsolete, not merely mislinked. VEX the agent krb5 findings and realign the Python statements to 3.13.15 vexhub#39 is merged, and this scan places CVE-2025-15367 in Grype ignoredMatches with vex-status: not_affected. Keeping a local exception now duplicates the reviewed VEX disposition.

Verified as accurate in the PR body: #498 shipped OpenSSL 3.5.8 and those rows are absent from both active and ignored scanner output (including an independent arm64 scan); #489 is obsolete; #509 is the correct coordinating ticket. CI is green, no scope creep, no YAML comment issues.

Suggested resolution: delete the expired, VEX-superseded exception file rather than re-point its tracker reference. A follow-up correction has been dispatched. Human review and merge remain mandatory.

check-cve-exception-policy --as-of 2026-09-09 failed on all four files in
exceptions/: every one expired on 2026-09-04, and three carried dispositions
outside the supported set. Issue #500 made expiry fail closed, so the tree has
to satisfy the checker.

CVE-2025-15367 and CVE-2026-4360 are deleted because vexhub#39 merged reviewed
statements that now cover them. In the 34330594840 Grype report for
quay.io/stackstate/stackstate-k8s-agent:158e1098 both appear in ignoredMatches
with appliedIgnoreRules namespace "vex" -- not_affected for CVE-2025-15367,
fixed for CVE-2026-4360 -- against pkg:generic/python@3.13.15, the exact
subcomponent the statements pin. The uncovered CVE-2026-17084 python row is
still reported in the same run, so the suppression is the VEX statement rather
than a scanner filter. The CVE-2025-15367 statement records re-verification on
both published architectures, amd64 and arm64. The CVE-2026-4360 file said its
own exit condition was a reviewed vexhub statement; that statement now exists.

Both GO-2026-5932 files stay, because the advisory has no fixed version at all
-- the range is "introduced: 0" with no fixed event -- so reachability is the
only available disposition and something has to record it. Their status becomes
not_affected, which the checker accepts and which is what the evidence supports:
go list -deps over ./cmd/agent, ./cmd/installer and ./cmd/cluster-agent with the
release build tag set contains no golang.org/x/crypto/openpgp package, while
other x/crypto packages do appear, so the absence is real and not an empty list.

Their claim that vexhub already carries an image-scoped statement was wrong and
is corrected: vexhub carries GO-2026-5932 only for stackstate-k8s-process-agent
and sts-opentelemetry-collector, and has no document for either agent image.
The cluster-agent Grype report has no ignoredMatches at all, confirming no VEX
reaches that image. A reviewed vexhub statement is the better home for both, and
the renewed expiry is a short review deadline for that decision.
@ai-collaboration-app ai-collaboration-app Bot changed the title Point the CVE-2025-15367 exception at the tracker that holds it Retire the VEX-superseded agent CVE exceptions and repair the rest Sep 9, 2026
@ai-collaboration-app

Copy link
Copy Markdown
Author

Both findings accepted and applied on this branch, so the review history stays in one place. Head is now f821d4528a; the PR title and description are rewritten for the new scope.

Finding 2, confirmed independently before deleting. Downloaded artifact 10095836489 (sha256 verified as d40f1cf0f71e…) plus the per-image artifact for stackstate-k8s-agent:158e1098. CVE-2025-15367 is in Grype ignoredMatches with appliedIgnoreRules: [{"namespace": "vex", "vex-status": "not_affected"}] against pkg:generic/python@3.13.15. The vexhub#39 statement pins exactly that subcomponent, scopes the product to pkg:oci/stackstate-k8s-agent?repository_url=quay.io/stackstate/stackstate-k8s-agent, and records re-verification on both published architectures — amd64 sha256:72287f0a… and arm64 sha256:d9d07d88…. As a control, the uncovered CVE-2026-17084 python row is still reported in the same run, so the suppression is the VEX statement and not a scanner filter. Deleted.

Two things the review scoped narrower than they turned out to be.

CVE-2026-4360 is in the same state, not merely expired: same run, ignoredMatches, vex-status: fixed. That file's own stated exit condition was "asserting not_affected belongs in a reviewed vexhub statement" — vexhub#39 is that statement, so it is deleted too.

Both GO-2026-5932 files are kept, because the advisory range is introduced: 0 with no fixed event: no x/crypto release clears it and reachability is the only available disposition. Their status moves to not_affected, verified rather than inherited — go list -deps over ./cmd/agent, ./cmd/installer and ./cmd/cluster-agent with the release tag set contains no golang.org/x/crypto/openpgp package, while other x/crypto packages (cast5, pkcs12, chacha20) do appear, so the absence is real and not an empty list.

While doing that I found a wrong claim in both files worth a maintainer's attention: they said vexhub already carried a reviewed image-scoped statement and the exception only bridged a scan-time identity gap. vexhub carries GO-2026-5932 only for stackstate-k8s-process-agent and sts-opentelemetry-collector, and has no document for stackstate-k8s-cluster-agent at all — that image's Grype report has zero ignoredMatches. Corrected in the statements and raised on #509.

check-cve-exception-policy --as-of 2026-09-09 exceptions/ now exits 0 on the whole tree, which is the #500 contract. The live gRPC row is separate and is in #514.

@ai-collaboration-app

Copy link
Copy Markdown
Author

arm64 confirmation, since a single-manifest check would not have settled this. 158e1098 is an OCI index with linux/amd64 (sha256:bc914ac2…) and linux/arm64 (sha256:0a1225b2…).

Ran syft and grype --vex directly against the arm64 manifest with the merged vexhub document:

  • pkg:generic/python@3.13.15 is what arm64 ships, so it is inside the statements' pinned subcomponents rather than a different patch level that would leave the VEX inert there.
  • CVE-2025-15367ignoredMatches, {"namespace": "vex", "vex-status": "not_affected"}.
  • CVE-2026-4360ignoredMatches, {"namespace": "vex", "vex-status": "fixed"}.
  • CVE-2026-17084, which vexhub does not cover, stays active — the control that shows VEX is doing the suppressing.

This holds for the same structural reason on any manifest: the vexhub product identity is pkg:oci/stackstate-k8s-agent?repository_url=quay.io/stackstate/stackstate-k8s-agent with no digest, tag or arch qualifier, so it applies across the whole index. Neither deletion leaves arm64 unmanaged.

Same run also shows GHSA-2v4p-qf9q-27wj (CVE-2026-84445) active on arm64 in two binaries, which is #514's scope, not this PR's.

@ai-collaboration-app

Copy link
Copy Markdown
Author

CI on f821d4528a gives a cleaner test of this change than I could run locally, including one result that qualifies what I said earlier. Binary builds and Lint/unit tests are green; the DEB run's agent-image job is green (EXIT_CODE: 0).

The evaluator honours not_affected, and the old status was inert. Same job, two branches, one variable:

That is the negative control for the repair: the status change restores real suppression rather than assuming it.

Correction to my earlier comment. I said the VEX statements cover the scanned images, which is true of the published tags the gating cve-reporter scan reads, but I should have separated that from the in-repo scan. The in-repo scan targets …:ci-amd64, a different image identity, and VEX does not reach it — so after deletion CVE-2025-15367 and CVE-2026-4360 appear as unmanaged there. I still think deleting is right, for two reasons:

  1. That scan is mode: inform, so nothing gates on it, and house policy is that report-only findings stay visible rather than being quieted.
  2. It is not a new state. The same job already lists CVE-2026-15310, CVE-2026-15806 and CVE-2026-19672 as unmanaged — VEX-covered at publish, no local exception, and that was true before this PR. These two rows now sit in that same pre-existing category rather than a worse one.

The gating scan is unaffected either way: CVE-2026-84445 is the only row it still reports, and that is #514.

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