CVE-2026-74836: HTTP/2 connection-window starvation pins Plug processes indefinitely in Bandit

Published Aug 20, 2026
·
Updated

Allocation of Resources Without Limits or Throttling vulnerability in mtrudel bandit allows an unauthenticated remote attacker to pin an unbounded number of HTTP/2 stream processes indefinitely via connection-level flow control. When a stream's response body outruns the HTTP/2 connection-level send window (default 65,535 bytes, shared across all streams on the connection), Bandit.HTTP2.Connection queues the remaining bytes and a reply closure in pendingsends and the stream process blocks forever inside a synchronous call to the connection process. Nothing bounds that wait and nothing purges the queue: a client RSTSTREAM for the blocked stream is delivered to its mailbox but never read while it is stuck inside the call, so cancelling frees nothing, and periodic PING frames keep the transport-level read timeout from ever firing. The equivalent block on the stream-level send window is already bounded at 15 seconds; the connection-level path had no such bound.

Each stalled stream pins its process, Plug state, and any resource the Plug holds across the blocked write, such as a pooled upstream connection in a reverse-proxy Plug. The attacker chooses any endpoint whose response exceeds the connection window (common for most non-trivial payloads), grants a generous stream-level window so only the connection window limits it, and keeps the connection alive with periodic PINGs; the primitive is repeatable across streams and connections at the cost of one idle socket each.

This issue affects bandit: from 0.3.4 before 1.12.5.

Affected Software

1 affected component
bandit bandit>=0.3.4<1.12.5

Event History

Aug 20, 2026
CVE Published
via MITRE·09:11 PM
Data Sourced
via MITRE·09:11 PM
DescriptionWeakness

Frequently Asked Questions

1

Does exploitation require authentication or a special endpoint?

No authentication is required. An attacker needs to use HTTP/2 and select an endpoint whose response exceeds the connection-level send window; the default shared window is 65,535 bytes.

2

Are default settings affected?

Yes. The described condition uses the default 65,535-byte HTTP/2 connection-level send window shared by all streams on a connection. The stream-level send-window path already has a 15-second bound, but the connection-level path described does not.

3

Will cancelling stalled requests or relying on connection timeouts release the resources?

No. An RST_STREAM is delivered to the blocked stream's mailbox but is not processed while the stream is stuck in the synchronous call, so cancellation does not free the pinned resources. Periodic PING frames can also keep the transport-level read timeout from firing.

4

What resources can be exhausted or retained by stalled streams?

Each stalled stream retains its Plug process, Plug state, and resources held across the blocked write. This can include pooled upstream connections when using a reverse-proxy Plug.

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