Skip to main content

Twisted EUVDEUVD-2026-109153

| CVE-2026-115877 MEDIUM
HTTP Request/Response Smuggling (CWE-444)
2026-10-23 GitHub_M GHSA-q7qq-6mhp-9rc4
5.4
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Send crafted request with bare LF in header value
  2. Delivery
    Front-end frames single allowed POST /public
  3. Exploit
    Twisted frames hidden smuggled GET /admin
  4. Execution
    Smuggled request bypasses front-end access controls
  5. Impact
    Poisoned 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

twisted < 26.10.0rc1

Affected Packages

pypi twisted fix: 26.10.0rc1

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

Vendor (GitHub_M) PRIMARY 5.4 MEDIUM
AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N
vuln.today AI 5.4 MEDIUM

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.

3.1 AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
Red Hat 5.4 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Oct 23, 2026 - 21:18 EUVD

DescriptionCVE.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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 5 pypi packages depend on twisted (5 direct, 0 indirect)

Ecosystem-wide dependent count for version 26.10.0rc1.

Threat Intelligence Overview

EPSS Score
0.3%
Top 76% exploitable
Prevalence
Medium
popular Python networking framework; twisted.web HTTP server less universally deployed
Threat Intel
1
1 source
Social Media
2
Sightings
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

27
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +27
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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.

CVE-2020-10109 CRITICAL POC
9.8 Mar 12

In Twisted Web through 19.10.0, there was an HTTP request splitting vulnerability. Rated critical severity (CVSS 9.8), t

CVE-2020-10108 CRITICAL POC
9.8 Mar 12

In Twisted Web through 19.10.0, there was an HTTP request splitting vulnerability. Rated critical severity (CVSS 9.8), t

CVE-2022-21716 HIGH POC
7.5 Mar 03

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated high severity (CVSS 7.5), t

CVE-2024-41810 MEDIUM POC
6.1 Jul 29

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated medium severity (CVSS 6.1),

CVE-2019-12387 MEDIUM POC
6.1 Jun 10

In Twisted before 19.2.1, twisted.web did not validate or sanitize URIs or HTTP methods, allowing an attacker to inject

CVE-2022-39348 MEDIUM POC
5.4 Oct 26

Twisted is an event-based framework for internet applications. Rated medium severity (CVSS 5.4), this vulnerability is r

CVE-2023-46137 MEDIUM POC
5.3 Oct 25

Twisted is an event-based framework for internet applications. Rated medium severity (CVSS 5.3), this vulnerability is r

CVE-2026-115775 HIGH
8.7 Oct 23

Unauthenticated memory exhaustion in Twisted's twisted.words.xish.domish XML element stream allows a remote peer to keep

CVE-2022-24801 HIGH
8.1 Apr 04

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated high severity (CVSS 8.1), t

CVE-2026-115778 HIGH
7.5 Oct 23

Unauthenticated remote memory exhaustion in Twisted's conch telnet transport lets any peer that can reach an exposed tel

CVE-2026-115776 HIGH
7.5 Oct 23

Unauthenticated remote memory exhaustion in Twisted's IRC server (twisted.words) lets a single TCP connection that never

CVE-2019-12855 HIGH
7.4 Jun 16

In words.protocols.jabber.xmlstream in Twisted through 19.2.1, XMPP support did not verify certificates when used with T

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy