Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconCraft HTTP request with duplicate Content-Length headers
-
DeliverySend through misconfigured proxy
-
ExploitProxy forwards using last header value
-
InstallBandit parses using first header value
-
C2Request framing desynchronizes on keep-alive connection
-
ExecuteRemaining bytes interpreted as pipelined request
-
ImpactSmuggled request bypasses WAF and rate limits
-
Step 8Unauthorized action executed on backend
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V4 - API and Web Service HTTP request consistency
|
| Exploitation Conditions | The vulnerability requires a specific deployment topology and configuration misalignment: (1) Bandit must be deployed behind a reverse proxy or load balancer that processes duplicate Content-Length headers and selects the last value (rather than rejecting the request) - this includes certain nginx, Apache, or custom proxy configurations; (2) HTTP keep-alive connections must be enabled on both the proxy-to-Bandit link and the client-to-proxy link, allowing pipelined requests on the same connection; (3) the upstream application must process requests smuggled through the desynchronized framing without additional validation, and must lack independent rate-limiting or WAF rules at the Bandit layer. Bandit in isolation (without a problematic proxy) does NOT exhibit exploitable vulnerability - the attack requires the inconsistency between Bandit's first-value parsing and the proxy's last-value interpretation. Default Bandit configurations with compliant proxies (that reject duplicate Content-Length per RFC 9112) are NOT vulnerable. Authentication is NOT required - this is an unauthenticated network attack exploiting protocol interpretation differences. |
| Impact | CVSS 6.3 with AV:N/AC:L indicates network-accessible exploitation with low attack complexity, but the AT:P (Attack Timing Present) qualifier suggests timing constraints reduce real-world exploitability. The vulnerability requires precise coordination: the attacker must craft a request with two Content-Length headers with mismatched values AND position it behind a proxy that uses last-value semantics while Bandit uses first-value semantics - this is not a default HTTP behavior but rather a deployment-specific misconfiguration. EPSS data is not provided in input; however, the attack prerequisites (proxy misconfiguration + keep-alive enabled + downstream application processing smuggled requests) are common but not universal. The threat model is clear: request smuggling can bypass rate limiting, path-based access controls (e.g., /admin routes), and WAF inspection, but only when both Bandit and an upstream proxy exhibit the divergent interpretation simultaneously. The RFC 9112 compliance fix (commit f2ca636) changes Bandit to explicitly reject all duplicate Content-Length headers with a 400 error, eliminating the vulnerability entirely. This is a real issue for deployments matching the proxy-Bandit stack, but not a remote code execution or authentication bypass on Bandit alone. Risk is HIGH for affected deployments (edge proxies + Bandit); MEDIUM-LOW for general Internet-facing Bandit instances without problematic proxies. |
| Exploit ScenarioDerived | An attacker crafts an HTTP POST request with two Content-Length headers: 'Content-Length: 50' and 'Content-Length: 1000', followed by 1000 bytes of body data (200 bytes of legitimate request + 800 bytes of smuggled payload). The request is sent to a reverse proxy configured to use the last Content-Length value (e.g., nginx with a default or misconfigured setup). The proxy forwards the entire 1000-byte body to Bandit. Bandit reads only the first 50 bytes as the request body (using the first header), leaving 950 bytes (the smuggled payload) in the keep-alive connection buffer. When the same connection is reused, Bandit interprets the remaining 950 bytes as a new HTTP request. If the smuggled payload contains a request targeting an /admin route with elevated privileges, it bypasses WAF inspection (which only saw the original 50-byte request) and rate-limiting counters applied to the first request. This allows unauthorized actions on the backend application. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – May 01, 2026
HTTP request smuggling in mtrudel bandit before version 1.11.0 allows unauthenticated attackers to bypass edge security controls when the application sits behind a proxy that interprets duplicate Content-Length headers differently. The vulnerability stems from Bandit accepting only the first Content-Length header while proxies may use the last value, causing request framing desynchronization that enables smuggling past WAF rules, path-based ACLs, rate limiting, and audit logging. CVSS 6.3 (AV:N/AC:L/AT:P) indicates network-accessible exploitation with some attack timing complexity; no public exploit code or active KEV listing identified at analysis time, but RFC 9112 non-compliance creates a known attack pattern.
RemediationAI
Vendor-released patch: bandit 1.11.0 or later. The upstream fix modifies get_content_length/1 to reject all requests with multiple Content-Length headers (even if values are identical) by returning an error, causing Bandit to return HTTP 400 Bad Request per RFC 9112 Section 6.3. Deploy bandit 1.11.0+ immediately in all environments. For organizations unable to upgrade immediately, implement the following compensating controls: (1) Disable HTTP keep-alive on the reverse proxy layer by setting 'Connection: close' in responses, preventing pipelined request exploitation on the same connection (trade-off: increased connection overhead); (2) Configure the upstream proxy to reject requests with multiple Content-Length headers before forwarding to Bandit, e.g., using nginx 'if ($http_content_length_count > 1)' validation or equivalent WAF rules (trade-off: must maintain proxy ruleset in sync with Bandit releases); (3) Run Bandit behind a strict rate-limiting and request inspection layer that treats request smuggling attempts as attack signals (trade-off: adds operational complexity). Patch availability confirmed via GitHub commit f2ca636eb6df385219957e8934e9fc6efa1630d1.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability exists in Bandit's HTTP/1.1 header parsing logic, specifically in 'Elixir.Bandit.Headers':get_content_length/1 within lib/bandit/headers.ex. The Elixir function List.keyfind/3 returns only the first matching header when multiple Content-Length headers exist in an HTTP request, violating RFC 9112 Section 6.3 which mandates rejection of duplicate Content-Length headers as unrecoverable framing errors. When Bandit operates behind a reverse proxy (common in edge deployments), the proxy may normalize the request by selecting the last Content-Length value and forwarding it, while Bandit reads the body based on the first value. This creates a desynchronized framing state: bytes intended for the second request (as interpreted by Bandit's logic) remain in the keep-alive connection buffer and are processed as a separate pipelined HTTP request, bypassing upstream security controls that evaluated the original request. The attack leverages inconsistent HTTP semantics interpretation between two network hops - a classic request smuggling vulnerability (CWE-444).
Know when Bandit gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
Lifecycle Timeline
3DescriptionCVE.org
Inconsistent Interpretation of HTTP Requests vulnerability in mtrudel bandit allows HTTP request smuggling via duplicate Content-Length headers.
'Elixir.Bandit.Headers':get_content_length/1 in lib/bandit/headers.ex uses List.keyfind/3, which returns only the first matching header. When a request contains two Content-Length headers with different values, Bandit silently accepts it, uses the first value to read the body, and dispatches the remaining bytes as a second pipelined request on the same keep-alive connection. RFC 9112 §6.3 requires recipients to treat this as an unrecoverable framing error.
When Bandit sits behind a proxy that picks the last Content-Length value and forwards the request rather than rejecting it, an unauthenticated attacker can smuggle requests past edge WAF rules, path-based ACLs, rate limiting, and audit logging.
This issue affects bandit: before 1.11.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
HTTP request smuggling exploits inconsistencies in how front-end and back-end servers parse HTTP message boundaries.
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Memory exhaustion in Bandit WebSocket server (versions 0.5.0 through 1.10.x) allows unauthenticated remote attackers to
Memory exhaustion in Bandit WebSocket server (versions 0.5.9 through 1.10.x) allows unauthenticated remote attackers to
Denial of service in mtrudel bandit via HTTP/2 frame deserialization allows unauthenticated remote attackers to exhaust
Transport-state spoofing in Bandit 1.0.0 through 1.10.x allows unauthenticated remote attackers to forge HTTPS connectio
Uncontrolled HTTP/2 flow-control resource consumption in mtrudel/bandit 1.4.0 and later lets an unauthenticated remote p
Unauthenticated remote denial of service in mtrudel Bandit (Elixir HTTP server) versions 1.6.1 through 1.11.0 lets any c
CPU exhaustion in bandit 1.11.0 to 1.12.0 allows unauthenticated remote denial-of-service via WebSocket fragment reassem
Unauthenticated remote denial of service in Bandit (the Elixir HTTP/1 web server for Phoenix/Plug applications) versions
Bandit's HTTP/2 request body reader amplifies memory use, letting an unauthenticated remote client make a server hold ro
Unauthenticated remote CPU exhaustion in mtrudel Bandit's HTTP/2 server (versions before 1.14.0) is achievable by holdin
Unbounded per-connection memory and CPU growth in the Elixir Bandit HTTP/2 server (0.3.6 up to 1.14.0) lets an unauthent
Unauthenticated remote attackers can exhaust BEAM node memory on default-configured mtrudel Bandit HTTP/2 servers (0.3.3
EUVD-2026-26712
GHSA-c67r-gc9j-2qf7
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB