CVE-2026-111103

HTTP/2 StreamError recovery rolls back connection state and bypasses per-connection limits in Bandit

Published Oct 26, 2026 CVSS 4.0 · 8.2 High EPSS < 1% KEV · Not listed
Description
Improper Cleanup on Thrown Exception vulnerability in the HTTP/2 handler of mtrudel bandit allows an unauthenticated remote attacker to bypass per-connection resource limits via a single TCP write that carries several frames, one of which raises a stream error.

When a frame raises StreamError partway through a chunk, Bandit.HTTP2.Handler.handle_data/3 sends RST_STREAM and continues with the connection state from before the chunk, dropping the rest of it. Streams opened by earlier frames in the chunk keep running their Plug calls, but the stream counts, last_stream_id, the rapid-reset timestamps, the HPACK decoder state and the buffer roll back, so max_concurrent_streams, max_requests and the rapid-reset limiter never see those streams. A client that sends one HEADERS frame more than max_concurrent_streams in each write has the extra refused and the others forgotten: with a limit of 10, five such writes run 50 Plug calls at once.

This issue affects bandit: from 1.9.0 before 1.14.0.

Analysis

AI-generated

Technical impact

Bandit’s HTTP/2 handler fails to correctly cleanup after a thrown exception, allowing a remote attacker to send a single TCP write containing multiple frames including one that raises a stream error. When the stream error is received, Bandit rolls back its connection state, discarding new streams while retaining previous stream counts and limits. As a result, per‑connection limits such as max_concurrent_streams, max_requests, and rapid‑reset throttling are never applied, enabling the attacker to open dozens of logical streams in a single connection and exhaust server resources.

Affected Systems

Affected are mtrudel’s Bandit HTTP/2 server in any release from version 1.9.0 through version 1.13.9. The product is widely used in Elixir web services that enable HTTP/2 support.

Risk and Exploitability

The CVSS score of 8.2 marks this as a high‑severity flaw. The EPSS score is currently unavailable, and the vulnerability is not yet listed in CISA’s KEV catalogue, but the remote exploitation path is straightforward: an unauthenticated client connecting over HTTP/2 can craft frames to trigger the bug. Because the problem stems from an internal state rollback, the attacker does not need privileged access, and can cause denial of service by bypassing per‑connection limits. The lack of authentication or additional checks makes exploitation highly likely in any system that enables HTTP/2.

Remediation

Vendor Workaround

Disable HTTP/2 with http_2_options: [enabled: false], so that the vulnerable HTTP/2 handler never runs.


OpenCVE Recommended Actions

  • Disable HTTP/2 in Bandit by configuring http_2_options: [enabled: false].
  • Upgrade Bandit to version 1.14.0 or later once the vendor releases the patch.
  • Apply additional per‑connection or request rate limiting at a reverse proxy or load balancer to mitigate potential resource exhaustion.

Generated by OpenCVE AI on October 26, 2026 at 15:23 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories available
History
Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'none', 'Technical Impact': 'partial'}, 'version': '2.0.3'}

Type Values Removed Values Added
Description Improper Cleanup on Thrown Exception vulnerability in the HTTP/2 handler of mtrudel bandit allows an unauthenticated remote attacker to bypass per-connection resource limits via a single TCP write that carries several frames, one of which raises a stream error. When a frame raises StreamError partway through a chunk, Bandit.HTTP2.Handler.handle_data/3 sends RST_STREAM and continues with the connection state from before the chunk, dropping the rest of it. Streams opened by earlier frames in the chunk keep running their Plug calls, but the stream counts, last_stream_id, the rapid-reset timestamps, the HPACK decoder state and the buffer roll back, so max_concurrent_streams, max_requests and the rapid-reset limiter never see those streams. A client that sends one HEADERS frame more than max_concurrent_streams in each write has the extra refused and the others forgotten: with a limit of 10, five such writes run 50 Plug calls at once. This issue affects bandit: from 1.9.0 before 1.14.0.
Title HTTP/2 StreamError recovery rolls back connection state and bypasses per-connection limits in Bandit
First Time appeared Mtrudel
Mtrudel bandit
Weaknesses CWE-460
CPEs cpe:2.3:a:mtrudel:bandit:*:*:*:*:*:*:*:*
Vendors & Products Mtrudel
Mtrudel bandit
References
Metrics cvssV4_0

{'score': 8.2, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N'}

Weaknesses
  • CWE-460

    Improper Cleanup on Thrown Exception

Sources

Status
PUBLISHED
Assigner
EEF
Published
Updated
Oct 26, 2026, 3:35 PM
Reserved
Oct 23, 2026, 10:30 AM
Status
Awaiting Analysis
Published
Oct 26, 2026, 2:16 PM
Modified
Oct 26, 2026, 4:59 PM