CVE-2026-47256 Overview
CVE-2026-47256 affects the OpenTelemetry Collector Contrib Sentry exporter prior to version 0.154.0. The exporter reads a remote OTLP sender-controlled service.name resource attribute and passes the raw project slug into a Sentry API URL without validating it against projectSlugRegexp. An attacker who controls telemetry can inject special characters or path segments that redirect the authenticated request. The Collector attaches its operator-configured bearer token, which can then reach token-authorized administrative, organization, member, or key endpoints within the configured Sentry organization. Sentry token middleware prevents cross-organization access, limiting blast radius. The issue is categorized as path traversal [CWE-22].
Critical Impact
A remote sender can steer authenticated Sentry API requests to administrative endpoints inside the configured organization and redirect subsequently exported telemetry.
Affected Products
- OpenTelemetry Collector Contrib Sentry exporter versions prior to 0.154.0
- Deployments using exporter/sentryexporter with an operator-configured Sentry auth_token
- Collectors ingesting OTLP data from untrusted or multi-tenant sources
Discovery Timeline
- 2026-09-14 - CVE-2026-47256 published to NVD
- 2026-09-14 - Last updated in NVD database
Technical Details for CVE-2026-47256
Vulnerability Analysis
The Sentry exporter builds Sentry API URLs by interpolating a service.name value received from remote OTLP senders. In exporter/sentryexporter/sentry_exporter.go, extractProjectSlug and getOrCreateProjectEndpoint read the attribute and pass the raw project slug to GetOTLPEndpoints and GetProjectKeys in exporter/sentryexporter/sentry_client.go. The slug is embedded directly into the API URL. Because validateRoutingConfig in exporter/sentryexporter/config.go never enforces projectSlugRegexp at runtime, special characters can convert the expected path suffix into query data. Slash and dot segments can also traverse paths when the Sentry deployment normalizes them.
Root Cause
The root cause is missing input validation on an untrusted resource attribute before URL construction. The projectSlugRegexp pattern exists in the codebase but is not applied to sender-controlled values at runtime. Standard URL escaping such as url.PathEscape was also missing from the slug interpolation call sites.
Attack Vector
An attacker who can send OTLP telemetry to the Collector sets a crafted service.name resource attribute. When the Sentry exporter processes the batch, it constructs an API URL that traverses to a different endpoint under the configured Sentry organization. The Collector's operator-configured bearer token is attached to the outbound request, granting the crafted URL the exporter's authorization scope. Successful requests can reach token-authorized administrative, organization, member, or key endpoints, and an attacker-controlled project slug can redirect subsequently exported telemetry.
// Patch in exporter/sentryexporter/config.go - enforces projectSlugRegexp on OrgSlug
if cfg.OrgSlug == "" {
return errors.New("'org_slug' is required")
}
if !projectSlugRegexp.MatchString(cfg.OrgSlug) {
return fmt.Errorf("'org_slug' %q must match %q", cfg.OrgSlug, projectSlugRegexp.String())
}
if cfg.AuthToken == "" {
return errors.New("'auth_token' is required")
}
Source: GitHub Commit 3113638
// Patch in exporter/sentryexporter/sentry_client.go - applies url.PathEscape to orgSlug
func (c *sentryClient) GetAllProjects(ctx context.Context, orgSlug string) ([]projectInfo, error) {
baseURL := fmt.Sprintf("%s/api/0/organizations/%s/projects/", c.baseURL, url.PathEscape(orgSlug))
cursor := ""
var projects []projectInfo
Source: GitHub Commit 3113638
Detection Methods for CVE-2026-47256
Indicators of Compromise
- Outbound requests from the Collector to Sentry API paths outside /api/0/projects/{org}/{project}/ such as /api/0/organizations/, /members/, or /keys/.
- OTLP payloads containing service.name values with /, .., ?, #, or URL-encoded equivalents.
- Unexpected changes to Sentry project keys, DSNs, or organization membership coinciding with telemetry ingestion.
Detection Strategies
- Parse egress HTTP logs from the Collector and alert on Sentry API paths that do not match the expected project-scoped route template.
- Inspect OTLP ingest for service.name resource attributes that fail a strict slug regex such as ^[a-zA-Z0-9_.-]+$.
- Correlate Sentry audit log events (member changes, key rotations) with Collector request timestamps.
Monitoring Recommendations
- Enable Sentry organization audit logging and forward events to your SIEM for correlation with Collector activity.
- Monitor deployed opentelemetry-collector-contrib versions across the fleet and alert on any release below 0.154.0 that loads the sentryexporter.
- Track anomalous URL structures in outbound telemetry-exporter traffic using existing network detection tooling.
How to Mitigate CVE-2026-47256
Immediate Actions Required
- Upgrade opentelemetry-collector-contrib to version 0.154.0 or later on all Collectors that load the Sentry exporter.
- Rotate the Sentry auth_token configured in any affected Collector, since it may have been used against unintended endpoints.
- Review Sentry audit logs for unexpected administrative, membership, or key-related API calls originating from Collector source addresses.
Patch Information
The fix is included in OpenTelemetry Collector Contrib v0.154.0. The patch enforces projectSlugRegexp in validateRoutingConfig and applies url.PathEscape to slug values before URL interpolation. See the GHSA-4jvg-4jfx-fmhc advisory and the upstream commit for details.
Workarounds
- Restrict OTLP ingestion to trusted, authenticated senders using mTLS or network segmentation until patching completes.
- Apply a Collector processor that drops or sanitizes service.name attributes not matching ^[a-zA-Z0-9_.-]+$.
- Scope the Sentry auth_token to the minimum permissions required for telemetry ingestion and remove organization-administrative rights.
# Example transform processor rule to drop unsafe service.name values
processors:
transform/sanitize:
error_mode: ignore
trace_statements:
- context: resource
statements:
- delete_key(attributes, "service.name") where not IsMatch(attributes["service.name"], "^[a-zA-Z0-9_.-]+$")
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

