security: bump Go toolchain 1.26.5 → 1.26.7 to clear 8 HIGH stdlib CVEs - #57
Merged
Conversation
Go 1.26.5 carries 8 HIGH-severity standard-library advisories, all fixed in 1.26.6. Both scanners in the weekly Security Scan fail on it: Trivy flags the stdlib version embedded in every service binary, and govulncheck reports 6 of the 8 as reachable from our own call paths. This is not new breakage in our code. The tree passed on 2026-08-10 and started failing on 2026-08-17, when 1.26.6 shipped and the advisories became actionable. Run 32698378537 failed 26 of 27 jobs on this alone. Cleared advisories: CVE-2026-33818 / GO-2026-5972 encoding/asn1 DoS CVE-2026-56862 / GO-2026-6090 crypto/tls DoS via KeyUpdate flood CVE-2026-56853 / GO-2026-6089 net/http unencrypted HTTP/2 CVE-2026-56860 / GO-2026-6218 net/url quadratic-complexity DoS CVE-2026-56858 / GO-2026-6091 html/template XSS CVE-2026-56859 encoding/xml DoS via XML decoding CVE-2026-39821 x/net/idna CVE-2026-46600 x/net/dns/dnsmessage Targets 1.26.7 rather than the 1.26.6 minimum: it is the latest 1.26 patch, and no stdlib advisory in the Go vulnerability database requires a version beyond 1.26.6, so 1.26.7 is a strict superset of the fix. Covers all 38 pins, including five modules the CI matrices do not scan (aex-credentials-provider, aex-telemetry, aex-token-bank, src/internal, internal/testutil), so the pin stays uniform across the repo: 2 workflows GO_VERSION in ci.yml, security.yml 13 Dockerfiles FROM golang:1.26.5-alpine 23 go.mod toolchain go1.26.5 Only the toolchain directive moves; the go directive stays at 1.25.0. Verified: build, go test, and go vet pass across all 23 modules. The pre-existing golangci-lint errcheck findings in hack/integration, src/internal{,/events,/httpclient}, and aex-token-bank are unchanged from main and are not gated by CI, which runs go vet, not golangci-lint.
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.
Why
The weekly Security Scan failed its last two runs (32698378537, 32002500440) — 26 of 27 jobs red in the latest, all from a single root cause: the repo is pinned to Go 1.26.5, which carries 8 HIGH-severity stdlib advisories.
Both scanners trip on it independently:
httpclient.Client.doWithRetry → http.Client.Do → tls.Dialer.DialContext. 15 of 16 module jobs fail.This is not new breakage in our code. The same tree passed on 2026-08-10 and began failing on 2026-08-17 — Go 1.26.6 shipped in between, which is when the advisories became actionable. Pass → fail → fail, with no intervening code change.
Advisories cleared
encoding/asn1crypto/tlsnet/httpnet/urlhtml/templateencoding/xmlgolang.org/x/net/idnagolang.org/x/net/dns/dnsmessageWhy 1.26.7 and not the 1.26.6 minimum
All 8 advisories are fixed in 1.26.6, but 1.26.7 is the latest 1.26 patch. I checked every
stdlibentry in the Go vulnerability database — none requires a version beyond 1.26.6, so 1.26.7 is a strict superset of the fix with no known regressions, and buys margin before the next bump.Scope — all 38 pins
GO_VERSIONinci.yml,security.ymlFROM golang:1.26.5-alpine→1.26.7-alpinego.modtoolchain go1.26.5→go1.26.7Only the
toolchaindirective moves — thego 1.25.0directive is untouched, so the language version and module compatibility are unchanged. Diff is exactly 38 files, 38 insertions, 38 deletions: one line each, no collateral.This deliberately covers five modules the CI matrices don't scan —
aex-credentials-provider,aex-telemetry,aex-token-bank,src/internal,internal/testutil— so the pin stays uniform repo-wide and these don't silently drift onto a vulnerable toolchain.Verification — CI on this PR is the source of truth
Nothing here was validated by building images locally. The image builds and the container scan are verified by the pipelines below, so the result is reproducible from this PR rather than from anyone's laptop:
go vet+go test), 14 × Docker Build againstgolang:1.26.7-alpineWatch them on the Checks tab. The bar to merge is simple: Security Pass and CI Pass both green — the same two gates that are red on
maintoday.Sanity checks run locally against the real 1.26.7 toolchain before pushing (no Docker involved):
make buildacross 11 services,go testandgo vetclean across all 23 modules, andgo vet -tags e2efor the tagged suite inhack/tests.Pre-existing findings, untouched
golangci-lintreportserrcheckissues inhack/integration,src/internal{,/events,/httpclient}, andaex-token-bank. I confirmed these are byte-identical onmainby stashing this diff and re-running — unrelated to this change, and not gated by CI, which runsgo vet, notgolangci-lint. Worth a separate cleanup PR.