Summary
CVE-2026-74836 is a Denial of Service vulnerability in Bandit, the pure Elixir HTTP server for Plug and WebSock applications. An unauthenticated remote attacker can exhaust the HTTP/2 connection-level flow-control window and withhold WINDOW_UPDATE frames, causing server-side stream processes to block indefinitely and pinning resources that are never released — even when the client sends RST_STREAM. The issue is rated HIGH severity due to its unauthenticated, network-reachable, low-complexity availability impact.
Technical details
- Root cause: When a response body exceeds the connection-level send window (default 65,535 bytes), Bandit’s
Stream.send_data/3blocks with an:infinitytimeout and queues the remaining bytes inConnection.pending_sends. This queue is only drained by aWINDOW_UPDATEorSETTINGSframe from the client — there is no timeout on this path (unlike the stream-level window, which is bounded at 15 seconds). - Trigger conditions: An attacker requests a large response body, grants stream-level window updates (so the connection-level window becomes the limiting factor), reads until the 65,535-byte default connection window is exhausted, and then never sends a connection-level
WINDOW_UPDATE. - Attack vector: Network-based, unauthenticated, and low complexity (CVSS AV:N/AC:L/PR:N/UI:N). No special privileges or user interaction are required.
- Bypass of client cleanup signal: A client
RST_STREAMis delivered as a message to the blocked stream process’ mailbox, but that process cannot read it while blocked inside the synchronous call — so the stream cannot be torn down by the client either. - Keepalive abuse: Periodic
PINGframes keep the underlying transport connection alive without touching the send queue, defeating transport-level read timeouts and allowing the stall to persist indefinitely. - Impact: Resource (process/memory/connection) exhaustion on the server, leading to denial of service for legitimate clients. No confidentiality or integrity impact is reported.
Affected software
- Bandit (Elixir HTTP server,
mtrudel/bandit, Hex packagebandit) - Versions from 0.3.4 up to (but not including) 1.12.5
Severity
- CVSS Score: 8.7 (High) — CVSS v4.0:
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N - A related CVSS v3.1 assessment scores this issue 7.5 (High):
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Impact is limited to availability; there is no confidentiality or integrity compromise.
Mitigation and recommended actions
- Immediate: Upgrade Bandit to version 1.12.5 or later, which bounds and cancels HTTP/2 sends blocked on the connection window:
RST_STREAMnow immediately releases pending sends, queued sends carry a 15-second expiration deadline that is swept on inbound reads, and stream termination purges any remaining pending sends. - If immediate patching is not possible:
- Reduce
max_concurrent_streamson the Bandit HTTP/2 configuration to limit the per-connection cost of the issue (this does not fully prevent the attack, only limits its blast radius per connection). - Enforce connection-count limits and appropriately size upstream connection pools/load balancers to reduce exposure to sustained resource pinning.
- Monitor for connections with unusually long-lived streams combined with sparse or absent connection-level
WINDOW_UPDATEframes and periodicPING-only keepalive traffic, and terminate such connections proactively at the reverse proxy or load balancer layer.
- Reduce

