GHSA-45rx-2jwx-cxfr

    Dashboard / Vulnerabilities / GHSA-45rx-2jwx-cxfr

    GHSA-45rx-2jwx-cxfr

    Published: 21 Jul 2026Last Modified: 10 Sept 2026

    Summary: OpenTelemetry JavaScript: Denial of service in `JaegerPropagator` via unhandled exception on a malformed header

    Details: ## Summary `@opentelemetry/propagator-jaeger` decodes incoming HTTP header values with `decodeURIComponent()` without handling decode errors. A single request carrying a malformed percent-encoded value (for example a bare `%`) in an `uber-trace-id` or `uberctx-*` header throws an uncaught `URIError`, terminating any Node.js process that uses `JaegerPropagator` as its active propagator. ## Impact **Denial of Service:** Any unauthenticated remote attacker who can send an HTTP request to a service that has `JaegerPropagator` registered as the global propagator (e.g. via `OTEL_PROPAGATORS=jaeger` or `propagation.setGlobalPropagator(new JaegerPropagator())`) can terminate the process with a single request. Confidentiality and integrity are not affected. ## Am I affected? This issue affects only a specific, opt-in configuration. If you use OpenTelemetry's default propagators (W3C TraceContext and Baggage), you are **not** affected. You are affected only if you have registered `JaegerPropagator` as the active propagator. Check for: - `@opentelemetry/propagator-jaeger` in your dependency tree, **and** - `OTEL_PROPAGATORS` set to `jaeger` (Jaeger only), **or** a direct `propagation.setGlobalPropagator(new JaegerPropagator())` call in your code. Note: if `JaegerPropagator` is combined with other propagators through a `CompositePropagator` (for example `OTEL_PROPAGATORS=jaeger,tracecontext`), the process does not terminate - the composite propagator catches the error - but affected requests silently fail to extract context. You should still upgrade. ## Patched versions - `@opentelemetry/propagator-jaeger` 2.9.0 ## Remediation Update `@opentelemetry/propagator-jaeger` to 2.9.0 or later. The propagator now ignores header values it cannot decode instead of throwing. **Interim mitigation (if you cannot update):** Trace-context headers should never be accepted unfiltered from untrusted callers. Until you can upgrade, strip or validate the `uber-trace-id` and `uberctx-*` headers on inbound requests at your edge - for example with a reverse proxy, API gateway, or load balancer (nginx, Envoy, etc.) - so that only trusted upstream services can set them. ## Details `JaegerPropagator.extract()` calls `decodeURIComponent()` on raw header values at two unguarded call sites: the `uber-trace-id` trace header and each `uberctx-*` baggage value. `decodeURIComponent()` throws `URIError: URI malformed` on invalid percent-encoding. Because the HTTP instrumentation extracts context before its request-handler error wrapper, and a single configured propagator is not wrapped in a `CompositePropagator` (which would otherwise catch the error), the exception propagates as an `uncaughtException` and terminates the process. ## Proof of concept Against a service using `JaegerPropagator`: ```bash curl -H 'uberctx-user: %' http://target/ # or curl -H 'uber-trace-id: %' http://target/ ``` The Node.js process exits with `URIError: URI malformed` and subsequent requests are refused.

    Affected packages

    Package

    Name: @opentelemetry/propagator-jaeger

    Purl: pkg:npm/%40opentelemetry/propagator-jaeger

    Affected ranges

    Type: SEMVER

    Events:

    Introduced- 0
    Fixed -2.9.0

    Affected versions

    Common Vulnerability Scoring System

    Attack Vector
    Network
    Adjacent
    Local
    Physical
    Privileges Required
    None
    Low
    High
    User Interaction
    None
    Required
    Scope
    Unchanged
    Changed
    Confidentiality
    None
    Low
    High
    Integrity
    None
    Low
    High
    Availability
    None
    Low
    High
    GHSA-45rx-2jwx-cxfr | CVE-DB