Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft chunked POST with bare-LF chunk extension
-
DeliverySend through front-end proxy to Bandit
-
ExploitProxy and Bandit disagree on body boundaries
-
ExecutionBandit dispatches embedded request (GET /admin)
-
ImpactBypass proxy access controls to protected endpoint
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 | Exploitation requires Bandit versions 1.12.4 up to (but not including) 1.14.0 with HTTP/1.1 enabled (the default), AND - critically - a front-end proxy deployed ahead of Bandit that treats a bare LF as a line terminator inside the chunk-size line and forwards chunked request bodies unchanged. This proxy behavior is the AT:P attack requirement and is outside the attacker's control; the advisory states deployments without such a proxy are not affected. No authentication is required (PR:N) and no user interaction is needed. The vendor workaround, where the proxy can reach Bandit over HTTP/2, is to disable HTTP/1 with |
| Impact | This is a medium-severity request-smuggling flaw (CWE-444) with a CVSS 4.0 base score of 6.3. The signals are internally consistent and point to a real but conditional risk rather than a blanket emergency. The vector (AV:N/AC:L/AT:P/PR:N/UI:N) describes a network-reachable, unauthenticated attack, but the AT:P 'attack requirement' is the decisive qualifier: exploitation only works when Bandit sits behind a specific kind of front-end proxy that treats a bare LF as a line terminator and forwards chunked bodies unchanged - the advisory explicitly states deployments without such a proxy are not affected. No EPSS score and no CISA KEV entry were provided, so there is no evidence of active or widespread exploitation; the vuln.today decision label is 'this_month' (not act_now or emergency), matching a patch-promptly-but-not-drop-everything posture. A detailed proof-of-concept walkthrough is published in the GHSA advisory, and the introducing/fix commits are public, so the mechanism is fully disclosed. Net: a genuine patch-this-month item for Elixir/Erlang shops running Bandit behind a non-conforming proxy, not a high-CVSS-but-illusory issue, but also not a default-configuration internet-wide threat because of the proxy dependency. |
| Exploit ScenarioDerived | An unauthenticated remote attacker sends a single POST with Transfer-Encoding: chunked whose chunk-size line carries a chunk extension containing a bare LF (e.g. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 26, 2026
HTTP request smuggling in the Elixir Bandit web server (1.12.4 up to but not including 1.14.0) lets an unauthenticated remote attacker slip a second request past a front-end proxy by embedding a bare LF in a chunk extension. Because Bandit's HTTP/1.1 chunked reader treats the chunk-size line as everything up to the first CRLF and discards anything after ';' without validating it against the RFC 9112 chunk-ext grammar, Bandit can end a body early and dispatch a trailing 'GET /admin' as its own pipelined request, while a proxy that terminates the size line at the bare LF forwards the same bytes as a single POST. Impact is bounded by a hard precondition: there must be a front-end proxy that treats a bare LF as a line ending and forwards chunked bodies unchanged (the AT:P requirement, outside attacker control) - deployments without such a proxy are not affected. Severity is medium (CVSS 4.0 base 6.3; independently assessed as CVSS 3.1 AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:L/A:N), no CISA KEV entry exists, and the vendor advisory describes a proof-of-concept procedure that is not confirmed as publicly available working exploit code.
RemediationAI
Vendor-released patch: Bandit 1.14.0. Upgrade from any 1.12.4-through-1.13.x release to 1.14.0, which is the fix commit 220b9dfd27f9a21305be2afc75cbe585ddc24e7a (see also the introducing commit c31e9e3c76dcbfc239a96eabed5341ced7885ae5 and advisory https://github.com/mtrudel/bandit/security/advisories/GHSA-w5wc-g2hc-g7m2); the patch splits the chunk-size line at ';' and strictly hex-parses the size, rejecting any trailing bytes, and the advisory notes that once patched, bandit will reject these chunk-ext lines in strict mode rather than ignore them. Where upgrading is not immediately possible and the front-end proxy can reach Bandit over HTTP/2, the vendor workaround is to disable HTTP/1 with http_1_options: [enabled: false] so the chunked body reader never runs - the trade-off is that all HTTP/1.1 clients, including any that cannot negotiate HTTP/2, lose access. Environments with no front-end proxy in front of Bandit are documented as unaffected, so inventory the proxy tier first: a proxy that does not split on bare LF, or that re-encodes chunked bodies, removes the precondition entirely.
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 flaw is CWE-444 (Inconsistent Interpretation of HTTP Requests) in Bandit's HTTP/1.1 chunked body reader, lib/bandit/http1/socket.ex. Under RFC 9112 §7.1.1 a chunk-size line is chunk-size [ chunk-ext ] CRLF, where chunk-ext has a defined token/name-value grammar. Bandit instead matched <<chunk_size::binary-size(chunk_size_size), "\r\n", rest::binary>>, i.e. it took the size line to be everything up to the first CRLF and threw away everything after ';' with no grammar check, so bare LF, bare CR and other control bytes were accepted inside the extension. The 16-byte size-line cap offers no protection because the payload only needs 5 bytes. For the body 2;\nxx\r\n40\r\n0\r\n\r\nGET /admin ..., Bandit reads 2;\nxx as the size line, treats 40 as the 2-byte chunk, and the embedded 0\r\n\r\n terminates the body, after which it dispatches GET /admin as a second pipelined request; a proxy that ends the size line at the bare LF sees one POST with a 0x40-byte chunk containing the GET /admin bytes. This parsing divergence between two HTTP implementations is the classic desynchronization primitive used to bypass proxy-side access controls. The upstream fix splits the size line at ';' and strictly parses the size with Integer.parse/2, raising a request error on any trailing garbage.
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:N/VI:L/VA:N/SC:L/SI:L/SA:N
Remote and unauthenticated, but exploitation depends on a specific front-end proxy that treats bare LF as a line terminator (modeled as AC:H in 3.1); impact is integrity via access-control bypass crossing the proxy boundary (S:C, I:L, no confidentiality/availability impact).
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling') vulnerability in the HTTP/1.1 chunked body reader of mtrudel bandit allows an unauthenticated remote attacker to smuggle a second request past a front-end proxy via a chunk extension that contains a bare LF.
The chunked reader in lib/bandit/http1/socket.ex takes the chunk-size line to be everything up to the first CRLF and discards everything after ; without checking it against the RFC 9112 chunk-ext grammar, so bare LF, bare CR and other control bytes pass. A proxy that ends the size line at a bare LF reads 2;\nxx\r\n40\r\n... as one request whose second chunk holds a GET /admin, while Bandit ends the body early and dispatches GET /admin as a separate pipelined request. Deployments without such a proxy in front of Bandit are not affected.
This issue affects bandit: from 1.12.4 before 1.14.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
HTTP request smuggling in mtrudel bandit before version 1.11.0 allows unauthenticated attackers to bypass edge security
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
EUVD-2026-109820
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB