UID2-7800, UID2-7801: suppress 2 CVEs in .trivyignore - #673
Merged
Conversation
- CVE-2026-66046 (UID2-7800) - CVE-2026-76641 (UID2-7801) Each is present but not reachable from this service; see the linked tickets for the per-CVE impact assessments. Reachability alone determines suppress-vs-fix.
sophia-chen-ttd
approved these changes
Sep 2, 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.
Suppresses 2 vulnerabilities in
.trivyignore, expiry 2026-12-02 (3 months). No code fixes — each is present in the image but not reachable from this service.Reachability alone determines suppress-vs-fix: a fixed version existing upstream does not make an unreachable path exploitable. Change any expiry in review if you want a different window.
CVE-2026-66046 — HIGH,
libexpat (Alpine base-image OS library)The CVE is a quadratic-complexity DoS in native Expat's storeAtts() (xmlparse.c), exploitable only when an application parses attacker-supplied XML through expat. libexpat 2.8.3-r0 is present in every flagged repo solely as a transitive OS package of its Alpine base image (eclipse-temurin:21-jre-alpine-3.23 for the five Java services, python:3.x-alpine3.23 for snowflake). The five Java services are pure-Java Vert.x apps: they parse XML through the JVM's JAXP/Xerces stack, not native libexpat, and contain no System.loadLibrary/JNI/native XML bindings — the only XML on disk is trusted logback/config. snowflake is Python where libexpat backs CPython's pyexpat, but its scripts (token/key/salt generators, Snowflake monitoring) import no XML module and never parse untrusted XML. With no code path feeding untrusted XML into expat in any repo, the vulnerable storeAtts() scan is unreachable everywhere. A fixed version (2.8.4-r0) exists but does not change the not_affected verdict.
Full triage report — CVE-2026-66046
CVE-2026-66046 — libexpat quadratic-complexity DoS in storeAtts()
Severity: HIGH (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/…)
Package: libexpat 2.8.3-r0 → fixed 2.8.4-r0
Verdict: not_affected (suppress)
What the CVE is
Expat through 2.8.3 has a denial-of-service caused by quadratic (O(N²)) algorithmic complexity in
storeAtts()inxmlparse.c. Processing N specified attributes with non-normalized values triggers a linear scan ofelementType->defaultAttsper attribute to determine CDATA status. A remote unauthenticated attacker can supply one well-formed multi-megabyte XML document to an application that parses untrusted XML through expat, causing excessive CPU. No auth, external-entity resolution, or non-default parser options required.How it reaches (or doesn't reach) our services
libexpat 2.8.3-r0 was flagged in all six repos, but in every case it is present only as a transitive OS package of the Alpine base image, not as a declared dependency:
FROM eclipse-temurin:21-jre-alpine-3.23. These parse XML through the JVM's JAXP/Xerces implementation, which is Java, not native libexpat. Source search found noSystem.loadLibrary/JNI/native XML bindings and noexpatreferences. The only XML present is trustedconf/logback.xmlconfiguration, never attacker-controlled input. The vulnerable native code path is never invoked.FROM python:3.x-alpine3.23. libexpat backs CPython'spyexpat, but the code (token/key/salt/email generators, Snowflake monitoring) imports no XML module (xml,lxml,etree,sax,minidom— all absent) and parses no untrusted XML. No path feeds attacker input into expat.Because no repo passes untrusted XML into expat, the quadratic
storeAtts()scan is unreachable across the board.Decision
Reachability is broken in all six repos, so this is not_affected and should be suppressed, even though a fixed package (2.8.4-r0) exists. The base image will pick up the fix on the next routine rebuild; no code change is required. Suppression belongs in each repo's root
.trivyignore.Confidence: high — verdict rests on direct evidence (Dockerfile base images, absence of native XML linkage in Java sources, absence of any XML parsing of untrusted input in the Python code).
CVE-2026-76641 — HIGH,
libexpat (Alpine base-image native C library)CVE-2026-76641 is an out-of-bounds read in the native C library libexpat, triggered only when a process parses XML through expat's C API (specifically external entity parsers created via XML_ExternalEntityParserCreate). libexpat is present in the Alpine base image of all six flagged artifacts, but every scanned artifact (alpine 3.23.5) is an eclipse-temurin 21-jre-alpine Java image — including uid2-snowflake, whose scanned artifact is the Java ETL image (etl/Dockerfile), not its separate Python Dockerfiles. Java services parse XML via the JVM's own JAXP/Xerces implementation (pure Java), never linking to native libexpat. Grep found no System.loadLibrary/JNI usage and no native XML binding in any repo (the single loadLibrary/native regex hit was a false positive on the string "service name"). With no process invoking expat's C parser, the vulnerable code path cannot be exercised, so the finding is unreachable in all six repos regardless of the available fixed package.
Full triage report — CVE-2026-76641
CVE-2026-76641 — libexpat out-of-bounds read — Triage: NOT AFFECTED
Vulnerability
Expat through 2.8.3 contains an out-of-bounds read (introduced by the fix for CVE-2026-66046). A struct-size mismatch between
ELEMENT_TYPEmembers causesstoreAttsto read theattIndexmember past allocated memory when processing XML with external entity parsers created viaXML_ExternalEntityParserCreate, causing either failed whitespace normalization in non-CDATA attributes or a wild-pointer segfault. Severity HIGH; installed 2.8.3-r0, fixed in 2.8.4-r0.Where it was found
libexpat is a native C library shipped in the Alpine base image (
eclipse-temurin:21-jre-alpine-3.23) used by all six flagged repos. The scanner correctly reports its presence in the image filesystem.Reachability analysis
The vulnerable code path only executes when a process parses XML through expat's C API. All six scanned artifacts (alpine 3.23.5) are pure-Java Vert.x/ETL services launched with
java -jar:FROM eclipse-temurin@sha256:319339...(21-jre-alpine-3.23); apk adds onlylibpng/libcrypto3/libssl3/musl/gnutls(crypto/PNG, never libexpat directly); no JNI or native XML binding.etl/Dockerfile, same temurin base,java -jar ... cronjob). Its PythonDockerfile.dev/Dockerfile.monitoringare separate images and were not the scanned artifact; regardless, noxml/pyexpat/ElementTreeimports exist anywhere in the repo.The JVM parses XML with its own JAXP/Xerces implementation (pure Java), which does not link to native libexpat. Source search found no
System.loadLibrary, JNI, or native XML path in any repo (the one regex hit was a false positive on the literal string "service name"). No process in any image invokes expat's C parser, soXML_ExternalEntityParserCreate/storeAttscannot be reached.Decision
not_affected for all six repos. libexpat is present but unreachable — no native XML parsing path exists. Per triage policy, a not-exploitable CVE is suppressed even though a fixed package (2.8.4-r0) exists; the base-image bump will pick it up on the normal update cadence. Recommended action: suppress (repo-root
.trivyignore).Opened by uid2-vul-scan-agent (general_use_claude-opus-4-8) for the automated finding(s) above. Verdict confidence: high. Please sanity-check each reachability argument before approving.