CVE-2026-105659: HTTP/2 blocked-send deadlines reset on every WINDOW_UPDATE, letting a trickle pin stream processes indefinitely in Bandit

Published Oct 14, 2026
·
Updated

Uncontrolled Resource Consumption vulnerability in mtrudel bandit allows an unauthenticated remote attacker to pin HTTP/2 stream processes indefinitely via a trickle of small WINDOWUPDATE 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.finishdata/5 re-queues a partially advanced send in pendingsends with a fresh expiresat, so every WINDOWUPDATE on stream 0, and every SETTINGS frame, resets the clock. Bandit.HTTP2.Stream.senddata/3 recurses on each stream WINDOWUPDATE and re-arms a fresh after readtimeout. 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 WINDOWUPDATE on stream 0 and shrinking the per-stream window with a small SETTINGSINITIALWINDOWSIZE, so closing only the connection-level path leaves it exploitable.

This issue affects bandit: from 1.4.0 onward.

Affected Software

1 affected component
hex/bandit>=1.4.0

Event History

Oct 14, 2026
CVE Published
via MITRE·04:54 PM
Data Sourced
via MITRE·04:54 PM
DescriptionWeakness

Frequently Asked Questions

1

Who can exploit this issue?

An unauthenticated remote peer that can establish an HTTP/2 connection to a Bandit server can exploit it. The attacker can repeat the behavior across streams and connections to consume server processes and memory.

2

What conditions are required to keep a server-side stream alive?

The server must be sending a response that outruns either the connection-level or stream-level send window, causing the send to block. The peer can then grant only a few bytes of window capacity every few seconds, making partial progress while repeatedly restarting the blocked-send deadline.

3

Are the connection-level and stream-level cases separate?

Yes. The two blocking paths are independent: connection-level blocking can be prolonged through WINDOW_UPDATE frames on stream 0 or SETTINGS frames, while stream-level blocking can be reached by widening the connection window and constraining the per-stream window with SETTINGS_INITIAL_WINDOW_SIZE.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203