Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify app running dd-trace-py with IAST enabled
-
DeliverySubmit input containing lone surrogate character
-
Exploit%-format operation invokes IAST modulo aspect
-
ExecutionUnhandled encoding error aborts Python process
-
ImpactService denial / interrupted work
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Exception handling completeness
|
| Exploitation Conditions | Three concrete conditions must all hold: (1) IAST must be explicitly enabled via DD_IAST_ENABLED=true - it is OFF by default, which is the single biggest limiting factor; (2) the monitored application code must apply an old-style %-string-formatting operation (e.g. 'template %s' % value) to attacker-controlled input - f-strings and str.format are not affected; (3) the attacker-supplied input must contain a value that the taint-tracking modulo aspect cannot process, specifically a lone UTF-16 surrogate character (e.g. \ud800) that fails native UTF-8 conversion. Affected builds are dd-trace-py 3.13.0 through 4.15.4 on Python applications. The attack needs no authentication or user interaction at the dd-trace layer (PR:N/UI:N), but the combination of a non-default security feature plus a specific vulnerable code pattern substantially limits realistic exposure. |
| Impact | The headline CVSS 4.0 base score of 8.2 (High) is driven entirely by availability impact (VA:H), with no confidentiality or integrity impact (VC:N/VI:N) - this is a pure denial-of-service, consistent with CWE-248 (uncaught exception). The vector shows AV:N/PR:N/UI:N (network-reachable, no authentication or user interaction at the dd-trace layer), which inflates the score, but AT:P signals a present attack requirement and the real-world exposure is heavily gated by two preconditions stated in the vendor advisory: IAST must be explicitly enabled (DD_IAST_ENABLED=true, which is NOT the default) and the monitored application must pass attacker-controlled input through an old-style %-formatting operation. The supporting signals point to modest real-world risk: EPSS is 0.33% (26th percentile), there is no CISA KEV listing, and the vuln.today Decision label is 'this_week' rather than act_now/emergency. This is therefore a genuine but non-emergency priority - a high-CVSS DoS whose practical reach is narrowed by a non-default configuration and a specific code pattern. The EPSS/KEV signals (low probability, no confirmed active exploitation) are consistent with each other and with the gated exploitation conditions; nothing here indicates widespread opportunistic exploitation. Note the input CVSS is 4.0 only - no CVSS 3.1 vector was supplied - and the 'Information Disclosure' tag contradicts the availability-only impact (see data_quality_flags). |
| Exploit ScenarioDerived | An attacker sends input containing a lone UTF-16 surrogate character (e.g. \ud800) to an application running a vulnerable dd-trace-py (3.13.0-4.15.4) with IAST enabled, where that input is rendered through an old-style '... %s' % value formatting operation. The IAST modulo taint-tracking aspect cannot UTF-8-encode the lone surrogate, raises an unhandled native error, and aborts the Python process, dropping in-flight work. No weaponized public exploit is published; the fix PR (#20786) includes a regression test that demonstrates the exact triggering input, but the advisory deliberately omits detailed reproduction steps. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
Denial of service in the Datadog dd-trace-py Python APM client, versions 3.13.0 through 4.15.4, where the IAST instrumentation for old-style % string formatting fails to contain an internal error and can terminate the entire Python process, interrupting whatever work it was handling. Three conditions must all hold for exploitation: IAST must be explicitly enabled (DD_IAST_ENABLED=true, which is not the default), the monitored application must apply a %-formatting operation to attacker-controlled input, and that input must contain a value the taint-tracking modulo aspect cannot process - the vendor release note specifically identifies a lone UTF-16 surrogate character that fails native UTF-8 conversion. This is a pure availability issue with no confidentiality or integrity impact; the advisory withholds reproduction steps, and no public exploit or active exploitation has been identified at time of analysis (EPSS 0.33%, not in CISA KEV).
RemediationAI
Upgrade the ddtrace package to 4.15.5, the vendor-released fix (release tag https://github.com/DataDog/dd-trace-py/releases/tag/v4.15.5; fixes landed in PR https://github.com/DataDog/dd-trace-py/pull/20786 with follow-up https://github.com/DataDog/dd-trace-py/pull/20823, commits 69dc19853247434ceab83e0c1c4e279a2eb2a3f7 and ace972489b57dd020ff52b706bb548a354f2dd69). If upgrading cannot be scheduled immediately, the vendor documents two workarounds: disable IAST by setting DD_IAST_ENABLED=false - which removes the crash path but also eliminates all IAST vulnerability detection for that service - or rewrite % string interpolations that consume user input to use str.format or f-strings, which are not instrumented by the affected aspect but require touching application code and auditing every affected formatting site. Full details are in the GHSA advisory at https://github.com/DataDog/dd-trace-py/security/advisories/GHSA-p3m5-h5v9-vqj6.
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
dd-trace-py is Datadog's Python APM and application security client, and its IAST (Interactive Application Security Testing) engine implements taint tracking in a native C++ extension (ddtrace/appsec/_iast/_taint_tracking). The affected code is the 'modulo aspect' (aspect_modulo.cpp, api_modulo_aspect), which intercepts the Python % operator to propagate taint ranges through string interpolation: it collects the tainted-object map for the candidate text and its parameters, computes text ranges, converts the candidate text to a native std::string, re-applies the modulo operation, and converts the escaped result back into tainted text. Because a lone surrogate such as \ud800 cannot be encoded to UTF-8, that native string conversion throws inside the aspect; before the fix this exception was not caught, so the error propagated out and aborted the Python process - the CWE-248 (uncaught exception) root cause. The patch in PR #20786 wraps the whole aspect body in the TRY_CATCH_ASPECT("modulo_aspect", return return_candidate_result(), ...) guard so a conversion failure falls back to returning the plain (untainted-annotation) result instead of terminating the interpreter, and adds regression coverage (test_modulo_with_tainted_lone_surrogate_parameter) alongside the release note fix-iast-modulo-surrogate-abort. Only the % operator path is instrumented this way; f-strings and str.format are not affected, and the flaw is reachable only when IAST is enabled and the tainted value actually flows into that formatting operation.
Know when 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
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Pure DoS from a process abort, so A:H with C:N/I:N; attacker-controlled network input triggers it deterministically (AC:L, PR:N, UI:N), though exposure is gated by non-default IAST config.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Datadog dd-trace-py is the Datadog Python APM client. From 3.13.0 until 4.15.5, the IAST string-processing instrumentation does not properly handle certain internal errors while old-style % string formatting processes attacker-controlled input. An unhandled error can terminate the Python process and interrupt the work it is handling. Exploitation requires IAST to be enabled, which is not the default, and application code to apply the affected formatting operation to attacker-controlled input. This issue is fixed in version 4.15.5.
Executive ViewAI
Datadog's Python APM client (dd-trace-py) versions 3.13.0 through 4.15.4, when IAST is explicitly enabled, can be crashed by attacker-controlled input containing lone UTF-16 surrogates, causing process termination. This affects only services that have opted into IAST and perform %-formatting on untrusted data, potentially disrupting application availability. Leadership should prioritize patch validation and configuration review to prevent availability incidents in affected services.
Apply vendor patch.
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.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
EUVD-2026-110470
GHSA-p3m5-h5v9-vqj6
NVD
CVE.org
EPSS
Exploit-DB