Repository navigation
sec(deps): bump go.opentelemetry.io/otel to v1.44.0 for GO-2026-5158 - #1840
Conversation
govulncheck -mode=binary against the /app/cudly extracted from the image this repo's Dockerfile builds reports two dependency advisories (#1837). This clears the one that has a fix. GO-2026-5158 (CVE-2026-41178, GHSA-5wrp-cwcj-q835) dropped the raw header length cap from otel's baggage parser. Affected ranges are 1.41.0 to 1.42.0 and 1.43.0 to 1.44.0; the workspace sat on v1.43.0. otel arrives transitively via cloud.google.com/go/storage, imported by providers/gcp/services/cloudstorage, so the bump lands on the indirect require in the root and providers/gcp modules rather than adding a direct one. otel/metric and otel/trace move with it because the three release in lockstep. Per-module go mod tidy across all six workspace modules plus go work sync keep the checksum files consistent. go work sync is idempotent afterwards and go mod verify passes in every module. Binary-mode govulncheck v1.1.4 on the linux/arm64 /app/cudly goes from "affected by 2 vulnerabilities from 2 modules" to "affected by 1 vulnerability from 1 module". Source mode across all six modules no longer reports GO-2026-5158 anywhere. The remaining advisory, GO-2026-5932, has no fixed version in the vulnerability database and cannot be cleared by a bump. It is not addressed here; the pull request body explains why and what the options are. Refs #1837
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (5)
📒 Files selected for processing (2)
Included review availability: 1 review is currently available. Based on recent review activity, included reviews refill at 2 per hour. 📝 WalkthroughWalkthroughThe root and GCP Go modules update indirect OpenTelemetry core, metric, and trace dependencies from v1.43.0 to v1.44.0. GCP OpenTelemetry SDK dependencies remain at v1.43.0. ChangesOpenTelemetry dependency update
Estimated code review effort: 1 (Trivial) | ~5 minutes Merge Risk: ⚪ Minimal · up to This PR makes a localized dependency update to address the OpenTelemetry advisory without changing application source behavior; no actionable merge-blocking risk remains beyond normal checks and review. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Closes #1837
Read this first: this PR clears one of the two advisories, not both
GO-2026-5932 has no fixed version and cannot be cleared by any dependency bump. The shipped binary still reports it after this change, and
govulncheck -mode=binarystill exits 3. Nothing here is suppressed; see "The one that cannot be fixed" below for the options. If you want #1837 to stay open to track that decision, drop theCloseskeyword before merging.The three advisories, confirmed against the live database
Each was fetched from
https://vuln.go.dev/ID/<id>.jsondirectly, not read from govulncheck's bundled copy.go.opentelemetry.io/otelcloud.google.com/go/storagefromproviders/gcp/services/cloudstoragegolang.org/x/cryptointroduced: "0", nofixedeventinternal/authusesx/crypto/bcrypt), indirect elsewheregithub.com/klauspost/compresstestcontainers-go->moby/go-archivefrominternal/database/postgres/testhelpersGO-2026-5841 is not mentioned in #1837 and is not in the shipped binary; it is left alone here rather than bundled in as a drive-by. See "Left deliberately undone".
What this PR changes
go.opentelemetry.io/otelv1.43.0 -> v1.44.0 on the indirect require in the root andproviders/gcpgo.mod. Because otel arrives transitively, the correct fix is the indirect bump, not a new direct require.otel/metricandotel/tracemove with it since the three release in lockstep. Per-modulego mod tidyacross all six workspace modules plusgo work synckeep the checksum files consistent.Seven files, +26/-19, no source changes.
The added
go.sum/go.work.sumlines for non-otel modules (spf13/afero,lyft/protoc-gen-star/v2,stretchr/objx, twoaws-sdk-go-v2internals,proto/otlp) are module-graph checksums added bytidy/sync, not version changes. Diffing the fully resolved build list (go list -m all) across all six modules, before against after, shows exactly three modules changed selected version, all otel:Zero unrelated dependencies moved.
go work syncis idempotent afterwards andgo mod verifypasses in all six modules.Reachability
Neither advisory is reachable in the shipped artifact. This changes urgency, not whether to fix.
Your code is affected by 0 vulnerabilitiesfor every module, both before and after. The findings sit at "packages you import" and "modules you require" level.-ldflags="-s -w", but the Go linker still retains function names in the pclntab. Method validated against a known-called symbol first:bcrypt.CompareHashAndPasswordandbcrypt.GenerateFromPasswordboth resolve at function level in the binary, so absence is meaningful.baggage.New,baggage.Parse,propagation.Baggage.Extract. The stringbaggageappears 0 times in the binary.propagationis linked (17 refs) but onlycompositeTextMapPropagator,HeaderCarrier,initandNewCompositeTextMapPropagator; theBaggagetype is absent. The linker dead-code-eliminated the vulnerable path.openpgptree.openpgpappears 0 times in the binary, andgo list -depsfinds no openpgp package anywhere in the workspace. We usex/cryptofor bcrypt, chacha20poly1305, cryptobyte, hkdf and pkcs12.Binary mode reports them anyway because govulncheck v1.1.4 cannot do call-graph analysis on a stripped binary and falls back to matching the advisory's declared symbol list against modules and packages it believes are present.
Why CI is green today
This answers the question #1837 raises. CI runs govulncheck in source mode, and source mode exits 0 when findings exist only at the import/require level. Every module returned
text_exit=0before this PR while GO-2026-5158, GO-2026-5932 and GO-2026-5841 were all being reported. The gate is not broken and is not misconfigured; it is scoped to "your code calls this", and no such finding exists. Binary mode on the same tree exits 3. That gap is exactly #1836, and nothing in this PR closes it.Verification
Everything below was run locally at the CI-pinned versions. Exit codes captured into variables, never inferred from empty output. No
grep -c 'Module: stdlib'; assertions are on the summary line and on a JSON OSV count.govulncheck v1.1.4, source mode, per module
.5158,5841,59325841,5932pkgproviders/awsproviders/azure59325932providers/gcp5158,59325932tests/e2eThe root module also moves from "1 vulnerability in packages you import" to "0 in packages you import", which is the substantive change: the otel
baggageandpropagationpackages are no longer an affected import.govulncheck v1.1.4, binary mode, against
/app/cudlyfrom the built imageThe image was built with the repo's own Dockerfile and the binary extracted from the
builderstage, which is the exact file the runtime stageCOPYs to/app/cudly.The before-scan reproduces #1837's reported number exactly. The stdlib count is asserted on the finding's
trace[0].module == "stdlib"in the JSON output, not on a text pattern. Before and after binaries confirmed distinct by sha256.The amd64 baseline was not rebuilt locally: three attempts were killed mid-compile in this environment, and I am not going to claim a figure I did not observe. The arm64 baseline reproduces #1837's number exactly, the amd64 post-fix scan is above, and the advisory set is a property of the module graph, which is architecture-independent.
CI
All four workflow runs on
02e31dbconcluded success:pre-commit,CI - Build & Test,AWS Sanity,Azure Sanity.Build, test and collateral
go build ./...: exit 0 in all six modules.go test ./...: exit 0 in five modules.tests/e2eexits 1 with"./..." matched no packages, identical on the base commit; its only test file is behind//go:build e2e, andci.ymlalready documents and special-cases this.0 issues.Files: 198, Lines: 72489, Issues: 0.go vet ./...: exit 0 in five modules,tests/e2ethe same pre-existing no-packages exit 1.The one that cannot be fixed
GO-2026-5932 is not a CVE in a specific version. It is a standing advisory that
golang.org/x/crypto/openpgpis unmaintained and unsafe by design. Its affected range isintroduced: "0"with nofixedevent, so every version ofgolang.org/x/cryptothat will ever exist matches. Bumping to the newestx/cryptochanges nothing.Options, none of which are taken here:
golang.org/x/crypto. Not viable at proportionate cost:internal/authusesbcrypt, and the module also arrives through the Azure and AWS SDKs forpkcs12andchacha20poly1305.-ldflagswithout-s -w), which would let binary-mode govulncheck do real symbol analysis and report 0. This is not suppression, it is giving the scanner the information it currently lacks, but it changes the shipped artifact and its size, so it is a deliberate call rather than something to slip into a dependency-bump PR.Per the instruction not to mask anything, no ignore list,
-scannarrowing,continue-on-erroror allowlist was added.Left deliberately undone
GO-2026-5841,
github.com/klauspost/compressv1.18.5 -> v1.18.7. It has a fix available and would be a one-line indirect bump, but it is not one of the two advisories in #1837, it is not in the shipped binary, and the vulnerable packagecompress/s2is not imported anywhere in the workspace (we reachcompress/zstdthrough testcontainers in test helpers only). Held back rather than bundled in as drive-by scope. Say the word and it is a separate one-line PR.Not verified
builderstage. The runtime stage onlyCOPYs the identical file, but the full image was not assembled because the frontend stage is unrelated to this change.