OpenTelemetry-Go: multi-value `baggage` header extraction causes excessive allocations (remote dos amplification)GHSA-mh2q-q3fh-2475
HIGHFix: open-telemetry/opentelemetry-go#7880GHSA-mh2q-q3fh-2475 is a high-severity (CVSS 7.5) CWE-770 vulnerability in go.opentelemetry.io/otel. A fix is available for go.opentelemetry.io/otel — see the affected versions and patch details below.
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
Exploitation and automatability from CISA’s SSVC triage for GHSA-mh2q-q3fh-2475.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
Where this sits among everything scored
Real-World Exposure
go.opentelemetry.io/otelReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.
Description
multi-value baggage: header extraction parses each header field-value independently and aggregates members across values. this allows an attacker to amplify cpu and allocations by sending many baggage: header lines, even when each individual value is within the 8192-byte per-value parse limit.
severity
HIGH (availability / remote request amplification)
relevant links
- repository: https://github.com/open-telemetry/opentelemetry-go
- pinned callsite: https://github.com/open-telemetry/opentelemetry-go/blob/1ee4a4126dbdd1bc79e9fae072fa488beffac52a/propagation/baggage.go#L58
vulnerability details
pins: open-telemetry/opentelemetry-go@1ee4a4126dbdd1bc79e9fae072fa488beffac52a as-of: 2026-02-04 policy: direct (no program scope provided)
callsite: propagation/baggage.go:58 (extractMultiBaggage)
attacker control: inbound HTTP request headers (many baggage field-values) → propagation.HeaderCarrier.Values("baggage") → repeated baggage.Parse + member aggregation
root cause
extractMultiBaggage iterates over all baggage header field-values and parses each one independently, then appends members into a shared slice. the 8192-byte parsing cap applies per header value, but the multi-value path repeats that work once per header line (bounded only by the server/proxy header byte limit).
impact
in a default net/http configuration (max header bytes 1mb), a single request with many baggage: header field-values can cause large per-request allocations and increased latency.
example from the attached PoC harness (darwin/arm64; 80 values; 40 requests):
- canonical:
per_req_alloc_bytes=10315458andp95_ms=7 - control:
per_req_alloc_bytes=133429andp95_ms=0
proof of concept
canonical:
mkdir -p poc
unzip poc.zip -d poc
cd poc
make test
output (excerpt):
[CALLSITE_HIT]: propagation/baggage.go:58 extractMultiBaggage
[PROOF_MARKER]: baggage_multi_value_amplification p95_ms=7 per_req_alloc_bytes=10315458 per_req_allocs=16165
control:
cd poc
make control
control output (excerpt):
[NC_MARKER]: baggage_single_value_baseline p95_ms=0 per_req_alloc_bytes=133429 per_req_allocs=480
expected: multiple baggage header field-values should be semantically equivalent to a single comma-joined baggage value and should not multiply parsing/alloc work within the effective header byte budget.
actual: multiple baggage header field-values trigger repeated parsing and member aggregation, causing high per-request allocations and increased latency even when each individual value is within 8192 bytes.
fix recommendation
avoid repeated parsing across multi-values by enforcing a global budget and/or normalizing multi-values into a single value before parsing. one mitigation approach is to treat multi-values as a single comma-joined string and cap total parsed bytes (for example 8192 bytes total).
fix accepted when: under the default PoC harness settings, canonical stays within 2x of control for per_req_alloc_bytes and per_req_allocs, and p95_ms stays below 2ms.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐹Go | go.opentelemetry.io/otel | ≥ 1.36.0&&< 1.41.0 | 1.41.0go get go.opentelemetry.io/otel@v1.41.0 |
Affected Products
opentelemetryopentelemetryDetection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for go.opentelemetry.io/otel, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update go.opentelemetry.io/otel to 1.41.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-mh2q-q3fh-2475 is resolved across your whole dependency graph.
Workarounds
Cap what an attacker can consume: apply request size, rate and timeout limits in front of the affected component, and run it with memory and CPU limits so exhaustion degrades one worker rather than the whole service.
Fixing This On Your OS
If you run this on a Linux distribution, patch through your package manager against the distro's own security advisory below — it tracks the exact backported fix for your release, which can ship on a different timeline (and sometimes a different severity) than the upstream project.
This is an Important denial of service vulnerability in OpenTelemetry-Go, affecting Red Hat Multicluster Engine for Kubernetes. A remote attacker can exploit this flaw by sending multiple crafted `baggage` HTTP header lines, leading to excessive CPU and memory consumption and potentially rendering services…
| Product | Fixed in | Advisory |
|---|---|---|
| Cert Manager support for Red Hat OpenShift release 1.17 | cert-manager/cert-manager-operator-rhel9:1791788287 | RHSA-2026:82322 |
| Cert Manager support for Red Hat OpenShift release 1.17 | cert-manager/cert-manager-istio-csr-rhel9:1791378395 | RHSA-2026:82336 |
| Cert Manager support for Red Hat OpenShift release 1.19 | cert-manager/cert-manager-istio-csr-rhel9:1788348594 | RHSA-2026:63140 |
| Cert Manager support for Red Hat OpenShift release 1.20 | cert-manager/cert-manager-istio-csr-rhel9:1790223719 | RHSA-2026:72395 |
| Cert Manager support for Red Hat OpenShift release 1.20 | cert-manager/cert-manager-istio-csr-rhel9:1790589914 | RHSA-2026:72475 |
| Cluster Observability Operator 1.5 | cluster-observability-operator/cluster-observability-rhel9-operator:1787593637 | RHSA-2026:61314 |
| Logging Subsystem for Red Hat OpenShift 6.0 | openshift-logging/cluster-logging-rhel9-operator:1791830134 | RHSA-2026:83013 |
| Logging Subsystem for Red Hat OpenShift 6.2 | openshift-logging/cluster-logging-rhel9-operator:1789050399 | RHSA-2026:68349 |
Frequently Asked Questions
Is GHSA-mh2q-q3fh-2475 in your dependencies?
Find it across Go, including transitive dependencies.