CVE-2026-81869: OpenTelemetry-Go: UTF-8 replacement rune bypasses attribute length truncation
Summary
The OpenTelemetry Go SDK trace package can fail to enforce AttributeValueLengthLimit for string attributes containing the valid Unicode replacement character U+FFFD. An oversized attacker-controlled attribute value that includes U+FFFD is returned untruncated, bypassing the configured memory/DoS protection and allowing increased per-span memory usage. The finding is low severity because it requires a deployment with attribute value length limits enabled and attacker-controlled data being recorded into span attributes.
Introduced in commit 49a6536
Details
String and string-slice span attributes are truncated through safeTruncate when AttributeValueLengthLimit is non-negative. The finding evidence identifies this enforcement path in sdk/trace/span.go:303-331, with string attributes passed to safeTruncate at sdk/trace/span.go:309-310 and string-slice entries passed to safeTruncate in the loop beginning at sdk/trace/span.go:312.
safeTruncate first calls safeTruncateValidUTF8; if that returns ok=false, it calls strings.ToValidUTF8(input, "") and retries. The relevant code is identified in sdk/trace/span.go:337-355. safeTruncateValidUTF8 treats any utf8.RuneError from utf8.DecodeRuneInString as invalid UTF-8 and immediately returns the original input with ok=false. However, Go also returns utf8.RuneError for a valid encoded U+FFFD rune. The validation artifact confirms this behavior with output r=U+FFFD size=3 runeError=true.
For an input such as "AAAA" + U+FFFD + strings.Repeat("B", 20) and a limit of 5, the first truncation attempt sees U+FFFD as utf8.RuneError and returns the full input with ok=false. strings.ToValidUTF8 does not remove the valid U+FFFD rune, so the second attempt returns the same full input. As a result, the span attribute value remains 27 bytes long even though the configured limit is 5.
PoC
validation-artifact.zip
The validation artifact contains a package-level Go test at validation-artifact.tar:safetruncatebypass/safetruncatepoctest.go and supporting output at validation-artifact.tar:safetruncatebypass/runecheckoutput.txt.
Reproduction configuration: - Repository: pellared/opentelemetry-go - Commit: 49a6536 from September 12, 2022 - Package/module path: sdk/trace under the sdk module - Attribute value length limit used by the PoC: limit := 5 - Dependencies must be available through the network or a local module cache/vendor directory.
Commands: sh cd /path/to/opentelemetry-go git checkout 49a6536 tar -xOf /path/to/validation-artifact.tar safetruncatebypass/safetruncatepoctest.go > sdk/trace/safetruncatepoctest.go cd sdk go test ./trace -run TestSafeTruncateBypass -count=1 -v
Expected vulnerable output includes a failing test showing that the returned value exceeds the configured limit: text === RUN TestSafeTruncateBypass safetruncatepoctest.go:14: inputlen=27 gotlen=27 input="AAAA�BBBBBBBBBBBBBBBBBBBB" got="AAAA�BBBBBBBBBBBBBBBBBBBB" safetruncatepoctest.go:16: bypass: gotlen 27 > limit 5 --- FAIL: TestSafeTruncateBypass
The artifact also records the standalone UTF-8 behavior needed for the bypass: sh tar -xOf /path/to/validation-artifact.tar safetruncatebypass/runecheckoutput.txt
Expected output: text r=U+FFFD size=3 runeError=true
Impact
This is a Unicode handling and resource-limit bypass that weakens span attribute memory controls. Applications that enable AttributeValueLengthLimit to bound memory usage can still store oversized attacker-controlled attribute values if those values contain U+FFFD. The practical impact is increased memory use and reduced denial-of-service protection in the instrumented process; the finding does not show confidentiality or integrity impact.
Other sources
OpenTelemetry-Go is the Go implementation of OpenTelemetry. From version 1.10.0 until 1.33.0, the sdk/trace/span.go attribute truncation path can fail to enforce AttributeValueLengthLimit for string and string-slice attributes containing the valid Unicode replacement character U+FFFD. safeTruncateValidUTF8 treats the valid replacement rune as invalid UTF-8 and returns the original input, while strings.ToValidUTF8 leaves that valid rune unchanged, so a second safeTruncate attempt can also return the oversized value. An attacker who controls span attribute content can retain values longer than the configured limit, increasing per-span memory use and weakening denial-of-service protection in the instrumented process. This issue is fixed in version 1.33.0.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
go/go.opentelemetry.io/otel/sdkto a version that resolves this vulnerability.Fixed in 1.33.0 - Upgrade
Upgrade
OpenTelemetry-Goto a version that resolves this vulnerability.Fixed in 1.33.0
Event History
Frequently Asked Questions
Who is exposed to this issue?
Instrumented Go processes using OpenTelemetry-Go versions 1.10.0 through versions before 1.33.0 are exposed if they configure AttributeValueLengthLimit and process span string or string-slice attribute values containing U+FFFD.
What must an attacker control to exploit the issue?
An attacker needs to be able to influence span attribute content so that an oversized string or string-slice value includes the valid Unicode replacement character U+FFFD. This can cause the configured attribute length limit not to be enforced.
Are deployments without an attribute value length limit affected?
The described bypass affects enforcement of AttributeValueLengthLimit. The provided information does not indicate an impact where that limit is not configured.
What is the remediation?
Upgrade OpenTelemetry-Go to version 1.33.0, which fixes the truncation behavior. If upgrading is not immediately possible, prevent untrusted input from being used directly as span attribute values and constrain attribute value sizes before they reach OpenTelemetry instrumentation.