Repository navigation
[stackstate-agent] Dev scan 34027081656: bump x/crypto to 0.56.0 and grpc to 1.83.1; krb5 and python rows need a human VEX or exception decision #509
Description
Canonical remediation ticket for the stackstate-agent rows in the dev chart scan 34027081656 (attempt 1, source 7c83f371, finding artifact sha256:78a1aa7f9d07). Coordinated from cve-reporter#29.
Both attributed targets scanned successfully, so this run is complete evidence for this repository:
| Target | Gate |
|---|---|
quay.io/stackstate/stackstate-k8s-agent:ff38da51 |
failed (CVE gate) |
quay.io/stackstate/stackstate-k8s-cluster-agent:ff38da51 |
failed (CVE gate) |
16 unique advisories: 7 HIGH, 5 MEDIUM, 1 LOW (the aggregate lists 11 HIGH rows because CVE-2026-84304 appears four times across two scanners and two targets).
The chart has caught up. Both images are now built from ff38da51, the merge of #498. Every embedded-OpenSSL row from the previous cycle is gone from this scan, which is the delivery evidence #489 was waiting on — closing that child is a human call.
Fixable in source now — three advisories, two Go dependencies
| Severity | CVE | Package | Installed | Fixed in | Verified against |
|---|---|---|---|---|---|
| HIGH | CVE-2026-56855 | golang.org/x/crypto |
v0.55.0 | 0.56.0 | GO-2026-6355 |
| HIGH | CVE-2026-78662 | golang.org/x/crypto |
v0.55.0 | 0.56.0 | GO-2026-6354 |
| HIGH | CVE-2026-84304 | google.golang.org/grpc |
v1.82.1 | 1.83.1 | GHSA-vp52-pcj8-j9qc |
Confirmed each fix version against the authoritative advisory rather than trusting the scanner lead:
CVE-2026-56855= GO-2026-6355 andCVE-2026-78662= GO-2026-6354, both "DoS on deadlocked channel" defects ingolang.org/x/crypto/ssh, bothfixed: 0.56.0.v0.56.0is the current latest release.CVE-2026-84304= GHSA-vp52-pcj8-j9qc, "gRPC-Go: Heap Memory Exhaustion (OOM) via HTTP/2 DATA Frame Fragmentation", vulnerable<= 1.83.0, first patched1.83.1.
The open dependabot PRs do not fix this
The scan pins both findings to the root module, and that is where the shipped binaries come from. Neither open grpc PR touches it:
- #503 bumps
comp/otelcol/otlp/components/statsprocessor. That module is absent fromgo.workand not required by the rootgo.mod, so it reaches no shipped binary. Same category asdatadogconnectorandtest/integration/serverless/src. - #504 bumps
test/e2e-framework, a test-only workspace module that ships in no image.
#503 remains independently valid for its own module and is not duplicated by this work. #504 is subsumed: go work sync from the root bump already moves test/e2e-framework to grpc v1.83.1, so it can be closed as redundant once this lands.
The thrift PRs #505/#506 are not part of this workstream. No thrift row is attributed to stackstate-agent in this scan; the thrift advisory in this cycle (CVE-2026-43871, maven libthrift) belongs to stackgraph.
No adoptable fix — deferred, human decision
Nine rows have no adoptable fix, plus one row that is already fixed in the shipped build but
misreported by the scanner. That split matters: lumping all ten together as "no fix" would have carried a
false claim into the record. Per the terminal conditions these are recorded as deferred; no .trivyignore
entry and no local suppression has been added, and no VEX statement is proposed for approval here.
Nine with no adoptable fix
| Severity | CVE | Package | Installed | Fix status |
|---|---|---|---|---|
| HIGH | CVE-2007-3149 | krb5 |
1.21.3 | none published — and not this component (see below) |
| HIGH | CVE-2007-5894 | krb5 |
1.21.3 | none published — and not this component (see below) |
| HIGH | CVE-2026-40355 | krb5 |
1.21.3 | fix committed upstream but unreleased |
| HIGH | CVE-2026-40356 | krb5 |
1.21.3 | fix committed upstream but unreleased |
| MEDIUM | CVE-2025-15367 | python |
3.13.15 | only 3.15.0a6, a pre-release of an unreleased minor |
| MEDIUM | CVE-2026-15806 | python |
3.13.15 | none published |
| MEDIUM | CVE-2026-17084 | python |
3.13.15 | none published |
| MEDIUM | CVE-2026-19672 | python |
3.13.15 | none published |
| LOW | CVE-2026-15310 | python |
3.13.15 | none published |
All nine are Grype-only matches on generic: sources. Refined findings on the krb5 group:
CVE-2026-40355/CVE-2026-40356are true positives with no released fix. Upstream committed the
fix, but 1.22.3 is unreleased and 1.22.2 is still in the affected range, so even bumping to the latest
release would not clear them. Both also need the acceptor side (gss_accept_sec_context()) plus a NegoEx
entry in/etc/gss/mech, which is not provisioned anywhere in this repo — suggestive of
non-reachability, but not proven by symbol-level callgraph analysis.CVE-2007-3149/CVE-2007-5894are versionless-CPE mismatches, not merely "old CVEs on a new
release": the first is a sudo defect and the second a vendor-disputed gssftpftpdissue. Neither is
the shippedlibkrb5.so.3.3.- krb5 is embedded only to satisfy the msodbcsql18 ODBC driver (
deps/repos.MODULE.bazel).
One already fixed in the shipped build, misreported by the scanner
| Severity | CVE | Package | Installed | Actual status |
|---|---|---|---|---|
| MEDIUM | CVE-2026-4360 | python |
3.13.15 | already fixed in the installed interpreter |
python/cpython@eee3ddf0 is the 3.13 backport, and eee3ddf0...v3.13.15 gives behind_by: 0, so the fix
is an ancestor of the v3.13.15 tag that this image ships. The scanner reports "no fixed version" because
the PSF advisory expresses the fix only as git commits with no version ranges, and the first commit it
lists — python/cpython@c37a4fdf — is the 2012-04-06 "bump to 3.1.5 final" release commit that the
lightweight v3.1.5 tag points at. A deriver resolving that commit to its nearest tag produces "fixed in
3.1.5", which is precisely the single < 3.1.5 CPE range NVD carries, roughly fourteen years before this
advisory was published.
Its exception file is corrected and left under_investigation: retiring it would turn the row unmanaged,
and asserting not_affected belongs in a reviewed vexhub statement, so the disposition stays with the
owner.
Child items stay open and linked: #489,
vexhub#34,
vexhub#38.
Next action: @StackVista/observability-team decides, per package, between a reviewed vexhub statement and a scoped dated exception. An agent can prepare the evidence; the choice is a person's.
Four exception files lapsed two days ago
All four files under exceptions/ carry expires: '2026-09-04'. Today is 2026-09-06, so every one of them is expired:
exceptions/stackstate-k8s-agent/CVE-2025-15367.yamlexceptions/stackstate-k8s-agent/CVE-2026-4360.yamlexceptions/stackstate-k8s-agent/GO-2026-5932.yamlexceptions/stackstate-k8s-cluster-agent/GO-2026-5932.yaml
The fail-closed behaviour #500 established is live, but it lives in image-pipeline, not this repo — which is why #501 was closed unmerged. evaluator/evaluate.go treats a missing or unparseable expiry, or any date before today, as Expired, and ExitCode fails gate mode on Expired > 0. So nothing is silently lapsing in a gating sense.
It is not currently failing either, and that is the thing to understand: this repository's own image scan runs mode: inform (report-only, since #487), and inform returns 0 unconditionally. So the four expired files produce a report-only note here and gate nothing. Renewing or retiring those dates is part of the human decision above.
Note GO-2026-5932 survives the x/crypto bump: it is the "openpgp package is unmaintained" advisory with introduced: 0 and no fixed version in any release, so it applies to v0.56.0 exactly as it did to v0.55.0. Its two exception files are kept, with the pinned purl moved to v0.56.0 so the record stays truthful. Their expiry dates are untouched — that is the owner's call.
Remaining work
- Land the root-module bump (PR linked in the checkpoint comment below) and follow required CI to a terminal state.
- Wait for the next complete dev chart scan to confirm the three Go rows clear on republished images. A merged PR is not closure evidence.
- Human decision on the nine no-adoptable-fix rows, on the
CVE-2026-4360disposition, and on the four lapsed expiry dates.
This ticket stays open. Closure needs a later complete dev scan showing every target for this repository clean.
Activity
ai-collaboration-app commentedon Sep 6, 2026
Checkpoint — code candidate open
cve-xcrypto-0.56.0-grpc-1.83.1c22f7cbdd624db32f91d92b599db38b9b42f05347c83f371)c22f7cbdd624db32f91d92b599db38b9b42f0534(reviewed clean, round 3)Three signed commits:
b96bbeacbumps the root module,56675787corrects one exception record, andc22f7cbdfixes a date error that review caught in that correction.Round 2 review findings — both accepted and addressed. Review was right on both counts, and the second
one improved the evidence rather than just the wording:
accurate split is nine with no adoptable fix plus one fixed-but-scanner-misreported. Corrected in
this checkpoint, in the ticket body and in the Bump x/crypto to 0.56.0 and grpc to 1.83.1 for three HIGH CVE rows #510 description. This mattered — the old wording
contradicted the very correction the second commit had made.
years, not sixteen. Fixed in
c22f7cbd, which also replaces the vaguer "obvious data-entry artifact"claim with the traceable cause: the PSF advisory's first listed fix commit,
python/cpython@c37a4fdf, is the 2012-04-06 "bump to 3.1.5 final" release commit that the lightweightv3.1.5tag points at, so a deriver resolving it to its nearest tag yields "fixed in 3.1.5" — exactlythe
< 3.1.5CPE range NVD carries.Delivered
Three HIGH rows fixed at the root module, which is where every shipped binary comes from:
CVE-2026-56855(GO-2026-6355) andCVE-2026-78662(GO-2026-6354) —golang.org/x/cryptov0.55.0 → v0.56.0CVE-2026-84304(GHSA-vp52-pcj8-j9qc) —google.golang.org/grpcv1.82.1 → v1.83.1Evidence
golang.org/x/crypto/sshdeadlock DoS bugs withfixed: 0.56.0; the grpc CVE is HTTP/2 DATA-frame heap exhaustion, vulnerable<= 1.83.0, first patched1.83.1.go version -mon binaries built for both published architectures — installer amd64, installer arm64, cluster-agent amd64 — all report x/cryptov0.56.0and grpcv1.83.1, with zero occurrences ofv0.55.0orv1.82.1in the embedded module graphs.go.sumno longer carries x/cryptov0.55.0.go get→go work sync→go mod tidy), reproducing CI'scheck-mod-tidy.go list -depsshows the cluster-agent links neitherx/crypto/sshnorx/crypto/openpgp, matching the scan attributing x/crypto rows to the agent image only.statsprocessor) is absent fromgo.workand not required by the rootgo.mod, so it reaches no shipped binary and does not substitute for this bump; Bump google.golang.org/grpc from 1.82.1 to 1.83.1 in /test/e2e-framework #504 (test/e2e-framework) is test-only and is subsumed bygo work sync. Bump github.com/apache/thrift from 0.22.0 to 0.24.0 in /comp/otelcol/collector-contrib/impl #505/Bump github.com/apache/thrift from 0.22.0 to 0.24.0 #506 (thrift) belong to nostackstate-agentrow this cycle.image-pipeline/schemas/exception.schema.json.CI reached a terminal state
All three required workflows completed successfully at
56675787— the head this section describes — so the per-architecture shippedartifacts are now verified by CI rather than only by the local approximation below:
Go module tidiness (go.mod / go.sum)Go module tidinesspassing is the check that matters most for this change: it re-runsgo work syncand
go mod tidyper module and fails on any diff, independently confirming the 186-module tidy result.The agent binary builds passing on both architectures also retires a local-only compile error seen
during verification — that came from an ad-hoc build-tag combination, not from this change, which
touches no Go source (26
go.mod, 25go.sum, 3 YAML).No review comments and no requested changes on #510 as of this checkpoint.
Scanner-verified, not just version-verified
The cluster-agent image was rebuilt locally from the bumped binary against the real
bci-microbase and rescanned with all three required scanners.CVE-2026-84304is gone:UNKNOWN,LOW,MEDIUM,HIGH,CRITICALGO-2026-5932(x/crypto v0.56.0, UNKNOWN)cluster-agentbinary directlyGO-2026-5932cluster-agentbinary directlyThe single remaining row is the no-fix openpgp advisory whose exception was deliberately kept — exactly the expected residue, and confirmation that dropping those two files would have turned it unmanaged.
The local run had a real scope limit — a placeholder config, and the agent image could not be built
locally at all because it needs the full omnibus DEB. CI has now closed that gap. All four published
image variants were rebuilt and rescanned at
56675787by the report-onlyscan-imageaction(Trivy vuln + Grype, VEX-aware, plus a separate Trivy secret scan at
UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL):CVE-2026-56855,CVE-2026-78662orCVE-2026-84304in any of the four scan logs, and zero HIGH rows anywhere.No secrets detected in image.on every variant.GO-2026-5932againstx/crypto v0.56.0— the no-fix openpgpadvisory whose exception was deliberately kept. It correctly reports at the new version, confirming
the purl update tracked the bump and that dropping those files would have turned the row unmanaged.
One discrepancy to record rather than smooth over: no krb5 row appears in any of the four CI scans,
though the chart scan surfaced four krb5 HIGHs on the published
ff38da51agent image. The likely reasonis that this CI action is VEX-aware and vexhub carries krb5 statements (vexhub#34, vexhub#38), whereas the
chart scan matches VEX by published image identity and so does not apply them to a freshly built commit
image. That is inference, not proof — I did not verify vexhub's contents. It does not discharge the krb5
obligation: the chart scan is the gating signal, it still reports those rows, and the human VEX-versus-
exception decision stands.
The expiry lapse is now CI-proven, not just inferred
The agent scans report
expired: 3and the cluster-agent scansexpired: 1— all fourexceptions/files, named explicitly in the log with
expired 2026-09-04. This is direct confirmation that expiryevaluation is fail-closed (the evaluator classifies past-dated exceptions as
Expired, not assuppressions — note
suppressed by exception: 0on every variant) and that ingatemode these wouldfail the build. They do not fail here only because this repository's own scan runs
mode: inform, whichreturns 0 unconditionally. So nothing is silently lapsing in a gating sense, but nothing is protecting
these rows either.
Corrections made
GO-2026-5932exception files kept for both images —introduced: 0, no fixed version in any release, so it survives the bump. Only the pinned purl moved tov0.56.0. Expiry untouched.CVE-2026-4360exception corrected: its claim of "no upstream fix in any release line" is false.python/cpython@eee3ddf0is the 3.13 backport andeee3ddf0...v3.13.15givesbehind_by: 0, so the embedded 3.13.15 already carries the fix. Set tounder_investigation; disposition left to the owner.Deferred — human decision, owner
@StackVista/observability-teamNo VEX approved, no
.trivyignoreentry, no local suppression added.CVE-2026-40355,CVE-2026-40356are true positives with no released fix: upstream committed it, but 1.22.3 is unreleased and 1.22.2 remains in range, so even a bump to latest would not clear them.CVE-2007-3149andCVE-2007-5894are versionless-CPE mismatches — the first is a sudo defect, the second vendor-disputed gssftpftpd; neither is the shippedlibkrb5.so.3.3. krb5 is embedded only to satisfy the msodbcsql18 ODBC driver (deps/repos.MODULE.bazel), and both 2026 CVEs need the acceptor side (gss_accept_sec_context()) plus a NegoEx entry in/etc/gss/mech, which is not provisioned anywhere in the repo. Not proven by symbol-level callgraph analysis.CVE-2025-15367,CVE-2026-15806,CVE-2026-17084,CVE-2026-19672,CVE-2026-15310are fixed only in unreleased 3.15/3.16. Re-verified today: latest 3.13 tag isv3.13.15, no backports.Expiry lapse
All four
exceptions/files carryexpires: '2026-09-04'and are expired as of today. Fail-closed is live but lives inimage-pipeline(evaluator/evaluate.gotreats missing, unparseable or past dates asExpired;ExitCodefails gate mode onExpired > 0) — which is why #501 was closed unmerged rather than landing here. Nothing is silently lapsing in a gating sense, but this repo's own image scan runsmode: inform, which returns 0 unconditionally, so these dates gate nothing here.Finalization — CI and rescans now confirmed at this head
The two CI obligations carried in the previous revision are discharged by observed evidence at
c22f7cbd, not by inference from the earlier head:build. 25 checks pass, 17 skipped, 0 failed, 0 pending. (The count differs from the earlier head's
30/12 because publish-path jobs skip differently on this run, not because coverage shrank —
Go module tidiness, all four binary builds and both DEB builds all pass.)job logs rather than taken from the review: zero HIGH rows on every variant, zero occurrences of
CVE-2026-56855,CVE-2026-78662orCVE-2026-84304in any scan log, andNo secrets detected in image.everywhere. Agent variants report 7 in-scope / 0 suppressed / 3 expired / 4 unmanaged;cluster-agent variants 1 / 0 / 1 / 0. The single UNKNOWN per variant remains
GO-2026-5932againstx/crypto v0.56.0— the deliberately kept openpgp exception, still tracking the bump.Expired, neversuppressed (
suppressed by exception: 0on every variant).Round 3 review returned clean with no findings. A clean review is not CVE closure.
Remaining work
REVIEW_REQUIRED,mergeStateStatus BLOCKED, not merged.CVE-2026-4360disposition.statsprocessormodule.ff38da51shipped the OpenSSL fix.Next action: review and merge #510, then
@StackVista/observability-teamtakes the VEX-versus-exception decisions.This ticket stays open. A merged pull request is not closure evidence; closure needs a later complete dev scan showing every target for this repository clean.
ai-collaboration-app commentedon Sep 6, 2026
CVE review audit
56675787de6b7341f19583b676b715f81037fae4findings101470061699/101470061724; four PR image-scan jobs; current PR feedback and 30-pass/12-skip CI; upstream Go/GitHub/CVE records; CPython ancestry;go mod verify; exception parsing; canonical ticket and Project 4 state.Actionable findings:
CVE-2026-4360across the candidate receipt, [stackstate-agent] Dev scan 34027081656: bump x/crypto to 0.56.0 and grpc to 1.83.1; krb5 and python rows need a human VEX or exception decision #509, and PR text. It is not one of ten no-fix rows: the current CNA record fixes the 3.13 line in3.13.15,eee3ddf0is an ancestor ofv3.13.15, and this branch embeds3.13.15. Record nine no-adoptable-fix rows plus one fixed-but-scanner-misreported row; keep any human disposition decision scoped to handling that false positive.3.1.5by 16 years. The official3.1.5artifacts are dated 2012-04-09, so the interval is about 14 years as of this review; use the exact date or nonnumeric wording.Optional suggestions: none.
Fix the CVE-2026-4360 date claim and name the real cause of the bad r…
ai-collaboration-app commentedon Sep 6, 2026
CVE review audit
c22f7cbdd624db32f91d92b599db38b9b42f0534clean101470061699/101470061724; current-head CI runs34040570744,34040570749,34040570726terminal success (25 passed, 17 skipped); image-scan jobs101509107051,101509107034,101512425251,101512425207with zero HIGH rows, no target-CVE occurrences and no secrets; exception schema validation,go mod verify, CPython/OSV/NVD correction, PR feedback, ticket and Project 4 state.Actionable findings: none.
Optional suggestion: refresh the checkpoint CI count from the prior-head
30 passed / 12 skippedto the current-head25 passed / 17 skipped. The partial ticket remains open for review/merge, owner VEX-or-exception and expiry decisions, the krb5 scan discrepancy, Dependabot/#489 follow-up, and a later complete published-chart scan.ai-collaboration-app commentedon Sep 8, 2026
Dev scan 34191503812 checkpoint — stackstate-agent
Verified against the
chart-scan-aggregateartifact of dev scan 34191503812 (source sha3cd8097), which scannedquay.io/stackstate/stackstate-k8s-agent:158e1098, digestsha256:35e66696a1bdc0d470e0d11d7711e426548a09d31190bdd94cd1350b464dc839— this repository's default-branch head158e1098755d8ee4e563348ae0b861fa217a5c1b.No source patch this round. The agent image carries exactly four findings, all on the embedded CPython, and none of them has a shippable fix. What remains is a human disposition decision.
Scope narrowed — but the two halves cleared by different mechanisms
The OpenSSL and krb5 rows are both gone from the agent image. They did not clear the same way, and the difference decides what keeps each one clear:
opensslrows are absent from both GrypematchesandignoredMatches, so the vulnerable version is simply no longer present. The 3.5.8 rebuild from Bump embedded OpenSSL to 3.5.8 (CVE-2026-14456) #498 shipped:omnibus/config/software/openssl3.rb:34anddeps/openssl/version.bzl:1both pin3.5.8, and the CVE-2026-14456 exception was dropped in c251351. Nothing further needed here.ignoredMatcheswithappliedIgnoreRulesnamespacevex, i.e. cleared by merged vexhub statements. That stays true only while those statements keep matching this image identity.stackstate-k8s-cluster-agent:158e1098passed the gate.stackstate-k8s-agent:158e1098isdecision: failed, solely on the four Python rows.The four Python rows on embedded CPython 3.13.15
3.13.15is the newest released 3.13.x — tagsv3.13.0throughv3.13.15, nov3.13.16— so there is no bump target. Verified upstream, not taken from the scanner.urllib.requestHTTPPasswordMgr*matched credentials without regard to URL scheme, so HTTPS-registered credentials can be sent over plain HTTPa2773a34183b7d94a243bb98fd658926cc5348ce(2026-08-18);compare/a2773a34...v3.13.15givesbehind_by: 60— our tag is an ancestor of the fix. Ships in an unreleased 3.13.16.stringprep.map_table_b2/b3and theidnacodec use current Unicode instead of Unicode 3.2.01e54caa09667,5181304bcec9,7e109d084d55, all diverged fromv3.13.15and from the3.13branch head. OSV fix3.15.0rc2— a pre-release.tarfiletar/datafilters create empty directories outside the destination; member contents stay contained< 3.16.0, a version that does not exist. Not in OSV. Only reference is PR python/cpython#156000 — no commit SHAs published, so commit reachability could not be verified.zipfilebzip2/LZMA/Zstandard members decompress with nomax_lengthbound, so a crafted archive drives memory exhaustion1b424c0178a0,31980e84b9a7,f897dbf2f36aall diverged. Fix3.15.0rc2— a pre-release.Reachability in this repository. None of the four affected module paths is referenced by any Python that ships in the image. The only
zipfile/tarfilecallers live undertasks/(invoke build and dev tooling), whichDockerfiles/agent/DockerfileneverCOPYs into the image — they run under the developer/CI system interpreter, not/opt/stackstate-agent/embedded/bin/python3.13. The one Python helper that does ship,Dockerfiles/agent/secrets-helper/readsecret.py, imports onlyargparse,json,os.pathandsys. There is noZIP_BZIP2/ZIP_LZMA/ZIP_ZSTANDARDusage anywhere in the tree.Residual gap: the embedded interpreter also executes checks from StackVista/stackstate-agent-integrations, which is outside this checkout and was not assessed. Any
not_affectedargument has to cover that surface too.VEX versus dated exception — what the evidence shows
This part is empirical rather than a matter of preference:
A repo-local dated exception cannot clear the gating scan. CVE-2025-15367 and CVE-2026-4360 each already have an exception file in this repository, yet what actually cleared them from this gate was
rules=vexin GrypeignoredMatches— merged vexhub statements. The gating chart scan does not readexceptions/at all. The tree's only consumer here is.github/workflows/build-deb.yml:330(exceptions-path: exceptions) running inmode: inform, which always exits 0.So, for the decision:
I am not approving VEX or writing an acceptance — that disposition is yours.
All four exception files are lapsed, and nothing enforces them
Every file in
exceptions/carriesexpires: '2026-09-04', four days past as of 2026-09-08:exceptions/stackstate-k8s-agent/CVE-2025-15367.yamlexceptions/stackstate-k8s-agent/CVE-2026-4360.yamlexceptions/stackstate-k8s-agent/GO-2026-5932.yamlexceptions/stackstate-k8s-cluster-agent/GO-2026-5932.yamlI have not renewed them. Renewing a lapsed deferral is a disposition call.
#501 and #500 disagree, and that needs confirming. #500 is closed as completed, but #501 was closed without merging (
mergeCommit: null) on 2026-09-02, eighteen seconds before #500 was closed.scripts/check_cve_exception_expiry.pyis not present onstackstate-7.78.2, so the expiry dates remain advisory — precisely the gap #500 was filed to close.The code on
cve-exception-expiry-fail-closed(c9414b9) does work. Running it here: against the live tree it exits 1 and names all four lapsed files; against a tree with a future date it exits 0; its own suite passes 10/10 underunittest, covering expired dates, missing dates, malformed YAML, non-mapping documents, ISO week dates, compact dates and invalid calendar dates. So if closing #501 was a deliberate change of direction, #500's rationale is stale. If it was accidental, the branch is ready to land. I have not reopened or re-pushed it either way.Separately, this correction is worth recording: an earlier automated note on #500 stated that #501 was open with green required checks and awaiting review. That is no longer true.
Also verified
CRITICAL,HIGH,MEDIUM,LOW,UNKNOWN): zero secret findings, corroborating the pipeline's own secrets report.GO-2026-5932does not appear for either agent image in this aggregate — it shows up only against astackstate-backup-clirelease asset, a different workstream.Remaining work
not_affectedstatements versus short dated review-window exceptions, noting that only VEX affects the gate.decision: failed.Consolidation
This ticket is the canonical coordinator for the workstream: it is in the affected repository and it carries the marker lineage. cve-reporter#29 has no workstream marker in its body or comments, so I left it unmarked rather than duplicate this one. #489 is obsolete — its subject, the OpenSSL 3.5.7 exception, is remediated as described above — and should be closed against this ticket. No new ticket was created.
Next action: decide VEX versus a short dated exception for the three no-fix Python rows, and confirm whether the #501 expiry guard should land.
ai-collaboration-app commentedon Sep 8, 2026
CVE review audit
158e1098755d8ee4e563348ae0b861fa217a5c1bfindingsChecks:
git rev-parse HEAD,git rev-parse origin/stackstate-7.78.2, the GitHub default-ref API, andgit status --porcelain=v1 --untracked-files=all: exact head158e1098755d8ee4e563348ae0b861fa217a5c1b; clean tree.sha256sum chart-scan-aggregate.zipmatchedsha256:5a385f5415475ccd20f97b8dc23014bb8ab587aeef2523aba7519d485a0d44df; run https://github.com/StackVista/cve-reporter/actions/runs/34191503812 completed, with the agent failing on exactly four Python 3.13.15 rows, the cluster-agent passing, and zero secret findings.jqon the exact per-image Grype evidence: four live Python rows; krb5 1.21.3 rows are ignored only bynamespace=vex; OpenSSL is absent from both matches and ignoredMatches.skopeo inspectfound amd64 and arm64 manifests for both published tags at OCI revision158e1098755d8ee4e563348ae0b861fa217a5c1b; arm64syft/grypeon manifestsha256:0a1225b2921e7fc4e5cd04c6afbfccb641a82223e33dc9cd1c2484eea6e7561ffound Python 3.13.15 with the same four target rows, OpenSSL 3.5.8, and krb5 1.21.3.v3.13.15remains latest;a2773a34183b7d94a243bb98fd658926cc5348ceis 60 commits after the tag, and CVE-2026-19672 backportc7979f3a819011a3222bd16e671264b1e34282cbis on3.13and 69 commits after the tag; CVE-2026-17084/CVE-2026-15310 fix commits diverge from the tag and branch.check-cve-exception-policy --as-of 2026-09-08over all four exception files exited 1: four expired files plus three unsupported dispositions; the2027-01-01variant also exited 1 because 115-day windows exceed policy.python3 -m unittest -v check_cve_exception_expiry_test.pyatc9414b9659ce95652d6c3d9c3bd28656622d47adpassed 10/10; its CLI exited 1 on the live tree but 0 on the2027-01-01variant, so it does not enforce review-window or disposition policy.In review; Fail CI when a CVE exception has passed its expires date #501 is closed unmerged with no reviews/comments; exact-head push CI runs 34062866377, 34062866413 and 34062866425 are green; scheduled DEB run 34274797181 was non-terminal with no failed job at the review cutoff.Actionable findings:
c7979f3a819011a3222bd16e671264b1e34282cbon 2026-08-19; it is on the current3.13branch and 69 commits afterv3.13.15. Move this row out of the no-backport/VEX set and track it with CVE-2026-15806 as a 3.13.16 bump obligation; update the [stackstate-agent] Dev scan 34027081656: bump x/crypto to 0.56.0 and grpc to 1.83.1; krb5 and python rows need a human VEX or exception decision #509 checkpoint and human decision set.c9414b9659ce95652d6c3d9c3bd28656622d47adas ready to land. Its own2027-01-01control passes, while the required policy checker rejects those 115-day windows and three current disposition values. If the guard is revived, enforce the 14-day review window and accepted dispositions, or explicitly scope it as expiry-only and add the missing policy control.exceptions/stackstate-k8s-agent/CVE-2025-15367.yamlstill says it is tracked in [stackstate-agent] CVE-2026-14456 (openssl 3.5.7) — no upstream fix published, needs a tracked exception #489, but [stackstate-agent] CVE-2026-14456 (openssl 3.5.7) — no upstream fix published, needs a tracked exception #489 is the obsolete OpenSSL CVE-2026-14456 ticket this candidate recommends closing. Point the exception at [stackstate-agent] Dev scan 34027081656: bump x/crypto to 0.56.0 and grpc to 1.83.1; krb5 and python rows need a human VEX or exception decision #509 or its actual owner before any renewal; this is a source correction warranted at this head.Optional suggestions:
cmd/system-probe/subcommands/usm/debug_scripts/usm_leak_detector/backends/bpftool_downloader.pyimportstarfileandurllib.request, although it is absent from the published image layers. Use artifact absence rather than the claim that all such callers are undertasks/..github/workflows/build-binaries.ymlalso passesexceptions-path: exceptions; both repository consumers remainmode: inform, so the gate conclusion is unchanged.ai-collaboration-app commentedon Sep 8, 2026
Dev scan 34191503812 — round 2, after review
Review round 1 (audit) found three defects in my previous checkpoint. All three were valid. Two of them mean my earlier classification of the Python rows was wrong, so this comment supersedes the relevant parts of that checkpoint.
Candidate: #511, head
83cfa1fb7fe6015f659931c063e41bc349f3cd2f, branched from158e1098755d8ee4e563348ae0b861fa217a5c1b.Correction 1 — two Python rows are 3.13.16 bump rows, not no-fix rows
I classified CVE-2026-19672 as having no fix anywhere, on the grounds that its CNA range (
< 3.16.0) names a version that does not exist and the advisory publishes no commit SHAs. That was wrong, and the method was the problem: I checked only the advisory's main-branch commits and their divergence from our tag, instead of following the upstream issue to its per-branch backport pull requests.CVE-2026-19672 (
gh-155999) does have a merged 3.13 backport — PR python/cpython#156042, merge commitc7979f3a819011a3222bd16e671264b1e34282cb, base branch3.13, merged 2026-08-19.compare/c7979f3a...v3.13.15isbehind_by: 69, andcompare/c7979f3a...3.13confirms it is an ancestor of the branch. So it is guaranteed to ship in 3.13.16.Re-running the same method on the other two changes their story as well. Neither is a permanent no-fix row:
a2773a34183b7d94a243bb98fd658926cc5348ce, 60 commits afterv3.13.15c7979f3a819011a3222bd16e671264b1e34282cb, 69 commits afterv3.13.153.13, opened 2026-09-043.13, opened 2026-08-31For the two open ones,
search/issues q='repo:python/cpython is:pr is:merged base:3.13 gh-<issue>'returns zero, and each PR'smerge_commit_shais only GitHub's speculative test-merge ref —compare/<ref>...3.13reportsdiverged, so neither is on the branch. That negative result is trustworthy rather than a query artifact: the identical query forgh-155999does return the known-merged #156042. Both fixes are merged on 3.14 and 3.15. Note CVE-2026-15310's 3.13 backport is scoped to bzip2/LZMA only, because 3.13 has no zstd module.v3.13.15remains the newest released 3.13.x, so nothing is bumpable today — but the disposition framing changes: for two rows this is "wait for 3.13.16", not "argue no fix exists". Anot_affectedVEX would be the wrong instrument for those.Correction 2 — my reachability evidence was wrong
I previously wrote that no affected module path is referenced by Python shipped in the image, based on
DockerfileCOPYinference. The review pointed out a non-tasks/helper that importstarfileandurllib.request, and it is right:cmd/system-probe/subcommands/usm/debug_scripts/usm_leak_detector/backends/bpftool_downloader.py. So I checked the published image directly instead of inferring, which is the evidence that actually counts.Inside
quay.io/stackstate/stackstate-k8s-agent@sha256:35e66696a1bdc0d470e0d11d7711e426548a09d31190bdd94cd1350b464dc839:tasks/tree is absent, and so arebpftool_downloader.pyandusm_leak_detector. The only shipped first-party Python is/readsecret.py, which imports justargparse,json,os.pathandsys. That part of my earlier conclusion survives — but it was luck, not method.site-packagesdo reach the affected modules, which my earlier claim denied. Per row:scramp/core.py(SASLprep over credentials, exercised by any SCRAM auth),urllib3/connection.pyandurllib3/util/connection.py(.encode('idna')on hostnames), plusidna/codec.py,pydantic/v1/networks.py,asn1crypto. Precondition for impact is a codepoint whose Unicode 3.2.0 and current-Unicode mappings differ, but the code path itself is on the agent's own HTTP and SASL paths.dateutil/zoneinfo/rebuild.py,build/_compat/tarfile.py,build/_builder.py,pyproject_hooks. These are packaging and tz-rebuild utilities, so it is not cleanly unreachable either.six.pyandbotocore/vendored/six.pymentionHTTPPasswordMgr*, and only asurllib2name re-exports. No password manager is constructed.ZIP_BZIP2,ZIP_LZMAorZIP_ZSTANDARDanywhere in shipped code.The practical consequence: CVE-2026-17084 should not receive a reachability-based
not_affectedstatement. It is in the HTTP and SASL path. CVE-2026-15310 is the strongestnot_affectedcandidate on reachability grounds. The two merged-backport rows are best handled by the 3.13.16 bump regardless.One prior gap is now partly closed:
stackstate_checks(base 6.12.0) is present in the image, so the integrations surface ships here and is directly assessable rather than being wholly outside this checkout as I previously recorded. A fullnot_affectedargument still has to account for check code in StackVista/stackstate-agent-integrations, but it can now be examined in-image.Correction 3 — the exception pointed at the wrong tracker (fixed in #511)
exceptions/stackstate-k8s-agent/CVE-2025-15367.yamlreferred readers to #489 for tracking. #489 is the OpenSSL CVE-2026-14456 ticket and is obsolete, so anyone following it to re-verify this Python row would find nothing about it. #511 points it at this ticket and records the re-check evidence (b234a2b67539f787e191d2ef19a7cbdce32874e7diverged from bothv3.13.15and the3.13branch head).expires: '2026-09-04'is deliberately unchanged.CVE-2026-4360.yamlalready referenced this ticket correctly.The expiry guard: scoped as expiry-only, and why it should not land yet
The review is right that branch
cve-exception-expiry-fail-closed(c9414b96) is not policy-complete. The SLA's authoritative encoding enforces considerably more than a date:accepted_pending_upstream_fix,accepted_risk,false_positive,not_affected;status,reason,owner,statement, plusproduct.consumerandproduct.image;httpsupstream_referencewhenever the status isaccepted_pending_upstream_fix.That guard checks the expiry date and nothing else, so it would pass files that breach the SLA. Measured against this tree, three of the four current files carry dispositions outside the supported set —
under_investigationinCVE-2026-4360.yaml, andaccepted_with_compensating_controlin bothGO-2026-5932.yamlfiles — and the guard is indifferent to all three. A2027-01-01date is 115 days out, far past the 14-day window, and the guard exits 0 on it.I am scoping it explicitly as expiry-only rather than completing it, because of sequencing. Any fail-closed guard fails on this tree the moment it lands: all four files are lapsed, and policy-complete enforcement would add three disposition violations on top. Making it green requires renewing or dropping those exceptions, which is precisely the human disposition decision below. So guard delivery has to follow that decision, not precede it — landing it first would just red the default branch with no one able to fix it but a maintainer. That is also why I have not resurrected #501, which a maintainer closed unmerged.
Worth noting for scope: full policy enforcement already exists in the review harness, so the gap is enforcement in this repo's CI, not an absence of any check at all.
Minor correction
exceptions/has two consumers, not one:.github/workflows/build-deb.yml:330and.github/workflows/build-binaries.yml:250. Both aremode: inform, so the conclusion is unchanged — nothing in this repo gates on the tree, and the gating chart scan never reads it — but my earlier "only consumer" claim was wrong.CI
#511 required CI reached a terminal state and is green: 25 successful checks, 17 skipped, no failures and nothing pending. That includes both
Unit testsvariants, both omnibus DEB builds, and the agent and cluster-agent container image builds on amd64 and arm64. No review feedback on the PR at the time of writing.Remaining work
not_affectedcandidate; CVE-2026-17084 is reachable and needs a risk decision, not an unreachability argument. Only a reviewed vexhub statement affects the gating scan.expires: '2026-09-04'), and note that three also need a supportedstatusand a window inside 14 days. Untouched by me.c9414b96is verified working as an expiry-only guard (10/10 unit tests; exits 1 on this tree).decision: failed; Retire the VEX-superseded agent CVE exceptions and repair the rest #511 does not change any scanned artifact.Next action: decide CVE-2026-17084 on risk rather than reachability, and treat CVE-2026-15806/CVE-2026-19672 as a 3.13.16 bump rather than VEX candidates.
ai-collaboration-app commentedon Sep 9, 2026
Extending this ticket to dev scan 34330594840
Scan 34330594840 attempt 1, source
aaf94a21, artifactsha256:d40f1cf0f71e. Both targets now build from158e1098, the merge of #510. 0 CRITICAL, 5 HIGH rows, 1 MEDIUM — but only two distinct advisories.The five HIGH rows are all
CVE-2026-84445ongoogle.golang.org/grpc v1.83.1, counted once per scanner per image. Everything #510 fixed is gone: no x/crypto row, noCVE-2026-84304.google.golang.org/grpcpythonCVE-2026-84445is a DoS crash in gRPC-Go xDS servers on a request with neither:authoritynorHost. Per the upstream GHSA the 1.83.x line is vulnerable in>= 1.83.0, < 1.83.2. It reaches all three shipped binaries:bin/agent/agentandbin/installer/installerin the agent image,bin/stackstate-cluster-agent/stackstate-cluster-agentin the cluster-agent image.Fixed in #514. That PR adopts Dependabot #512 and #513 as their own commits and adds the root
go getplusgo work syncthat neither of them has. Validated by readinggo version -mback off all three built binaries.The Dependabot PRs, precisely
password is emptybecause registry secrets are not exposed to Dependabot-authored PRs.comp/otelcol/otlp/components/statsprocessorto 1.83.1, still inside the vulnerable range, so it does not fix this row. That module is one of four outsidego.workand outside the root build graph (withdatadogconnector,pkg/dyninst/testprogs/progs,test/integration/serverless/src) that stay at v1.80.0 and ship in no image. Independently valid, but needs re-targeting to 1.83.2 to be worth merging./comp/otelcol/otlp/example/metricand/test/e2e/containers/otlp_senderfail because those directories no longer exist. Staledependabot.ymlentries, not a CVE issue.Exceptions:
check-cve-exception-policy --as-of 2026-09-09failed on all four filesAll four expired 2026-09-04 and three carried unsupported dispositions. Fixed in #511, which now exits 0.
CVE-2025-15367andCVE-2026-4360deleted. vexhub#39 merged reviewed statements covering both. In this run's Grype report for the agent image both sit inignoredMatcheswithappliedIgnoreRulesnamespacevex—not_affectedandfixedrespectively — againstpkg:generic/[email protected], the exact subcomponent the statements pin. The uncoveredCVE-2026-17084row is still reported in the same run, so VEX is doing the suppressing rather than a scanner filter. This closes the deferral recorded above forCVE-2025-15367.GO-2026-5932files kept and repaired, statusnot_affected, expiry 2026-09-23. The advisory range isintroduced: 0with no fixed event, so no x/crypto release clears it and reachability is the only disposition:go list -depsover./cmd/agent,./cmd/installerand./cmd/cluster-agentwith the release tag set contains nogolang.org/x/crypto/openpgppackage.One thing for a human: the vexhub gap those files claimed away
Both
GO-2026-5932files stated that vexhub already carried a reviewed image-scopednot_affectedstatement and that the exception merely bridged a scan-time identity gap. That was wrong. vexhub carriesGO-2026-5932only forstackstate-k8s-process-agentandsts-opentelemetry-collector, and there is no vexhub document forstackstate-k8s-cluster-agentat all — the cluster-agent Grype report has zeroignoredMatches, confirming no VEX reaches that image. A reviewed vexhub statement is the better home for both; the 2026-09-23 expiry is the deadline for that call, not an acceptance.Still deferred
CVE-2026-17084(python 3.13.15, MEDIUM, no published fix) is the only live row left after #514. It needs a reviewed vexhub statement or a fresh exception — a human decision, related to vexhub#34. The krb5 rows are no longer attributed to this repo in this scan.#489
The delivery evidence it was waiting on is confirmed again here: no OpenSSL row appears in this scan, active or ignored. It is stale and misleading as written — recommend closing it as delivered by #498, with
CVE-2026-17084and the vexhub work tracked here instead. Left open for a human to close.ai-collaboration-app commentedon Sep 9, 2026
Both PRs terminal green
f821d4528a36eb6c20a6The image-scan steps in those runs are a real before/after, since the two branches differ only in grpc:
CVE-2026-84445 [HIGH] [email protected] [grype,trivy]on Retire the VEX-superseded agent CVE exceptions and repair the rest #511's branch → 7, row gone on Bump grpc to 1.83.2 for CVE-2026-84445 #514's, on amd64 and arm64.Also confirmed the exception evaluator enforces expiry, which means the baseline files were suppressing nothing: on #514's branch (baseline exceptions) the agent scan reports
suppressed by exception: 0, expired: 3. On #511's branch it reportsexpired: 0andGO-2026-5932 … (not_affected — vulnerable_package_absent_from_command_dependency_graph)suppressed on both images. So #500's contract was already biting silently, and #511 is what restores it.One nuance recorded honestly rather than glossed: the in-repo scan targets
…:ci-<arch>, a different image identity from the published tags, so VEX does not reach it and after the two deletionsCVE-2025-15367andCVE-2026-4360show as unmanaged there. That scan ismode: informand it already listedCVE-2026-15310,-15806and-19672as unmanaged before this work — VEX-covered at publish, no local exception — so the two rows join a pre-existing category rather than a new one. The gating cve-reporter scan suppresses both via vexhub#39.Next action is human: review and merge #511 and #514 together (the tree only passes
check-cve-exception-policyonce #511 lands), close #512 and #513 as adopted, retarget or close #503, and close #489 as delivered by #498. Then a fresh dev scan should leave onlyCVE-2026-17084on this repo, which needs a reviewed vexhub statement — along withGO-2026-5932for both agent images, where vexhub currently has no document at all.