Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend request with oversized tracestate header
-
DeliveryPass permissive HTTP header-size limit
-
ExploitTrigger quadratic regex backtracking in TraceState.from_header
-
ExecutionOccupy worker / block asyncio event loop
-
ImpactDeny service to concurrent requests
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource consumption limits
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires a service using the default W3C Trace Context propagator (OTEL_PROPAGATORS defaults to tracecontext,baggage) with server instrumentation that calls propagate.extract(), such as opentelemetry-instrumentation-asgi, running opentelemetry-api <= 1.45.0. The decisive limiting factor is the fronting HTTP server/parser's header-size handling: the attack only lands where headers larger than roughly 16-30 KB are accepted. Per the advisory's testing, gunicorn rejects headers >= 8190 bytes (431) and uvicorn --http h11 rejects above 16 KiB (400), both of which neutralize the attack, whereas waitress (up to ~256 KiB) and the default uvicorn[standard] httptools parser (accepted 300 KB to 20 MB) let it through. Impact is worst on asyncio servers, where blocking the event loop stalls all concurrent connections. No authentication or user interaction is required. |
| Impact | This is a genuine but moderate-priority availability issue, not a false-positive high-CVSS artifact - the signals are internally consistent. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L, 5.3 Medium) correctly reflects a remote, unauthenticated, low-complexity flaw with availability-only impact and no confidentiality or integrity effect; the advisory explicitly states it does not expose or modify telemetry and does not allow code execution, so the 'RCE' input tag is contradicted by the primary evidence. The vuln.today decision label is 'this_month' (not act_now/emergency), aligning with a Medium severity rather than drop-everything urgency. No CISA KEV listing and no EPSS score were supplied, so there is no evidence of active exploitation - exploitation status is 'no public exploit identified' in KEV terms, but a complete, measured proof-of-concept IS included in the GHSA advisory, so the issue is fully reproducible. One nuance worth flagging: the CVSS base score uses A:L (partial availability), yet the advisory shows a single ~100 KB request can stall an entire asyncio event loop for 6-12 seconds and that repeating it keeps the service unavailable, which operationally trends toward higher availability impact than A:L implies - verify against your own deployment's concurrency model. Real-world risk is materially gated by HTTP-layer header-size limits (see exploitation_conditions), which prevents this from being a universally trivial DoS despite PR:N/AC:L. |
| Exploit ScenarioDerived | An unauthenticated attacker sends a single HTTP request carrying a valid traceparent and a malicious tracestate header consisting of a valid member followed by a long run (~100 KB) of spaces or tabs with no trailing comma. A server using the default W3C Trace Context propagator parses it via TraceContextTextMapPropagator.extract, triggering O(N²) regex backtracking that consumes 6-12 seconds of CPU on one request and, under an asyncio server such as uvicorn with httptools, blocks every other connection for that duration. A functional proof-of-concept demonstrating both the quadratic cost and the server stall is published in the GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Denial of service in OpenTelemetry Python (opentelemetry-api through 1.45.0) lets a single unauthenticated request carrying an oversized W3C tracestate header burn roughly 6-12 seconds of CPU, and on asyncio servers stall every other connection on the event loop for that duration. The flaw is a quadratic-time regex split in TraceState.from_header that is reached automatically through the default tracecontext propagator, so any service instrumented with something like opentelemetry-instrumentation-asgi is affected without special configuration; exploitation is gated by the fronting HTTP parser's header-size limit, with gunicorn and uvicorn's h11 parser rejecting the header while waitress and uvicorn's default httptools parser accept it. A working proof-of-concept with measured timings is included in the upstream advisory (public PoC reference), but no confirmed active exploitation (CISA KEV) is indicated in the supplied intelligence, and the assessed CVSS of 5.3 reflects availability-only impact (C:N/I:N/A:L).
RemediationAI
Vendor-released patch: upgrade opentelemetry-api to 1.45.1 (release notes at https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.45.1, fix in PR https://github.com/open-telemetry/opentelemetry-python/pull/5749 and commit d5224bf4ffdf2aee1b592ad238dcc32ca957f26b), which replaces the quadratic regex split with a linear split-and-strip, removes the delimiter pattern, and discards tracestate headers whose combined length exceeds 8192 characters while preserving traceparent extraction. Because the fix discards rather than parses oversized tracestate values, deployments that legitimately forward unusually large tracestate lists will lose that vendor state after upgrading - acceptable given the W3C list limit of 512 characters. Where upgrading is delayed, the effective compensating control is a hard header-size limit in front of the Python worker: front with gunicorn, whose 8190-byte cap returns 431, or run uvicorn with --http h11, which rejects headers above 16 KiB with 400, both of which prevent the malformed header from ever reaching from_header. Do not rely on the default uvicorn[standard] httptools parser, which accepted headers up to 20 MB in the advisory's tests, and review any waitress deployment (accepts up to ~256 KiB) or gateway/custom carrier that passes large headers through; tighten those limits at the proxy layer, with the trade-off that unrelated legitimate headers such as large cookies or authorization tokens must fit under the new cap. The advisory also notes that under a synchronous worker the cost is one busy worker, while under asyncio the whole event loop is blocked, so process-per-request WSGI deployments degrade more gracefully than asyncio ones during the pre-patch window.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in pypi, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
W3C Trace Context defines two propagation headers: traceparent, which carries the trace/span IDs, and tracestate, a comma-separated list of vendor key/value pairs that a service should forward unchanged. In opentelemetry-api, TraceContextTextMapPropagator.extract() reads the inbound tracestate header from the carrier and passes it to TraceState.from_header() in opentelemetry/trace/span.py, which split the string with the compiled pattern r"[ \t]*,[ \t]*". That pattern begins with an unbounded optional-whitespace run; at every offset inside a long run of spaces or tabs the engine consumes the remainder of the run, fails to find a comma, backtracks, and advances one character, producing O(N²) work (CWE-400 resource consumption, classified upstream also as CWE-1333 inefficient regular-expression complexity). The 32-member tracestate key cap is only enforced later in TraceState.__init__, after the split has already completed, and there is no pre-parse length check - unlike the sibling baggage propagator, which rejects headers above its _MAX_HEADER_LENGTH of 8192 bytes before any regex runs. The advisory reports the cost quadrupling each time the input doubles (about 0.06 s at 10,000 characters, 1 s at 40,000, 4 s at 80,000, 9 s at 100,000, with tab characters roughly 1.6× slower), and the trigger is entirely attacker-controlled header content rather than a timing or race condition. The same pattern is present from v1.0.0 (introduced in March 2021) through v1.45.0; the fix replaces the regex split with plain str.split(",") plus strip(" \t") and adds an 8192-character combined-length guard that discards the tracestate while still honoring traceparent.
Know when Opentelemetry Python gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Remote unauthenticated single request with no interaction (AV:N/AC:L/PR:N/UI:N); availability-only, partial per-request impact gated by server header limits, so A:L and C/I:N.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
OpenTelemetry Python provides the Python API and SDK for OpenTelemetry. Prior to 1.45.1, the opentelemetry-api function TraceState.from_header in opentelemetry/trace/span.py, reached through TraceContextTextMapPropagator.extract, parses inbound W3C tracestate headers with an unbounded optional-whitespace regular expression. A malformed header containing a long run of spaces or tabs without a following comma causes quadratic backtracking before the member-count limit is applied. Services using the default W3C Trace Context propagator can therefore spend excessive CPU time on one unauthenticated request when the HTTP server, parser, gateway, or custom carrier accepts a sufficiently large header. The processing can occupy a synchronous worker or delay unrelated requests on the same asynchronous event loop. The impact is limited to availability and does not expose or modify telemetry data or allow code execution. This issue is fixed in version 1.45.1.
Blast Radius
ecosystem impact- 62,839 pypi packages depend on opentelemetry-api (2,255 direct, 60,900 indirect)
Ecosystem-wide dependent count for version 1.45.1.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
EUVD-2026-108216
GHSA-xcq7-p3pf-p88h
NVD
CVE.org
EPSS
VulDB
Exploit-DB