Patch Forecast
Yellow warning
Plan into this sprint.

GHSA-vpp8-g58w-m8mp

Twisted: Unauthenticated Remote Denial of Service in the Twisted HTTP/2 Server via Rapid Stream Reset

Risk score
55/100
CVSS
7.5 v3.1
Published
29 Oct 2026

Open in the live forecast Today's forecast

What to know

What it is
An uncontrolled-resource-consumption vulnerability (CWE-400) in the Twisted HTTP/2 server lets any unauthenticated remote client exhaust server CPU over a single connection. A client that sends a request header block with END_STREAM and then immediately resets the stream makes the server route and render the request b…
Affected
Twisted (pip) <= 26.4.0
Fix
Upgrade Twisted to 26.10.0rc1 or later.
Exploitation
No known exploitation

Story map

Story map: TwistedTHE FLAWSTHE FIXGHSA-vpp8-g58w-m8mpUnauthenticated Remote Denialof Service in the TwistedHTTP/2 Server via Rapid…CVSS 7.5CVE-2026-115775Unauthenticated Remote Denialof Service in the Twistedwords domish XML Element…CVSS 8.7 · EPSS 0%CVE-2026-115778Unauthenticated Remote Denialof Service in the Twisted conchTelnet Transport via an…CVSS 7.5 · EPSS 1%CVE-2026-115776Unauthenticated Remote Denialof Service in the Twisted IRCServer via an Unbounded Line…CVSS 7.5 · EPSS 1%Upgrade Twisted26.10.0or later on your release lineWho is exposed{'products': ['Twisted'],'packages': ['Twisted'],'versions': ['<= 26.4.0']}AMBER · PATCH THIS WEEKTwistedTwisted has a vulnerability in itsXML parser that allows anunauthenticated remote peer tocause a denial of service bycontinuously adding childelements to an in-memory tree,exhausting server memory and…Where it standsNo known exploitationCONNECTS TOSame weaknessDenial of service (CWE-400)299 other warnings in 30 days →
Story map: the flaws, the fix, how it unfolded and what it connects to. Boxes link to the record or article.

At a glance

Twisted: Amber, patch this week. Twisted has a vulnerability in its XML parser that allows an unauthenticated remote peer to cause a denial of service by continuously adding child elements to an in-memory tree, exhausting server memory and terminating the process.

The flaws

  • GHSA-vpp8-g58w-m8mp: Unauthenticated Remote Denial of Service in the Twisted HTTP/2 Server via Rapid Stream Reset (CVSS 7.5)
  • CVE-2026-115775: Unauthenticated Remote Denial of Service in the Twisted words domish XML Element Stream via an Unbounded Element Tree (CVSS 8.7 · EPSS 0%)
  • CVE-2026-115778: Unauthenticated Remote Denial of Service in the Twisted conch Telnet Transport via an Unbounded Subnegotiation Buffer (CVSS 7.5 · EPSS 1%)
  • CVE-2026-115776: Unauthenticated Remote Denial of Service in the Twisted IRC Server via an Unbounded Line Buffer (CVSS 7.5 · EPSS 1%)

The fix

Upgrade Twisted: 26.10.0 or later on your release line

Who is exposed: {'products': ['Twisted'], 'packages': ['Twisted'], 'versions': ['<= 26.4.0']}

Where it stands

  • No known exploitation

Connects to

Why it is Yellow

  • CVSS 7.5 high
  • Remotely exploitable without logging in
  • On your watchlist: PyPI

Affected packages

PackageEcosystemVulnerableFixed in
Twistedpip<= 26.4.026.10.0rc1

References

Original description

## Summary An uncontrolled-resource-consumption vulnerability (CWE-400) in the Twisted HTTP/2 server lets any unauthenticated remote client exhaust server CPU over a single connection. A client that sends a request header block with `END_STREAM` and then immediately resets the stream makes the server route and render the request before it processes the reset. Reset streams are freed and never count against the concurrent-stream limit, and no reset-rate limiter exists, so the pattern can be repeated at line rate on one connection. This is the HTTP/2 Rapid Reset class, CVE-2023-44487. ## Details For one received segment the h2 events are processed in order in `H2Connection.dataReceived`. A `HEADERS(END_STREAM)` followed by `RST_STREAM` yields `RequestReceived`, `StreamEnded`, then `StreamReset`, so the request is dispatched and rendered on stream end before the reset is handled: ```python # src/twisted/web/_http2.py (H2Connection.dataReceived) for event in events: if isinstance(event, h2.events.RequestReceived): self._requestReceived(event) # allocate the request elif isinstance(event, h2.events.StreamEnded): self._requestEnded(event) # -> requestComplete -> render() synchronously elif isinstance(event, h2.events.StreamReset): self._requestAborted(event) # processed last, frees the stream ``` `_requestAborted` frees the reset stream, so it never occupies the 100-stream concurrency budget, and nothing in `_http2.py` counts or throttles opened-and-reset streams. The 2019 flood fix (GHSA-32gv) bounds outbound control-frame buffering only and does not apply to this path. Affected product: Twisted, `twisted.web` HTTP/2 server Affected versions: confirmed against 26.4.0 ## PoC On any Twisted HTTP/2 endpoint, open one connection and, in a tight loop, send a `HEADERS` frame with `END_STREAM` on a fresh stream identifier immediately followed by a `RST_STREAM` for that stream, at line rate. No credentials are required. The server renders each request on stream end before the reset frees the stream, and a freed stream never counts toward the concurrent-stream limit, so the loop is never throttled. Because every cancelled stream is still dispatched in full and reset streams do not accumulate, the connection is never throttled or closed, so the forced work grows with the number of pairs sent. Sustained on one connection this saturates a CPU core under only a trickle of traffic, whereas a client that instead leaves its streams open is closed once it reaches the concurrent-stream limit. ## Impact This is an unauthenticated remote denial of service (CWE-400, CWE-770) by CPU exhaustion. One connection forces unbounded request rendering at a few frames per cancelled request, bypassing the concurrent-stream limit. It is the HTTP/2 Rapid Reset class (CVE-2023-44487), not covered by the earlier Twisted flood fix, with no confidentiality or integrity impact and no code execution.

Last activity 29 Oct 2026. Patch Forecast updates every hour.