CVE-2026-81870: OpenTelemetry-Go: Exporter config logging may leak endpoint URLs in info logs
Summary
OpenTelemetry Go versions 1.5.0 through 1.44.0 can include trace exporter endpoint configuration in an internal diagnostic log emitted when an SDK TracerProvider is created. The default OpenTelemetry logger does not emit this event. Exposure requires an application to install a logger that enables OpenTelemetry's internal Info-level diagnostics and for someone other than the intended audience to have access to those logs.
The logged configuration can disclose the address of the trace collector and whether the OTLP/HTTP connection is configured as insecure. The Zipkin exporter logs its complete collector URL, so credentials in URL userinfo or tokens in the query string are also disclosed if an application embeds them there. OTLP authentication headers, TLS key material, and exported span data are not included in this log.
Exporter MarshalLog implementations that caused this configuration to be included in internal logs were introduced by a1fff3c.
Details
When sdk/trace.NewTracerProvider constructs a provider, it records a TracerProvider created internal Info event containing the provider configuration. In affected versions, the configuration's MarshalLog methods recursively include:
1. the provider's span processors; 2. each processor's span exporter; and 3. for the OTLP trace exporter, its client configuration.
This causes the following values to be present in the event:
- OTLP trace gRPC: the configured endpoint; - OTLP trace HTTP: the configured endpoint and the Insecure flag; and - Zipkin: the complete collector URL.
OpenTelemetry Go does not emit this event with its default logger, which only emits errors. An application must explicitly configure a sufficiently verbose logger with otel.SetLogger. The required logr verbosity is version-dependent:
- versions 1.5.0 through 1.14.x use V(1) for this Info event; and - versions 1.15.0 through 1.44.0 use V(4).
OTLP header configuration is not part of the marshaled object, so credentials supplied with WithHeaders or the corresponding environment variables are not exposed. The documented OTLP WithEndpoint input is a collector address rather than a credential-bearing URL. The higher-risk case is therefore the Zipkin collector URL, which is retained and logged in full, or an application passing sensitive data in an OTLP endpoint outside the documented format.
Proof of concept
The following program demonstrates the behavior with OpenTelemetry Go 1.44.0. It deliberately places credentials and a token in the Zipkin collector URL and enables internal Info logging:
go package main
import ( "bytes" "context" "fmt"
"github.com/go-logr/logr/funcr" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/zipkin" sdktrace "go.opentelemetry.io/otel/sdk/trace" )
func main() { var logs bytes.Buffer otel.SetLogger(funcr.New(func(, args string) { , = logs.WriteString(args) }, funcr.Options{Verbosity: 4}))
exporter, err := zipkin.New( "http://user:pass@zipkin.internal:9411/api/v2/spans?token=secret", ) if err != nil { panic(err) }
tp := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter)) = tp.Shutdown(context.Background())
fmt.Println(logs.String()) }
The TracerProvider created event contains:
text http://user:pass@zipkin.internal:9411/api/v2/spans?token=secret
For versions before 1.15.0, set funcr.Options{Verbosity: 1} instead.
Impact
This is a conditional disclosure through application logs. Affected applications must enable verbose OpenTelemetry internal diagnostics and configure a trace exporter containing information they do not intend to expose to readers of those logs. In that configuration, a person or system with log access can learn the trace collector address and internal network topology. If credentials or tokens are embedded directly in a Zipkin collector URL, those values can also be recovered from the logs.
There is no exposure with the default OpenTelemetry logger, and the vulnerable log is generated from local application configuration rather than remotely supplied span data. OTLP authentication headers, certificate or private-key contents, and telemetry payloads are not logged by this path.
Remediation
Upgrade the affected OpenTelemetry Go modules to version 1.45.0 or later. The fix in 3a1412d stops recursively marshaling exporter and client configuration and records their types instead.
If an immediate upgrade is not possible:
- keep OpenTelemetry internal logging below the Info verbosity described above; - do not embed credentials or tokens in exporter endpoint URLs; use authentication headers or another supported credential mechanism; and - restrict access to existing logs and rotate any credentials that may already have been recorded.
Other sources
OpenTelemetry-Go is the Go implementation of OpenTelemetry. From version 1.5.0 to 1.44.0, sdk/trace.NewTracerProvider emits a TracerProvider created internal Info-level diagnostic event whose MarshalLog implementations recursively include span processor, exporter, and client configuration. Applications that call otel.SetLogger to enable OpenTelemetry internal Info logging can therefore record OTLP gRPC and HTTP collector endpoints, the OTLP HTTP Insecure flag, and complete Zipkin collector URLs. A person or system with access to those logs can learn internal collector topology and can recover credentials or tokens embedded in Zipkin URL user information or query strings. The default OpenTelemetry logger does not emit the event, and this path does not log OTLP authentication headers, TLS key material, or span payloads. This issue is fixed in version 1.45.0.
— MITRE
OpenTelemetry-Go: Exporter config logging may leak endpoint URLs in info logs
— Microsoft
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
go/go.opentelemetry.io/otel/exporters/zipkinto a version that resolves this vulnerability.Fixed in 1.45.0 - Upgrade
Upgrade
go/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttpto a version that resolves this vulnerability.Fixed in 1.45.0 - Upgrade
Upgrade
go/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpcto a version that resolves this vulnerability.Fixed in 1.45.0 - Upgrade
Upgrade
go/go.opentelemetry.io/otel/exporters/otlp/otlptraceto a version that resolves this vulnerability.Fixed in 1.45.0 - Upgrade
Upgrade
go/go.opentelemetry.io/otel/sdkto a version that resolves this vulnerability.Fixed in 1.45.0 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 1.7.0-1 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 2.4.0-1 - Upgrade
Upgrade
go.opentelemetry.io/otelto a version that resolves this vulnerability.Fixed in 1.45.0 - Upgrade
Upgrade
go.opentelemetry.io/otel/sdk/traceto a version that resolves this vulnerability.Fixed in 1.45.0 - Configuration
If immediate upgrade is not possible for versions before 1.15.0, set `funcr.Options{Verbosity: 1}` instead of enabling the vulnerable Info-level verbosity via `otel.SetLogger`.
OpenTelemetry Go internal logging (otel.SetLogger / funcr.Options verbosity) funcr.Options{Verbosity: ...} = 1 - Configuration
For versions 1.15.0 through 1.44.0, avoid using `funcr.Options{Verbosity: 4}` for `otel.SetLogger` (this verbosity level enables the vulnerable internal Info logging that can include OTLP/Zipkin endpoint configuration).
OpenTelemetry Go internal logging (otel.SetLogger / funcr.Options verbosity) funcr.Options{Verbosity: ...} = 4 - Configuration
For versions 1.5.0 through 1.14.x, avoid using the vulnerable Info-level verbosity for `otel.SetLogger` (the issue description states versions 1.5.0 through 1.14.x use `V(1)` for the Info event).
OpenTelemetry Go internal logging (otel.SetLogger / funcr.Options verbosity) funcr.Options{Verbosity: ...} = 1 - Configuration
Do not embed credentials or tokens in Zipkin exporter endpoint URLs (e.g., avoid `user:pass@...` in the URL and tokens in query strings); use authentication headers or another supported credential mechanism instead.
Zipkin exporter endpoint configuration (zipkin.New) Zipkin collector URL = no credentials/tokens in URL userinfo or query string - Compensating control
Restrict access to existing application logs that may contain the internal Info-level event with trace exporter endpoint/collector URL details, and rotate any credentials/tokens that may already have been recorded.
Event History
Frequently Asked Questions
Which deployments are exposed to this logging leak?
Deployments using OpenTelemetry-Go versions 1.5.0 through 1.44.0 are exposed only if they call otel.SetLogger and enable OpenTelemetry internal Info-level logging. The default OpenTelemetry logger does not emit the affected event.
What information could an observer recover from affected logs?
Affected logs can reveal OTLP gRPC and HTTP collector endpoints, the OTLP HTTP Insecure setting, and complete Zipkin collector URLs. Zipkin URLs may expose credentials or tokens if those are embedded in URL user information or query strings.
What should teams do if they cannot immediately upgrade?
Disable OpenTelemetry internal Info-level logging or avoid configuring it through otel.SetLogger, and restrict access to existing application logs. Review logs produced when TracerProvider instances were created for Zipkin URLs containing user information or query-string credentials or tokens.
What information is not included by this logging path?
The affected event does not log OTLP authentication headers, TLS key material, or span payloads.