Skip to main content

Bandit CVE-2026-39803

| EUVDEUVD-2026-29950 HIGH
Allocation of Resources Without Limits or Throttling (CWE-770)
2026-05-13 EEF GHSA-9q9q-324x-93r2
8.7
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Open TCP connection to Bandit HTTP port
  2. Delivery
    Send POST any path, Transfer-Encoding: chunked
  3. Exploit
    Stream oversized chunked body past 8 MB cap
  4. Execution
    Bandit buffers full body in memory
  5. Persist
    BEAM exhausts RAM, OOM-killed
  6. Impact
    Service denial for all users

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource allocation limits
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires that the target run Bandit 1.4.0-1.11.0 as its HTTP/1 server AND that the request use Transfer-Encoding: chunked (the Content-Length path is not vulnerable). In the standard Phoenix/Plug endpoint a Plug.Parsers plug (json, urlencoded, or multipart with pass matching the request Content-Type) must be reachable, which is the default configuration - Plug.Parsers executes before routing and auth, so no valid route, session, or credentials are required and any path works. Limiting factors: the attack only affects HTTP/1 chunked bodies, so a fronting proxy that terminates chunked encoding or enforces its own body-size cap before Bandit neutralizes it; deployments serving only over HTTP/2, or that stream request bodies without Plug.Parsers, are less exposed. Impact is confined to availability (process/node crash), with no data disclosure or code execution.

Impact

The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N, VA:H, VC:N/VI:N) is internally consistent with the description: network-reachable, low-complexity, unauthenticated, availability-only impact - a clean single-request DoS with no confidentiality or integrity effect, scoring 8.7. SSVC reinforces prioritization: Exploitation=poc (matching the published PoC), Automatable=yes (trivially scriptable and repeatable), Technical Impact=partial (service crash, not full system compromise). The tension in the signals is EPSS: 0.31% (54th percentile) is low, which is typical for DoS bugs that are noisy and not attacker-monetizable rather than an indicator of low exploitability - the bug is genuinely easy to trigger. This is a real availability priority for any internet-facing Bandit deployment because it requires no auth and no valid route, but it is not a remote-code-execution or data-breach event. Absent KEV listing, treat it as high-value-to-patch but not emergency-out-of-band unless the service is exposed and availability-critical.

Exploit ScenarioDerived

An attacker points a short script at any URL of an internet-facing Phoenix/Plug app served by vulnerable Bandit and opens a single POST with Transfer-Encoding: chunked and a Content-Type matching a configured parser, streaming multi-megabyte chunks indefinitely. Because Plug.Parsers runs before routing and authentication, no credentials or valid route are needed; the server buffers the entire body until beam.smp RSS exceeds available memory and the OS OOM killer terminates the node. A working PoC (chunked_oom.exs) is published in the GHSA advisory, making this trivially reproducible.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Jul 23, 2026

Unauthenticated remote denial of service in Bandit (the Elixir HTTP/1 web server for Phoenix/Plug applications) versions 1.4.0 through 1.11.0 allows an attacker to crash the entire BEAM VM by sending a single Transfer-Encoding: chunked POST with an oversized body. The chunked-body reader ignores the application's configured :length cap (e.g. Plug.Parsers' default 8 MB), buffering the whole body in memory until the OS OOM killer terminates the process. Publicly available exploit code exists (a self-contained PoC ships in the GHSA advisory), though EPSS remains low at 0.31% and it is not listed in CISA KEV.

RemediationAI

Vendor-released patch: 1.11.1 - upgrade the bandit dependency to 1.11.1 or later (mix deps.update bandit / pin {:bandit, "~> 1.11.1"} in mix.exs), which changes do_read_chunked_data! to track accumulated bytes against the :length option and return {:more, ...} or raise a request_error! once the cap is exceeded (fix commit ae3520dfdbfab115c638f8c7f6f6b805db34e1ab). If you cannot upgrade immediately, place a reverse proxy or load balancer in front of Bandit and enforce a hard request-body size limit there (for example nginx client_max_body_size or an equivalent cap on chunked/streamed bodies) so oversized bodies are rejected before reaching the BEAM - the trade-off is that legitimate large uploads will also be capped and you must ensure the proxy limit is applied to chunked transfers, not just Content-Length requests. As an operational backstop, constrain the BEAM process memory (cgroup/systemd MemoryMax) so an OOM affects only that container rather than the host, accepting that the service still crashes on attack. Advisories: https://github.com/mtrudel/bandit/security/advisories/GHSA-9q9q-324x-93r2 and https://cna.erlef.org/cves/CVE-2026-39803.html.

Affected VersionsENISA

bandit 903e209a521bc216b9f9065c01ae9a0cac2d5a10 <ae3520dfdbfab115c638f8c7f6f6b805db34e1ab
bandit 1.4.0 <1.11.1

Affected Packages

euvd bandit fix: 1.11.1

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

Bandit is a pure-Elixir HTTP server built on Thousand Island that serves as the Plug/Phoenix web adapter, increasingly the default in modern Phoenix stacks. The root cause is CWE-770 (Allocation of Resources Without Limits or Throttling): in lib/bandit/http1/socket.ex, the chunked clause of read_data/2 forwards only :read_length and :read_timeout to do_read_chunked_data!/5 and drops the caller-supplied :length option. It accumulates every chunk into an iolist and calls IO.iodata_to_binary/1 to materialize the full body, always returning {:ok, body, ...} and never {:more, ...}, so upstream callers (Plug.Parsers) get no chance to emit a 413. By contrast, the Content-Length path correctly bounds reads with min(unread_content_length, Keyword.get(opts, :length, 8_000_000)) and is unaffected. The CPE cpe:2.3:a:mtrudel:bandit identifies the affected package.

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

Vendor (EEF) PRIMARY 8.7 HIGH
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
vuln.today AI 7.5 HIGH

Remote, unauthenticated, single-request trigger with no user interaction (AV:N/AC:L/PR:N/UI:N); impact is availability-only (A:H, C:N/I:N) with no scope change.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
CVE Published
May 13, 2026 - 13:36 nvd
UNKNOWN (no severity yet)
CVE Published
May 13, 2026 - 13:36 cve.org
HIGH 8.7

DescriptionCVE.org

Allocation of Resources Without Limits or Throttling vulnerability in mtrudel bandit allows unauthenticated remote denial of service via memory exhaustion.

The chunked clause of 'Elixir.Bandit.HTTP1.Socket':read_data/2 in lib/bandit/http1/socket.ex ignores the caller-supplied :length option when reading HTTP/1 chunked request bodies. Instead of capping the accumulated body at the configured limit (e.g. Plug.Parsers' default 8 MB), do_read_chunked_data!/5 buffers every received chunk into an iolist unconditionally and materializes the entire body as a single binary. The function always returns {:ok, body, ...}, so callers cannot interpose a 413 response.

Because Plug.Parsers runs before routing and authentication in the standard Phoenix endpoint, an unauthenticated attacker needs no valid route or credentials. Sending a single Transfer-Encoding: chunked POST request with an arbitrarily large body to any path causes the BEAM process to exhaust available memory and be terminated by the OS OOM killer.

The content-length path in the same function correctly enforces the limit and is not affected.

This issue affects bandit: from 1.4.0 before 1.11.1.

Executive ViewAI

Why It Matters

Bandit HTTP server versions 1.4.0-1.11.0, commonly used in Elixir/Phoenix applications, contains an unauthenticated denial-of-service vulnerability; publicly available exploit code exists. Organizations running affected versions face immediate risk of complete application server outages triggered by a single malformed request from any internet-connected attacker. Immediate patching to Bandit 1.12.0 or later is required to maintain application availability.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.3%
Top 46% exploitable
Prevalence
Medium
increasingly default Phoenix web server, but within niche Elixir ecosystem
Threat Intel
1
1 source
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub VulDB

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Out-of-Cycle
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

44
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

More in Bandit

View all
CVE-2026-42786 HIGH POC
8.7 May 01

Memory exhaustion in Bandit WebSocket server (versions 0.5.0 through 1.10.x) allows unauthenticated remote attackers to

CVE-2026-39804 HIGH POC
8.2 May 01

Memory exhaustion in Bandit WebSocket server (versions 0.5.9 through 1.10.x) allows unauthenticated remote attackers to

CVE-2026-42788 MEDIUM POC
6.9 May 01

Denial of service in mtrudel bandit via HTTP/2 frame deserialization allows unauthenticated remote attackers to exhaust

CVE-2026-39807 MEDIUM POC
6.3 May 01

Transport-state spoofing in Bandit 1.0.0 through 1.10.x allows unauthenticated remote attackers to forge HTTPS connectio

CVE-2026-39805 MEDIUM POC
6.3 May 01

HTTP request smuggling in mtrudel bandit before version 1.11.0 allows unauthenticated attackers to bypass edge security

CVE-2026-105659 HIGH
8.7 Oct 14

Uncontrolled HTTP/2 flow-control resource consumption in mtrudel/bandit 1.4.0 and later lets an unauthenticated remote p

CVE-2026-39806 HIGH
8.7 May 13

Unauthenticated remote denial of service in mtrudel Bandit (Elixir HTTP server) versions 1.6.1 through 1.11.0 lets any c

CVE-2026-65623 HIGH
8.7 Jul 24

CPU exhaustion in bandit 1.11.0 to 1.12.0 allows unauthenticated remote denial-of-service via WebSocket fragment reassem

CVE-2026-116078 HIGH
8.7 Oct 28

Bandit's HTTP/2 request body reader amplifies memory use, letting an unauthenticated remote client make a server hold ro

CVE-2026-108529 HIGH
8.7 Oct 26

Unauthenticated remote CPU exhaustion in mtrudel Bandit's HTTP/2 server (versions before 1.14.0) is achievable by holdin

CVE-2026-110499 HIGH
8.7 Oct 26

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

CVE-2026-109584 HIGH
8.7 Oct 26

Unauthenticated remote attackers can exhaust BEAM node memory on default-configured mtrudel Bandit HTTP/2 servers (0.3.3

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy