Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend HTTP/1 request with absolute-form or authority-form target
-
DeliveryTarget authority overrides validated Host header (RFC 9112)
-
Exploitdetermine_host_and_port!/4 sets conn.host/conn.port unchecked
-
ExecutionApplication emits absolute URLs with attacker-chosen authority
-
ImpactVictim follows spoofed link (phishing/redirect)
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Hardware access control granularity
|
| Exploitation Conditions | No authentication, user interaction, or non-default Bandit configuration is required to inject the tainted authority - a remote unauthenticated request against a default Bandit deployment suffices, because RFC 9112 mandates that an absolute-form/authority-form request-target authority override the Host header, and Bandit passed it through unchecked. The HTTP/1.0 clause needs no Host header at all, and CONNECT places the raw port string in conn.port. The SECURITY IMPACT, however, is conditional: it only materializes when the hosting application builds absolute URLs from conn.host/conn.port (e.g. Plug.Conn.request_url/1, Phoenix URL/email link helpers) and uses them in a security-relevant way; apps that never derive URLs from the request authority are not affected. Strong limiting factors: message framing is unaffected, and no CR or LF byte can reach conn.host, so this cannot be used for HTTP request smuggling or response-header/CRLF injection. Affected versions: bandit 0.6.0 up to (not including) 1.13.0. |
| Impact | The vendor-supplied CVSS 4.0 score is 6.9 (Medium) with vector AV:N/AC:L/AT:N/PR:N/UI:N and impact limited to VI:L (low integrity) - no confidentiality (VC:N) or availability (VA:N) impact. The attack surface is trivially reachable: any remote, unauthenticated client can send a crafted request target over HTTP/1, so AC:L/PR:N/UI:N are well justified. However, the real-world severity hinges entirely on downstream behavior: the flaw only matters when the hosting application builds and trusts absolute URLs derived from conn.host/conn.port (e.g. Plug.Conn.request_url/1 or Phoenix URL helpers) for security-relevant links or redirects - making this effectively an open-redirect / link-poisoning / host-spoofing primitive rather than code execution or data exposure. No EPSS score, CISA KEV listing, or public POC is present in the provided data, so there is no evidence of active or at-scale exploitation. CONFLICTING SIGNAL: the input Tag 'Information Disclosure' is inconsistent with the vendor vector, which explicitly sets VC:N (no confidentiality impact) - the actual impact is integrity/spoofing of generated URLs, not disclosure; treat the tag with caution. Overall this is a legitimate but moderate-priority defense-in-depth fix: patch during normal cycles, prioritizing Phoenix/Plug apps that emit URLs from the request authority. |
| Exploit ScenarioDerived | A remote unauthenticated attacker sends an HTTP/1.1 request with an absolute-form target such as 'GET http://good.example@evil.example/x HTTP/1.1' plus a valid Host header; per RFC 9112 the request-target authority takes precedence, so Bandit sets conn.host to 'good.example@evil.example' without validation. In a Phoenix app that generates a password-reset or confirmation link via URL helpers, the emitted link now points at the attacker-chosen authority, enabling phishing or token redirection. No public exploit code is identified at time of analysis, though the request line itself is the entire payload and trivial to reproduce. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 15, 2026
Bandit versions 0.6.0 up to (but not including) 1.13.0 pass an attacker-supplied authority from HTTP/1 absolute-form and authority-form request targets straight into conn.host and conn.port without validating it against the RFC 3986 host grammar, so an unauthenticated remote request such as 'GET http://good.example@evil.example/x HTTP/1.1' overrides the Host header that Bandit does check. The real-world impact is narrow and conditional: it only matters when the hosting Elixir/Phoenix application builds absolute URLs from conn.host/conn.port (Plug.Conn.request_url/1, Phoenix URL helpers) and then uses those URLs in a security-relevant way, and because message framing is untouched and no CR or LF byte can reach conn.host, it cannot be turned into request smuggling or CRLF/response-header injection. The vendor rates this CVSS 4.0 6.9 (Medium) with only low integrity impact (VI:L, no confidentiality or availability loss); no public exploit code or confirmed active exploitation has been identified at time of analysis (no public exploit identified at time of analysis).
RemediationAI
Vendor-released patch: upgrade Bandit to 1.13.0 or later, which contains the upstream fixes in commit 6ea80210137b3f69caf65f67398934259dc365d0 and commit 0e3edda0edf6322e9164b827c6d3ddecd080ff2e (see advisory GHSA-v53v-9hvg-37jf at https://github.com/mtrudel/bandit/security/advisories/GHSA-v53v-9hvg-37jf and the CNA record at https://cna.erlef.org/cves/CVE-2026-105660.html); the patched releases reject non-absolute paths, schemeURI and unsupported request targets with 400 Bad Request and build the request URI from decoded components. If an immediate upgrade is not possible, note that the security impact only materializes for applications that derive absolute URLs from conn.host/conn.port, so the most effective compensating control is to stop trusting the request authority: configure the Phoenix endpoint with an explicit url: [host: ..., port: ...] (or the equivalent Plug-level setting) so Plug.Conn.request_url/1 and Phoenix URL helpers emit a static authority - the trade-off being that legitimate virtual-host or multi-tenant deployments will generate links to the configured host rather than the requested host, and per-tenant link generation must then be done explicitly. A narrower stopgap is to insert a plug ahead of routing that rejects or rewrites requests whose conn.host fails an RFC 3986 host allowlist and that rejects CONNECT targets bearing non-numeric or out-of-range ports, accepting additional per-request validation overhead and possible false positives for unusual but legitimate hostnames. Host-header validation alone is not sufficient, because RFC 9112 legitimately gives an absolute-form authority precedence; conversely, no CRLF can reach conn.host and framing is unaffected, so smuggling-oriented mitigations such as strict Transfer-Encoding/Content-Length handling are unnecessary for this specific issue.
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
HTTP/1 request targets come in four forms defined by RFC 9112 §3.2 - origin-form (abs_path, e.g. '/x'), absolute-form (absoluteURI, e.g. 'http://host:port/x'), authority-form (used with CONNECT, 'host:port') and asterisk-form ('*'). Erlang's :erlang.decode_packet/3 surfaces these as distinct tuples, but the affected Bandit code flattened them all into a single 'path' value and let Bandit.HTTP1.Handler build a URI by string interpolation ('#{scheme}://#{host}#{path}') and Bandit.Pipeline.determine_host_and_port!/4 (lib/bandit/pipeline.ex) forward the result unchecked. That is a CWE-1286 improper-validation-of-syntactic-correctness-of-input flaw: because RFC 9112 requires an authority present in an absolute-form target to take precedence over the Host header, the pre-1.13.0 implementation validated only the Host header and then accepted the attacker's authority verbatim, yielding conn.host values such as 'good.example@evil.example' and admitting NUL, DEL and non-ASCII bytes, invalid IP literals and port numbers outside 1..65535. HTTP/1.0 requests need no Host header at all, and CONNECT places the raw, unparsed port string into conn.port. The upstream fix (commits 6ea80210137b3f69caf65f67398934259dc365d0 and 0e3edda0edf6322e9164b827c6d3ddecd080ff2e) introduces resolve_request_target/1 and build_uri/3 in Bandit.HTTP1.Adapter so each request-target form is decoded separately, unsupported forms (notably schemeURI) and non-absolute paths are answered with 400 Bad Request, and the URI is constructed from the parsed components rather than a raw concatenation. Notably, no CR or LF byte can reach conn.host and message framing is unaffected, which is why the assessed CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N) caps the impact at low integrity rather than enabling smuggling.
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:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
Remote, unauthenticated, no user interaction (AV:N/AC:L/PR:N/UI:N); only low integrity impact (I:L) from attacker-tainted host/port propagating into app-generated URLs; no confidentiality or availability loss and no CRLF/scope change.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Improper Validation of Syntactic Correctness of Input vulnerability in mtrudel bandit allows an unauthenticated remote attacker to set conn.host and conn.port to values outside the RFC 3986 host grammar via the authority of an HTTP/1 absolute-form or authority-form request target. Bandit validates the Host header and answers 400 when it is malformed, but when the request target carries its own authority that authority takes precedence, as RFC 9112 requires, and Bandit.Pipeline.determine_host_and_port!/4 in lib/bandit/pipeline.ex passes it to the application unchecked. A request line such as GET http://good.example@evil.example/x HTTP/1.1 with a valid Host header yields a conn.host of good.example@evil.example, and the same path admits NUL, DEL and non-ASCII bytes, invalid IP literals and ports outside 1..65535. The HTTP/1.0 clause needs no Host header at all, and CONNECT places the unparsed port string in conn.port.
Applications that build absolute URLs from conn.host, such as through Plug.Conn.request_url/1 or Phoenix URL helpers, emit links whose authority the attacker chose. Message framing is unaffected, and no CR or LF can reach conn.host.
This issue affects bandit: from 0.6.0 before 1.13.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
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-102317
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB