Repository navigation
chore(deps): update module go.opentelemetry.io/otel/trace to v1.47.0 [security] - #1278
renovate[bot] wants to merge 1 commit into
Conversation
ℹ️ Artifact update noticeFile name: go.modIn order to perform the update(s) described in the table above, Renovate ran the
Details:
|
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
Important Review skippedBot user detected. To trigger a single review, invoke the
|
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
v1.44.0→v1.47.0opentelemetry-go: AttributeValueLengthLimit is fully bypassed by attribute values composed of valid U+FFFD runes
CVE-2026-128085 / GHSA-q7gw-24fr-5p69
More information
Details
Summary
The
AttributeValueLengthLimitspan/log-record limit can be bypassed entirely with attribute values that consist of valid U+FFFD (REPLACEMENT CHARACTER) runes. The counting-based truncation introduced by the fix for GHSA-p9f8-wvj8-2fg8 (commite016a78c9, first released in v1.33.0) has an "optimistic" fast path that skips every U+FFFD without counting it and without falling back to the correct slow path. A value of 1000 U+FFFD runes (3000 bytes) is stored verbatim even with a limit of 5 characters (15 bytes). The same defect affects the attribute truncation paths ingo.opentelemetry.io/otel/sdk/trace(sdk/internal/attrnorm),go.opentelemetry.io/otel/sdk/log(sdk/log/internal/attrnorm), and the auto-instrumentation tracer ingo.opentelemetry.io/otel/trace(trace/auto.go, introduced inv1.35.0).This is an incomplete-fix issue: it is a distinct defect in the replacement code that GHSA-p9f8-wvj8-2fg8 introduced, affecting exactly the versions that advisory says are fixed (>= v1.33.0). The original advisory covers only the pre-v1.33.0 code.
Details
The shared truncation helper is generated from
internal/shared/attrnorm/truncate.go.tmpl. In the v1.46.0 release, the generated copies aresdk/internal/attrnorm/truncate.goandsdk/log/internal/attrnorm/truncate.go(identical logic, different package names). The optimistic path (v1.46.0,sdk/internal/attrnorm/truncate.go:175-199) is:rangeover a string yieldsutf8.RuneErrorboth for invalid bytes (size 1) and for a legitimately encoded U+FFFD (size 3). Only the size-1 case enters the slow path. A valid U+FFFD rune is therefore neither counted nor truncating: the loop slides over it. Consequences:count, so no truncation ever triggers and the value is returned unchanged, whatever its length.return s[:i]keeps all previously skipped U+FFFD runes, so the retained size grows linearly with the number of U+FFFD runes and is not bounded bylimit.The OpenTelemetry specification states that truncation applies "counting any character in it as 1". A valid U+FFFD is one character and must count as 1; here it counts as 0. The regression test suite of the repository contains no U+FFFD case, which is why this went unnoticed.
Call chains (v1.46.0):
span.SetAttributes->sdk/trace/span.go(normAttr) ->attrnorm.Truncate->sdk/internal/attrnorm/truncate.go(truncate)Record.AddAttributes/SetAttributes->sdk/log/record.go(attrnorm.TruncateValue) ->sdk/log/internal/attrnorm/truncate.go(truncate)Deduplication: GHSA-p9f8-wvj8-2fg8 describes the pre-v1.33.0 helper (
safeTruncateValidUTF8), which gave up truncating entirely for strings containing RuneError. The rewrite ine016a78c9replaced that code; this report concerns the rewritten code, is present only in versions that the advisory lists as fixed, and no public issue or advisory describes it.PoC
Minimal reproduction with the published release (no repository checkout needed). Go 1.25+ is required (the release declares
go 1.25.0; any recent toolchain auto-selects one).Create a directory with these files.
go.mod(then rungo mod tidyonce to fillgo.sum):otelgo_truncate_test.go:(The
-runpattern above selects the three truncation cases plus the control; the fourth test function is included because it is part of the exact file that produced the output below - it compiles but is not selected by the pattern, and its output does not appear.)otelgo_log_truncate_test.go:Run:
Expected output (captured against the published v1.46.0 modules; the three FAIL lines are the bypass being triggered and the PASS control proves the limit is active in the same setup; the only varying parts are the durations in parentheses and the total on the
FAIL otelpocsummary line):The mixed-string case stores 105 characters for a limit of 5: the 100 U+FFFD runes (300 uncounted bytes) are all retained, plus 5 of the 6 ASCII characters.
Impact
Applications that enable
AttributeValueLengthLimit(orWithAttributeValueLengthLimitfor logs) to bound attribute memory do not get that bound for values containing valid U+FFFD runes. Span and log-record attribute values are routinely derived from untrusted input (HTTP headers, request bodies, database fields), so an attacker can inflate per-span memory retention linearly, defeating the memory protection the operator explicitly enabled and accumulating increased memory usage over the span/log pipeline. Confidentiality and integrity are not affected.Suggested fix
In the optimistic loop, count every rune of size > 1 (including the legitimately encoded U+FFFD) and only divert size-1 invalid bytes to the slow path. Add regression cases for: pure U+FFFD strings, U+FFFD-dominated mixed strings, and a truncation point landing after a U+FFFD (the current
truncate_test.gohas no U+FFFD case).Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
open-telemetry/opentelemetry-go (go.opentelemetry.io/otel/trace)
v1.47.0: /v0.69.0/v0.23.0/v0.1.0Compare Source
This release contains the first stable release of the OpenTelemetry Go Logs API and SDK.
Our project stability guarantees now apply to the following modules:
go.opentelemetry.io/otel/loggo.opentelemetry.io/otel/sdk/logSee our versioning policy for more information about these stability guarantees.
Added
Stringmethod forKeyValuetype ingo.opentelemetry.io/otel/attribute. (#8205)Stringmethod forSettype ingo.opentelemetry.io/otel/attribute. (#8347)WithMaxExportBatchSizetogo.opentelemetry.io/otel/sdk/metricto configure the maximum export batch size forPeriodicReader. (#8960)WithAttributeValueDepthLimit,DefaultAttributeValueDepthLimit, andSpanLimits.AttributeValueDepthLimitingo.opentelemetry.io/otel/sdk/traceto configure the maximum depth of span, event, link, and instrumentation scope attribute values. (#8938)WithAttributeValueDepthLimitingo.opentelemetry.io/otel/sdk/logto configure the maximum depth of log record and instrumentation scope attribute values. (#8938)WithMaxResponseSizetogo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp,go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp, andgo.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp. (#8941)ProbabilitySampleringo.opentelemetry.io/otel/sdk/trace/xthat conforms to the OpenTelemetry specification's threshold-based sampling algorithm. (#8123)*Binderextension interfaces ingo.opentelemetry.io/otel/metric/xfor instruments that support binding attributes ahead of time. (#8760)Finishersynchronous metric instrument extension interface togo.opentelemetry.io/otel/metric/x. (#8906)Changed
go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest. (#8993)go.opentelemetry.io/otel/sdk/traceandgo.opentelemetry.io/otel/sdk/log. (#8938)go.opentelemetry.io/otel/sdk/traceandgo.opentelemetry.io/otel/sdk/logby rebuilding composite values only when truncation is needed. (#8912)traceparentusing a hex lookup table ingo.opentelemetry.io/otel/propagation, which rejects the specification-disallowed upper-case characters without a separate scan of the header. (#8739)TraceIDFromHexandSpanIDFromHexingo.opentelemetry.io/otel/traceto eliminate bounds checks. (#8740)Fixed
go.opentelemetry.io/otel/trace,go.opentelemetry.io/otel/sdk/trace, andgo.opentelemetry.io/otel/sdk/log.go.opentelemetry.io/otel/trace,go.opentelemetry.io/otel/sdk/trace, andgo.opentelemetry.io/otel/sdk/log. (#9054)NewPeriodicReaderwherer.instwas assigned after the background goroutine was launched ingo.opentelemetry.io/otel/sdk/metric. (#9028)int64values inSum,Histogram, andExponentialHistogramaggregations ingo.opentelemetry.io/otel/sdk/metric. (#8981)grpc.DialOptionvalues passed viaWithDialOptiontake precedence over conflicting internally-computed defaults ingo.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc,go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc, andgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc. (#8805, #8834, #8836)OTEL_METRIC_EXPORT_INTERVALandOTEL_METRIC_EXPORT_TIMEOUTvalues as invalid ingo.opentelemetry.io/otel/sdk/metric. (#8800)NewFixedSizeReservoirandFixedSizeReservoirProviderwhen given a negative size ingo.opentelemetry.io/otel/sdk/metric/exemplar; negative sizes are now clamped to zero, consistent with a size of zero. (#8832)ZeroThresholdduring OTLP metric export ingo.opentelemetry.io/otel/exporters/otlp/otlpmetric. (#8801)go.opentelemetry.io/otel/semconv/v1.32.0,go.opentelemetry.io/otel/semconv/v1.33.0, andgo.opentelemetry.io/otel/semconv/v1.34.0record measurements only once when no attributes are provided. (#8849)OTEL_TRACES_SAMPLERandOTEL_TRACES_SAMPLER_ARGvalues as unset ingo.opentelemetry.io/otel/sdk/trace. (#8873)OTEL_EXPORTER_OTLP_ENDPOINTpath joining ingo.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttpso trailing-slash base URLs do not produce double-slash log export paths. (#8864)RecordErrorcalls back into the span ingo.opentelemetry.io/otel/sdk/trace. (#8815)SimpleSpanProcessor.Shutdownfrom panicking when constructed with a nil exporter ingo.opentelemetry.io/otel/sdk/trace. (#8844)go.opentelemetry.io/otel/exporters/prometheus. (#8839)go.opentelemetry.io/otel/metric/x.WithDefaultAttributeswhen a matching View ingo.opentelemetry.io/otel/sdk/metricdoes not specify an attribute filter. (#8859)OTEL_EXPORTER_OTLP_ENDPOINTandOTEL_EXPORTER_OTLP_METRICS_ENDPOINT, while preservingunix://andunix-abstract://targets; treatunix-abstract://endpoints as insecure ingo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpcandgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp. (#8862)OTEL_EXPORTER_OTLP_ENDPOINTandOTEL_EXPORTER_OTLP_TRACES_ENDPOINTingo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc. (#8852)Propertyvalues on demand ingo.opentelemetry.io/otel/baggageandgo.opentelemetry.io/otel/propagation.Removed
OTEL_GO_X_METRIC_EXPORT_BATCH_SIZEenvironment variable ingo.opentelemetry.io/otel/sdk/metric.Use the
WithMaxExportBatchSizeoption instead. (#8960)What's Changed
18b4a75by @renovate[bot] in #8907d60c349by @renovate[bot] in #890986cb573by @renovate[bot] in #88957bb06b0by @renovate[bot] in #8902af8eda3by @renovate[bot] in #8915241134dby @renovate[bot] in #8913043ea8aby @renovate[bot] in #8919ae99b73by @renovate[bot] in #8923ProbabilitySamplerby @yuanyuanzhao3 in #81230277a17by @renovate[bot] in #8931f8649ddby @renovate[bot] in #8929e5a4d62by @renovate[bot] in #894555ac43cby @renovate[bot] in #894315ceca2by @renovate[bot] in #89486c9e17dby @renovate[bot] in #8950f61a6caby @renovate[bot] in #895161ebaa5by @renovate[bot] in #8968eeb232eby @renovate[bot] in #8983cecb647by @renovate[bot] in #8986b142276by @renovate[bot] in #8991bdcd072by @renovate[bot] in [#8990](https://redirect.github.com/open-telemetry/opeConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.