Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend crafted request with bare LF in header value
-
DeliveryFront-end frames single allowed POST /public
-
ExploitTwisted frames hidden smuggled GET /admin
-
ExecutionSmuggled request bypasses front-end access controls
-
ImpactPoisoned shared connection/cache returns attacker response to later victim
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V4 - API and Web Service HTTP request consistency
|
| Exploitation Conditions | Exploitation is realized ONLY when Twisted (twisted.web.http.HTTPChannel, versions <= 26.4.0) is deployed behind a front-end proxy/load balancer that accepts a bare carriage return or bare line feed as an HTTP header-line terminator; the framing disagreement between that lenient front-end and Twisted's strict CRLF-only splitting is the core prerequisite. No authentication is required (PR:N) and no user interaction is needed (UI:N), and it works against default Twisted configurations. The key LIMITING factor is the proxy dependency: Twisted is the strict endpoint that frames the smuggled request with an empty body, so if Twisted terminates connections directly, or the front-end also rejects bare CR/LF per RFC 9110 section 5.5, the smuggling cannot occur. There is no code execution in any configuration. |
| Impact | This is a genuine but conditional, medium-severity issue rather than a top-priority emergency. The CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N = 5.4) is internally coherent with the mechanism: network reachable and unauthenticated (PR:N), but AC:H because exploitation is not self-contained - it depends on a front-end proxy that treats a bare CR or LF as a line terminator while Twisted does not, a precondition outside the attacker's control. The scope change (S:C) and C:L/I:L reflect that the real damage lands on other parties (front-end access controls, shared connection, cache, and a later victim client), not on the Twisted process itself, and there is no availability impact and no code execution. The input does not provide an EPSS score, and the vulnerability is NOT on the CISA KEV list, so there is no evidence of active exploitation. A concrete PoC (exact smuggling byte sequence) is published in the GHSA advisory, but the input does not mark it as confirmed working packaged exploit code. The vuln.today Decision label is 'this_month', which aligns with a real-but-not-urgent remediation posture: patch within normal cycles, prioritized where Twisted sits behind a lenient reverse proxy. No signals conflict here; the main caveat is that risk is entirely contingent on the front-end's parsing behavior, so environments terminating Twisted directly or behind a strict RFC 9110 proxy face substantially lower practical risk. |
| Exploit ScenarioDerived | An unauthenticated attacker sends a single crafted HTTP request to a Twisted-backed service sitting behind a reverse proxy, embedding a bare LF plus a hidden Content-Length inside a header value (e.g. 'Foo: x\nContent-Length: 44'). The lenient front-end frames one request and forwards access-controlled traffic, while Twisted frames a second smuggled request (e.g. GET /admin) and serves it, poisoning the shared connection or cache so a later victim receives the attacker-induced response. A public PoC reference with the exact request bytes exists in the GHSA advisory; it is not verified as packaged working exploit code, and AC:H reflects the required cooperating front-end. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 23, 2026
HTTP request smuggling in Twisted's twisted.web server (twisted.web.http.HTTPChannel, versions 26.4.0 and earlier) lets remote attackers fold a hidden Content-Length header into an ordinary header value using a bare carriage return or bare line feed, because the parser rejects NUL bytes but not the other two control characters RFC 9110 section 5.5 requires it to reject. The impact is realized only when Twisted sits behind a front-end proxy or load balancer that treats a bare CR or LF as a line terminator: the front end frames one request, Twisted frames another, and the attacker can slip a request past front-end access controls, poison a shared connection so a later client receives the wrong response, or poison a cache. No authentication (PR:N) and no user interaction (UI:N) are required, but attack complexity is high (AC:H) because of the proxy dependency, no code execution results in any configuration, there is no KEV listing or confirmed active exploitation, and the GitHub advisory includes a PoC request sequence that has not been independently verified as working exploit code.
RemediationAI
Upgrade to Twisted 26.10.0rc1 or later, which is the version that ships the corrected headerReceived validation; note that this identifier is a release candidate, so teams that only run final releases should track the first stable release after 26.10.0rc1 and, until then, treat the fix as an upstream commit (PR https://github.com/twisted/twisted/pull/12755, commits 022b6f7feb5980166c71f54e2c0d8f4f21ff6e1a and 1616f702d36eda8990a5a5b22ad70fab140a7eb1 per advisory GHSA-q7qq-6mhp-9rc4) rather than a tagged stable version. If upgrading immediately is not possible, the compensating control is to close the framing disagreement at the front end: configure the reverse proxy or load balancer to reject any request whose header values contain a bare CR or bare LF (returning 400 rather than normalising or forwarding it), which removes the lenient parser that Twisted's strict framing is being compared against; the trade-off is that some proxies normalise these bytes before policy is applied, so the setting must be verified empirically with the advisory's PoC byte sequence. An alternative is to remove the mismatch entirely by having Twisted terminate client connections directly with no intervening bare-CR/LF-tolerant front end, at the cost of losing the proxy's TLS termination, caching and access-control layer. There is no code execution in any configuration, so the residual risk of deferring the upgrade is confined to smuggling, access-control bypass and cache or connection poisoning through a lenient proxy.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is an incomplete-fix residual (CWE-444, inconsistent request interpretation CWE-436) in Twisted's HTTP/1.1 channel parser. HTTPChannel.headerReceived splits a header line on the first colon, strips spaces and tabs from the value, and then applies a single validation test that rejects only b"\x00". Because the channel's line delimiter is CRLF, a header such as Foo: x\nContent-Length: 39 arrives as a single line: the split yields name Foo and value x\nContent-Length: 39, strip leaves the bare LF in place, and the NUL check passes. _maybeChooseTransferDecoder is then invoked with the name Foo, never observes a Content-Length, and installs no body decoder, so Twisted frames the request with an empty body. Header names and the request line already reject CR and LF, leaving the header value as the only gap; the NUL check added by earlier Twisted request-smuggling protections covered only the NUL sibling of this same check. The upstream fix (PR #12755, commits 022b6f7feb5980166c71f54e2c0d8f4f21ff6e1a and 1616f702d36eda8990a5a5b22ad70fab140a7eb1) replaces the NUL-only test with len(data.translate(None, b"\x00\r\n")) != len(data) so NUL, CR and LF are all rejected, and rewrites the regression test as test_invalidHeaderValueControlChars with bare-LF cases fed directly into dataReceived because the test harness normalises bare LF to CRLF. The CPE range cpe:2.3:a:twisted:twisted:*:*:*:*:*:*:*:* and the pip package metadata (Twisted <= 26.4.0 vulnerable, fixed in 26.10.0rc1) define the exposure surface.
Know when Twisted 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:H/PR:N/UI:N/S:C/C:L/I:L/A:N
Remote and unauthenticated (AV:N/PR:N), but AC:H because it requires a cooperating lenient front-end; smuggling crosses to other clients/cache (S:C) with limited C/I and no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.web.http.HTTPChannel.headerReceived rejects a NUL byte in an HTTP header value but accepts a bare carriage return or bare line feed. Because Twisted splits header lines only on CRLF, a hidden Content-Length header can remain folded into another value while a lenient front end treats the bare character as a line terminator. The resulting framing disagreement can smuggle a following request past front-end access controls, poison a shared connection or cache, and expose a later client to the wrong response. This issue is an incomplete-fix residual of earlier Twisted request-smuggling protections. This issue is fixed in version 26.10.0rc1.
Blast Radius
ecosystem impact- 5 pypi packages depend on twisted (5 direct, 0 indirect)
Ecosystem-wide dependent count for version 26.10.0rc1.
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
HTTP request smuggling exploits inconsistencies in how front-end and back-end servers parse HTTP message boundaries.
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
In Twisted Web through 19.10.0, there was an HTTP request splitting vulnerability. Rated critical severity (CVSS 9.8), t
In Twisted Web through 19.10.0, there was an HTTP request splitting vulnerability. Rated critical severity (CVSS 9.8), t
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated high severity (CVSS 7.5), t
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated medium severity (CVSS 6.1),
In Twisted before 19.2.1, twisted.web did not validate or sanitize URIs or HTTP methods, allowing an attacker to inject
Twisted is an event-based framework for internet applications. Rated medium severity (CVSS 5.4), this vulnerability is r
Twisted is an event-based framework for internet applications. Rated medium severity (CVSS 5.3), this vulnerability is r
Unauthenticated memory exhaustion in Twisted's twisted.words.xish.domish XML element stream allows a remote peer to keep
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated high severity (CVSS 8.1), t
Unauthenticated remote memory exhaustion in Twisted's conch telnet transport lets any peer that can reach an exposed tel
Unauthenticated remote memory exhaustion in Twisted's IRC server (twisted.words) lets a single TCP connection that never
In words.protocols.jabber.xmlstream in Twisted through 19.2.1, XMPP support did not verify certificates when used with T
EUVD-2026-109153
GHSA-q7qq-6mhp-9rc4
NVD
CVE.org
EPSS
Exploit-DB