Plug: multipart :length limit is not charged for part headers, enabling unbounded temp-file creation (denial of service)
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Attack requirements
- None
- Impact type
- Denial of service
- Confidentiality · integrity · availability
- None · None · Low
- Fix status
- Fixed
Attack profile from CVSS 4.0 · CNA. Fix status from CNA. Impact type from CWE-770.
Summary
Plug.Parsers.MULTIPART, the multipart request-body parser used to handle file uploads and multipart forms, does not enforce its :length budget against all consumed resources, allowing an unauthenticated remote attacker to cause denial of service. The parser charges the :length limit only for part body bytes; part header bytes are never counted, and a part with an empty body costs zero. Because every part whose Content-Disposition carries a non-empty filename creates a fresh temporary file (via Plug.Upload) and retains a Plug.Upload struct for the duration of the request, an attacker can send a single request composed of many empty-body file parts. Such a request stays well under the configured :length limit (8,000,000 bytes by default) while creating one temporary file per part, leading to inode and disk exhaustion and unbounded memory growth. Any application using Plug.Parsers with the :multipart parser is affected, and no authentication is required, only reachability of a multipart endpoint over HTTP. This vulnerability is associated with program files lib/plug/parsers/multipart.ex and program routines Plug.Parsers.MULTIPART.parse_multipart/2, Plug.Parsers.MULTIPART.parse_multipart_headers/5, Plug.Parsers.MULTIPART.parse_multipart_body/4, and Plug.Parsers.MULTIPART.parse_multipart_file/4. This issue affects plug: from 1.4.0-rc.0 before 1.16.6, from 1.17.0 before 1.17.4, from 1.18.0 before 1.18.5, from 1.19.1 before 1.19.5, and from 1.20.0 before 1.20.3.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- None
- Automatable
- Yes
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| elixir-plug | plug | 1.4.0-rc.0 to before 1.16.6; 1.17.0 to before 1.17.4; 1.18.0 to before 1.18.5; 1.19.1 to before 1.19.5; 1.20.0 to before 1.20.3 | 1.16.6, 1.17.4, 1.18.5, 1.19.5, 1.20.3 | Patch available | CNA |
- plug Vendorelixir-plug Affected 1.4.0-rc.0 to before 1.16.6; 1.17.0 to before 1.17.4; 1.18.0 to before 1.18.5; 1.19.1 to before 1.19.5; 1.20.0 to before 1.20.3 Fixed in 1.16.6, 1.17.4, 1.18.5, 1.19.5, 1.20.3 Patch available CNA
CPE names CNA · 1
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:elixir-plug:plug:*:*:*:*:*:*:*:* | — | — | elixir-plug |
- cpe:2.3:a:elixir-plug:plug:*:*:*:*:*:*:*:* Versions — — ·elixir-plug
Remediation
- Fix · CNA plug (elixir-plug) Fixed in 1.16.6, 1.17.4, 1.18.5, 1.19.5, 1.20.3
Fixed in the same release
Records fixed by the same vendor advisory or release, as the CNA lists them.
- Release ·
elixir-plug plug 1.16.6, 1.17.4 and 3 more versions
2 records Highest priority Priority LOW 2 LOW
Other records, highest priority first
- TI-2026-40966 Cookie attribute injection in Plug.Conn.Cookies.encode/2Priority LOW 11
Timeline
- 2026-10-02 Threatist record created from CVE-2026-56814
References
Patch 6
More elixir-plug vulnerabilities
- TI-2026-39665 Plug: quadratic-time decoding of nested query/body parameters enables denial of service CVSS 4.0HIGH 8.7
- TI-2026-25180 Atom table exhaustion via HTTP/2 :scheme pseudo-header in plug_cowboy CVSS 4.0HIGH 8.7
- TI-2026-07437 Unbounded buffer accumulation in multipart header parsing causes denial of service in plug CVSS 4.0HIGH 8.2
- TI-2026-79606 Secret key base leaks into logs via wrong-typed Plug.Crypto arguments CVSS 4.0MEDIUM 5.1
- TI-2026-40966 Cookie attribute injection in Plug.Conn.Cookies.encode/2 CVSS 4.0LOW 2.1
Sources
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences