Bandit HTTP/2 send timers reset, letting trickles pin stream processes
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Attack requirements
- None
- Impact type
- Denial of service
- Confidentiality · integrity · availability
- None · None · High
- Fix status
- Fixed
Attack profile from CVSS 4.0 · CNA. Fix status from CNA. Impact type from CWE-400.
Summary
Bandit from 1.4.0 before 1.13.0 is affected. Blocked-send deadlines for HTTP/2 streams restart whenever the peer makes partial progress, so they never expire (CWE-400). An unauthenticated remote attacker can send a trickle of small WINDOW_UPDATE frames to keep stream processes, their Plug state and held resources alive indefinitely, exhausting server processes and memory.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
Description from the CNA
Uncontrolled Resource Consumption vulnerability in mtrudel bandit allows an unauthenticated remote attacker to pin HTTP/2 stream processes indefinitely via a trickle of small WINDOW_UPDATE frames. A stream whose response outruns the connection or stream send window blocks until the peer grants more window, and each block carries a 15 second deadline. Both deadlines restart whenever the peer makes partial progress. Bandit.HTTP2.Connection.finish_data/5 re-queues a partially advanced send in pending_sends with a fresh expires_at, so every WINDOW_UPDATE on stream 0, and every SETTINGS frame, resets the clock. Bandit.HTTP2.Stream.send_data/3 recurses on each stream WINDOW_UPDATE and re-arms a fresh after read_timeout. A peer that grants a few bytes every few seconds keeps the blocked stream process, its Plug state and any resource it holds mid-response alive for as long as it keeps dripping, and repeats this across streams and connections to exhaust server processes and memory. The two paths are independent. The stream-level block is reached on its own by widening the connection window with a large WINDOW_UPDATE on stream 0 and shrinking the per-stream window with a small SETTINGS_INITIAL_WINDOW_SIZE, so closing only the connection-level path leaves it exploitable. This issue affects bandit: from 1.4.0 before 1.13.0.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- Poc
- Automatable
- Yes
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
Remediation
Upgrade bandit to version 1.13.0, the fixed version.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
- Fix · CNA bandit (mtrudel) Fixed in 1.13.0
Timeline
- 2026-10-15 Threatist record created from CVE-2026-105659
- 2026-10-15 Fix available: [email protected] · CNA
- 2026-10-16 Priority changed: MEDIUM → LOW
- 2026-10-18 CISA SSVC decision points changed
- 2026-10-18 Priority changed: LOW → HIGH
References
More mtrudel vulnerabilities
- TI-2026-81989 HTTP/2 request bodies made of 1-byte DATA frames amplify memory use in Bandit CVSS 4.0HIGH 8.7
- TI-2026-52571 HTTP/2 connection-window starvation pins Plug processes indefinitely in Bandit CVSS 4.0HIGH 8.7
- TI-2026-46780 Quadratic CPU blow-up reassembling fragmented WebSocket messages in Bandit CVSS 4.0HIGH 8.7
- TI-2026-31007 WebSocket fragmented message reassembly unbounded in bandit CVSS 4.0HIGH 8.7
- TI-2026-28689 HTTP/1 chunked decoder infinite loop on requests with trailer fields in bandit CVSS 4.0HIGH 8.7
- TI-2026-28686 HTTP/1 chunked body reader ignores length cap in bandit CVSS 4.0HIGH 8.7
Sources
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences