AIRSHIP-4953 [CRITICAL] 3 vulnerability fixes (uswitch/vault-creds) - #44
Merged
Merged
Conversation
…gn CI (CVE-2026-39821, CVE-2026-33814, CVE-2026-39822)
…chain (CVE-2026-39821, CVE-2026-33814, CVE-2026-39822)
John-Holden
approved these changes
Jul 22, 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.
Vulnerabilities
CVE-2026-39821 — CRITICAL (CVSS 3.1: 9.6, NVD; sweep reported 9.3)
Package:
golang.org/x/net/idna0.52.0→0.54.0The
ToASCII/ToUnicodefunctions ingolang.org/x/net/idnaincorrectly accept Punycode-encoded labels that decode to an ASCII-only label (e.g.ToUnicode("xn--example-.com")incorrectly returns"example.com"). Programs that perform privilege checks on the ASCII hostname before converting to Unicode can be tricked into granting access to a different, unintended hostname — a privilege-escalation vector.CVE-2026-33814 — HIGH (CVSS 3.1: 7.5, NVD; sweep reported 8.7)
Package:
golang.org/x/net/http20.52.0→0.53.0When processing HTTP/2
SETTINGSframes, thehttp2transport enters an infinite loop writingCONTINUATIONframes if the peer sendsSETTINGS_MAX_FRAME_SIZEwith a value of0— a denial-of-service vector.CVE-2026-39822 — HIGH (CVSS 3.1: 7.8, NVD; sweep reported 8.5)
Package: Go standard library
os(std/os)1.25.11→1.25.12(also fixed in1.26.5,1.27.0-rc.2)On Unix, opening a file inside an
os.Rootimproperly follows symlinks outside the root when the final path component is a symlink and the path ends in/(e.g.root.Open("symlink/")opens the symlink target even when it points outside the root).golang.org/x/netis a transitive dependency (already listed// indirectingo.mod); Go's MVS resolution means a direct version bump is the correct and only mechanism here (no override needed).Changes
golang.org/x/net0.52.0→0.53.0(fixes CVE-2026-33814), then →0.54.0(fixes CVE-2026-39821), each viago get/go mod tidy. This also pulled forward thegolang.org/x/crypto,golang.org/x/sys,golang.org/x/term, andgolang.org/x/textreleases in the samex/train thatgo mod tidyselects as part of MVS resolution for the newx/netversion — not independent bumps.go 1.25.7retained as the module's minimum (required bygithub.com/hashicorp/vault/sdk@v0.25.1) and addedtoolchain go1.25.12togo.mod, per the active-cycle Go toolchain rule: cycle1.25is still active (not EOL) per endoflife.date, and1.25.12is its latest patch and resolves CVE-2026-39822.1.26is also active but1.25is the lowest active cycle at or above the fix's minor version, so the module'sgodirective stays at1.25..github/workflows/push.yamlstill pinsactions/setup-go@v5with explicitgo-version: "1.25"(test job) andgo-version: "1.24"(build job) rather thanactions/setup-go@v6withgo-version-file: go.mod. I attempted this alignment but the push token available to this automation lacks theworkflowOAuth scope needed to update files under.github/workflows/(refusing to allow a Personal Access Token to create or update workflow ... without workflow scope), so it could not be committed. In practice this is mitigated by Go'sGOTOOLCHAIN=autodefault: becausego.modnow declarestoolchain go1.25.12, anygo build/go testinvocation in CI will auto-download and usego1.25.12regardless of which SDKsetup-goinstalled, so the patched toolchain is what actually builds/tests/ships. Still, a maintainer withworkflowscope should apply thego-version-file: go.modchange to keep CI's declared toolchain in sync and to move the build job off the now-EOL1.24cycle explicitly.Verification
go build ./...— passedgo vet ./...— passed, no findingsgo test -v -cover $(go list ./... | grep -v /vendor)— passed (pkg/kube,pkg/vault;cmdandpkg/metricshave no test files, pre-existing)go list -m golang.org/x/net— confirmsv0.54.0resolvedgo versionaftergo mod tidy— confirmsgo1.25.12toolchain resolved and usedgofmt -l .reports the same 4 pre-existing unformatted files onmasteras on this branch (cmd/main.go,pkg/kube/kube.go,pkg/vault/factory.go,pkg/vault/manager.go) — unrelated to this change, not introduced hereTesting gaps
No test coverage exercises
idna,http2, oros.Rootcode paths directly (they're pulled in transitively viak8s.io/client-go,hashicorp/vault, etc.), so the fix is verified by dependency resolution and the existing test suite passing, not by a targeted regression test.Outstanding questions
workflow-scope credentials follow up to update.github/workflows/push.yaml(actions/setup-go@v6+go-version-file: go.mod), given this automation cannot push workflow file changes?Linear tickets
AIRSHIP-4953