VEX three no-fix Python findings on the agent image, leave the reachable one visible - #40
Merged
Merged
Conversation
…ble one visible The daily dev chart scan gates on stackstate-k8s-agent across CRITICAL,HIGH,MEDIUM,LOW. After the 3.13.15 realignment the image is down to four findings, all CPython 3.13.15 with no upstream fix, so no bump can clear them and a repo-local exception cannot either -- the chart scan does not read consumer exception trees. Three of the four are genuinely unreachable in the shipped runtime: - CVE-2026-15806 (urllib.request password-manager credential downgrade): the shipped tree has zero .add_password() call sites, so no credential is ever registered and find_user_password cannot return one. - CVE-2026-19672 (tarfile 'tar'/'data' filters create dirs outside the destination): extraction_filter is None on 3.13 so those filters are never the default, and the only explicit filter='data' is in the PEP 517 build frontend, which no agent entrypoint invokes. - CVE-2026-15310 (zipfile bzip2/LZMA/Zstd pre-allocation): those compressors are never selected, and the only runtime-reachable ZipFile site returns at its os.path.exists guard. The fourth, CVE-2026-17084 (stringprep tables B.2/B.3 use modern Unicode rather than 3.2.0), is deliberately left with no statement. It is reachable: encodings.idna.nameprep calls stringprep.map_table_b2, and instrumenting the shipped interpreter shows a plain host.encode("idna") invoking it six times. There are live call sites in asn1crypto and pydantic. Quieting a finding we cannot honestly call unreachable would be worse than reporting it, so it stays visible and keeps gating. Each claim is re-derived against the exact gated image quay.io/stackstate/stackstate-k8s-agent:158e1098, digest sha256:35e66696a1bdc0d470e0d11d7711e426548a09d31190bdd94cd1350b464dc839, counting stdlib modules that define an API separately from code that calls it. Verified with Grype --by-cve: 13 active / 0 ignored without VEX, 1 active / 12 ignored with this file plus the containerd statements. The one remaining active finding is CVE-2026-17084, as intended.
LouisLotter
approved these changes
Sep 8, 2026
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.
Closes part of #34 (does not close it — see Remaining below).
The daily dev chart scan gates
stackstate-k8s-agentacrossCRITICAL,HIGH,MEDIUM,LOW. After the 3.13.15 realignment in #39 the image is down to four findings, all against embedded CPython 3.13.15, all with no upstream fix. No version bump can clear them, and a repo-local exception cannot either — the chart scan does not read consumer exception trees — so VEX is the only artifact that can act here.This PR statements three of the four and deliberately leaves the fourth reporting.
Evidence
All four claims were re-derived on 2026-09-08 against the exact image the gate scans —
quay.io/stackstate/stackstate-k8s-agent:158e1098, digestsha256:35e66696a1bdc0d470e0d11d7711e426548a09d31190bdd94cd1350b464dc839(matchesimage_digestin the run-34191503812 aggregate). Interpreter confirmed3.13.15viasys.version_info. Searches cover the shipped tree under/opt/stackstate-agentand/etc/stackstate-agent, counting the stdlib module that defines an API separately from code that calls it — the distinction that decides three of these four.CVE-2026-15806—not_affected/vulnerable_code_not_in_execute_pathurllib.request.HTTPPasswordMgr{,WithDefaultRealm}returns an https-registered password for the same host over plainhttp, so credentials can leave unencrypted. It requires code to register a credential viaadd_password()..add_password(call sites in the shipped tree: zero, outside the stdlib's own definitions (urllib/request.py:810,885) and a docstring example (:53).MovedAttributealias-table rows insix.py.requests/urllib3, which use their ownHTTPBasicAuthand never touchurllib.requestpassword managers.With nothing registered,
find_user_passwordhas nothing to return and the downgrade cannot occur.CVE-2026-19672—not_affected/vulnerable_code_not_in_execute_pathtarfile'staranddatafilters can create empty directories outside the destination on POSIX. It requires extraction to run with one of those two filters.tarfile.TarFile.extraction_filterisNonein this image, so on 3.13 the default isfully_trusted_filter; the affected filters apply only when passed explicitly.filter='data'issite-packages/build/_compat/tarfile.py:27— the PEP 517 build frontend. Grepping/etc/stackstate-agentand/opt/stackstate-agent/binforpyproject_hooksorfrom build importreturns zero references, and/etc/stackstate-agent/checks.dcontains no Python checks, so no agent entrypoint invokes it.extractall()sites (build/_builder.py:376,pyproject_hooks/_in_process/_in_process.py:241) operate on wheels viazipfile, nottarfile.python-dateutilpath usesextractfile()only and writes nothing; the one genuinetarfile.extract()(dateutil/zoneinfo/rebuild.py) passes nofilter=and needs thezicbinary, absent from this image.This is the same premise already reviewed for
CVE-2026-4360, re-derived against the current image.CVE-2026-15310—not_affected/vulnerable_code_not_in_execute_pathA crafted zip drives memory exhaustion when a member declares a large uncompressed size under bzip2/LZMA/Zstandard, because the decompressor pre-allocates from the attacker-supplied header.
ZIP_BZIP2,ZIP_LZMA,ZIP_ZSTANDARDin the shipped tree: zero. Nocompress_type=selection outside packaging tooling, so those codecs are never chosen.zipfile.ZipFile()sites, three are build-frontend tooling no entrypoint invokes, reading locally-built wheels rather than untrusted input.requests/utils.py:280inextract_zipped_paths(). Verified in-image thatcertifi.where()resolves to an existing file, so the function returns at itsos.path.exists(path)guard before reachingZipFile.Reviewer note: this is the weakest of the three. It rests on "no attacker-controlled zip reaches the runtime" rather than on the API being absent, and the
status_notessays so explicitly. Please weigh it separately from the other two.CVE-2026-17084— deliberately no statementstringpreptables B.2/B.3 use modern Unicode instead of 3.2.0 (IDNA 2003 mappings). This one is reachable, proven live:encodings.idna.nameprepcallsstringprep.map_table_b2— confirmed by reading the shipped source.map_table_b2in the shipped interpreter and running'straße.Example.COM'.encode('idna')producedb'strasse.Example.COM'with 6 calls to the vulnerable table..encode('idna')call sites in shipped code:asn1crypto/_iri.py:78,asn1crypto/x509.py:229,2896,pydantic/v1/networks.py:377,379.urllib3/util/connection.pyidna-encodes the host on outbound connections.We cannot honestly answer "not reachable", so no statement is written. It stays visible and keeps gating. (The CVE text names
in_table_b2(); 3.13 exposesmap_table_b2/map_table_b3— those are the real symbols.)Validation
tools/build_index.py --checkpasses;index.jsonis unchanged because all three statements reuse product PURLs already indexed for this image.Grype,
--by-cve, same invocation shape the image-pipeline gate uses:The 12 suppressed are the 3 new Python rows,
CVE-2025-15367,CVE-2026-4360, 4× krb5 and 3× containerd. The single remaining active finding isCVE-2026-17084— exactly the one intended to stay visible.Trivy cannot demonstrate these: it reports no Python rows for this image at all (its only agent finding is
GO-2026-5932ongolang.org/x/crypto, keyed by Go advisory ID). These 3.13.15 statements are Grype-effective by design, matching every existing Python statement in this file.Remaining
rancher/image-scanningmigration issue is still required perCONTRIBUTING.mdstep 6.