GHSA-8wmf-6v46-5gfg CVE-2026-81870 GO-2026-6505
OpenTelemetry-Go: Exporter config logging may leak endpoint URLs in info logs
- Severity
- 2.0 / 10
- Low · CVSS 4.0
- Exploit chance (EPSS)
- 0.27%
- Chance of exploitation in the next 30 days. Higher than 18.56% of scored vulnerabilities.
- Known exploited
- No
- Not in CISA's catalog
- Weakness
- CWE-200 Exposure of Sensitive Information to an Unauthorized Actor
- CWE-532 Insertion of Sensitive Information into Log File
- Fix
- Available
- 5 packages have a fixed version
Description
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:
- the provider's span processors;
- each processor's span exporter; and
- 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
Insecureflag; 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:
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:
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.
Affected versions
Go
| Package | Vulnerable | Fixed in |
|---|---|---|
| go.opentelemetry.io/otel/exporters/otlp/otlptrace | >= 1.5.0, <= 1.44.0 |
No fix yet |
| go.opentelemetry.io/otel/exporters/otlp/otlptrace | >= 1.5.0, < 1.45.0 |
1.45.0 |
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc | >= 1.5.0, <= 1.44.0 |
No fix yet |
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc | >= 1.5.0, < 1.45.0 |
1.45.0 |
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp | >= 1.5.0, <= 1.44.0 |
No fix yet |
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp | >= 1.5.0, < 1.45.0 |
1.45.0 |
| go.opentelemetry.io/otel/exporters/zipkin | >= 1.5.0, <= 1.44.0 |
No fix yet |
| go.opentelemetry.io/otel/exporters/zipkin | >= 1.5.0, < 1.45.0 |
1.45.0 |
| go.opentelemetry.io/otel/sdk | >= 1.5.0, <= 1.44.0 |
No fix yet |
| go.opentelemetry.io/otel/sdk | >= 1.5.0, < 1.45.0 |
1.45.0 |
How to fix
Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.
go.opentelemetry.io/otel/exporters/otlp/otlptrace Go → 1.45.0
- go
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace@v1.45.0 && go mod tidy
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc Go → 1.45.0
- go
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@v1.45.0 && go mod tidy
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp Go → 1.45.0
- go
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp@v1.45.0 && go mod tidy
go.opentelemetry.io/otel/exporters/zipkin Go → 1.45.0
- go
go get go.opentelemetry.io/otel/exporters/zipkin@v1.45.0 && go mod tidy
go.opentelemetry.io/otel/sdk Go → 1.45.0
- go
go get go.opentelemetry.io/otel/sdk@v1.45.0 && go mod tidy
Severity breakdown
CVSS 4.0 2.0
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N
- Attack vector
- Local
- Attack complexity
- Low
- Attack requirements
- Present
- Privileges required
- Low
- User interaction
- None
- Confidentiality (vulnerable system)
- Low
- Integrity (vulnerable system)
- None
- Availability (vulnerable system)
- None
- Confidentiality (subsequent systems)
- None
- Integrity (subsequent systems)
- None
- Availability (subsequent systems)
- None
Weakness
CWE-200: Exposure of Sensitive Information to an Unauthorized Actor
The product exposes sensitive information to an actor that is not explicitly authorized to have access to that information.
How to prevent it
- Architecture and Design: Compartmentalize the system to have "safe" areas where trust boundaries can be unambiguously drawn. Do not allow sensitive data to go outside of the trust boundary and always be careful when interfacing with a compartment outside of the safe area. Ensure that appropriate compartmentalization is built into the system design, and the compartmentalization allows for and reinforces privilege separation functionality. Architects and designers should rely on the principle of least privilege to decide the appropriate time to use privileges and the time to drop privileges.
CWE-532: Insertion of Sensitive Information into Log File
The product writes sensitive information to a log file.
How to prevent it
- Architecture and Design, Implementation: Consider seriously the sensitivity of the information written into log files. Do not write secrets into the log files.
- Distribution: Remove debug log files before deploying the application into production.
- Operation: Protect log files against unauthorized read/write.
- Implementation: Adjust configurations appropriately when software is transitioned from a debug state to production.
References
Advisories
Fixes and patches
Packages
Other links
Timeline
- Published
- Last updated by the source
- Latest EPSS score
Related advisories
| Advisory | Severity | Why it's related |
|---|---|---|
| GHSA-p9f8-wvj8-2fg8 OpenTelemetry-Go: UTF-8 replacement rune bypasses attribute length truncation | Medium | Also affects go.opentelemetry.io/otel/sdk |
| GHSA-hfvc-g4fc-pqhx opentelemetry-go: BSD kenv command not using absolute path enables PATH hijacking | High | Also affects go.opentelemetry.io/otel/sdk |
| GHSA-w8rr-5gcm-pp58 opentelemetry-go: OTLP HTTP exporters read unbounded HTTP response bodies | Medium | Also affects go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp |
| GHSA-9h8m-3fm2-qjrq OpenTelemetry Go SDK Vulnerable to Arbitrary Code Execution via PATH Hijacking | High | Also affects go.opentelemetry.io/otel/sdk |
| GHSA-j7qq-vr8c-xvw3 MLflow CrewAI autologging records LLM provider API keys in logged trace spans | Medium | Same weakness, CWE-200 |
| GHSA-gqh3-7856-rjjg ApostropheCMS: :_id/locales REST route omits the public-API authorization gate its sibling read routes enforce (unauthenticated doc-existence + locale metadata disclosure) | Medium | Same weakness, CWE-200 |
| GHSA-rqgm-cfrp-4hx8 ApostropheCMS: Unauthenticated publicApiProjection bypass via search and sort query builders in the public REST API | Medium | Same weakness, CWE-200 |
| GHSA-f66c-mpj2-3r8h ApostropheCMS: POST /api/v1/@apostrophecms/doc/slugTaken discloses existence of private/admin-only content to any authenticated user | Medium | Same weakness, CWE-200 |
Credits: MrAlias, pellared
MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.
Check your repos with MergeHarbor