Skip to main content

Elixir URI EUVDEUVD-2026-113757

| CVE-2026-109821 MEDIUM
Improper Validation of Specified Quantity in Input (CWE-1284)
2026-10-30 EEF
6.3
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

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

  1. Access
    Submit URL with huge port in request body
  2. Delivery
    Server calls URI.parse/1
  3. Exploit
    Oversized bignum port constructed
  4. Execution
    App renders URI via integer_to_binary
  5. Persist
    Quadratic CPU burn on OTP 27/28/29.0
  6. Impact
    Sustained requests exhaust CPU

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V2 - Validation and Business Logic Input size validation
Exploitation Conditions

The application must parse an attacker-controlled URL with URI.parse/1 (the independently-parsing function - URI.new/1 and URI.new!/1 use :uri_string and are NOT affected on OTP 27.3.4.17, 28.5.0.6, 29.0.6 and later, which cap the port at 5 digits) AND must subsequently render or echo the parsed %URI{} or a value containing it via URI.to_string/1, inspect/1, logging, or error formatting. The multi-second cost requires Erlang/OTP 27, 28, or 29.0; on OTP 29.1 and later the conversion is sub-quadratic and a 1 MB port renders in under a second, sharply limiting impact. The attacker input must also reach a path not bounded by small size limits: HTTP headers and the request line are capped by server limits, but form and JSON body fields are not (Plug's default JSON body limit is 8 MB). No authentication is required (PR:N). Ports above 65535, and up to 1,262,592 digits, are accepted; a longer port raises SystemLimitError that escapes URI.parse/1.

Impact

This is a genuine but moderate-priority denial-of-service issue, not a high-CVSS-but-trivial problem and not a widespread emergency. The CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:N) correctly shows a network-reachable, unauthenticated, low-complexity vector with only partial availability impact (VA:L) and no confidentiality or integrity impact, and the AT:P (attack requirements present) flag reflects that exploitation depends on environmental conditions: the application must call URI.parse/1 on attacker-supplied input AND later render the result, running on Erlang/OTP 27, 28, or 29.0 where :erlang.integer_to_binary/1 is quadratic. No EPSS score and no CISA KEV entry are present in the input, so there is no signal of active exploitation; the vuln.today decision label is 'this_month', consistent with a patch-this-cycle rather than drop-everything posture. The GHSA advisory includes a detailed proof-of-concept but the input does not mark it as confirmed working exploit code. The main caveats: the per-request cost drops below one second on OTP 29.1+ (sub-quadratic), so the real-world severity is strongly dependent on the Erlang/OTP version deployed - a factor raw CVSS cannot capture - and only code paths using URI.parse/1 (not URI.new/1) are affected.

Exploit ScenarioDerived

An unauthenticated client submits a URL field in a form or JSON request body (where length limits are generous - Plug's default JSON body limit is 8 MB) containing a host port of several hundred thousand decimal digits. The server's URI.parse/1 builds a multi-hundred-thousand-digit bignum, and when the application renders that parsed URI via URI.to_string/1, inspect/1, or error/access logging, :erlang.integer_to_binary/1 burns seconds of CPU on a dirty scheduler per request; sustained requests exhaust CPU. A detailed proof-of-concept exists in the vendor GHSA advisory (a 400,000-digit port renders in ~2.6 s on OTP 27/28).

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.5% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Oct 30, 2026

Denial of service in the Elixir standard library's URI module lets a remote client submit a URL whose port component contains hundreds of thousands of digits, causing URI.parse/1 to construct an oversized bignum whose later conversion to text costs seconds of CPU. Exposure requires that the application parse attacker-supplied URLs with URI.parse/1 (not URI.new/1, which uses :uri_string and is capped at five digits on patched Erlang/OTP releases) and then render or echo the resulting %URI{} through URI.to_string/1, inspect/1, logging or error formatting, with the multi-second cost confined to Erlang/OTP 27, 28 and 29.0 while OTP 29.1 and later are largely immune. Authentication is not required (PR:N), but the effect is limited to availability (A:L) and sustained CPU pressure, the advisory documents a proof-of-concept reproduction rather than released exploit tooling, and no confirmed active exploitation is reported; vendor-fixed releases 1.18.6, 1.19.7 and 1.20.5 are available, placing this at moderate, this-month priority rather than an emergency.

RemediationAI

Vendor-released patches are Elixir 1.18.6, 1.19.7 and 1.20.5, so upgrade to the fixed release for your branch; the corresponding fix commits are 9a39d64, b70f33a, 07d9abc and d879b39, with the advisory at https://github.com/elixir-lang/elixir/security/advisories/GHSA-327h-97cv-59xg. Where an immediate upgrade is not possible, the advisory's workarounds are to reject overly long URLs before parsing them (for example anything above a few kilobytes, which still leaves legitimate form and JSON body input usable but caps the port digit run) and to reject any parsed port above 65535 before rendering or otherwise using the %URI{} value; both trade a small amount of input flexibility for removing the oversized-bignum path. Switching affected call sites from URI.parse/1 to URI.new/1 or URI.new!/1 is not affected on Erlang/OTP 27.3.4.17, 28.5.0.6 and 29.0.6 or later, where :uri_string limits the port to five digits, but this is a code change with its own return-value semantics (URI.new/1 returns an {:ok, uri} / {:error, part} tuple) and does not by itself protect applications still running older OTP patch levels. Upgrading Erlang/OTP to 29.1 or later reduces the conversion from quadratic to sub-quadratic (a 1 MB port renders in under a second) but does not remove the underlying unbounded-port parsing, so the Elixir upgrade or the input-rejection controls remain necessary.

Affected VersionsENISA

elixir 39801821eef2d06524e5ebf5a0e4b3c380ad23ae <*
elixir 1.19.0-rc.0 <1.19.7
elixir 1.20.0-rc.0 <1.20.5
elixir 0.5.0 <1.18.6

Affected Packages

euvd elixir fix: 1.18.6, 1.19.7, 1.20.5

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 root cause is CWE-1284 (Improper Validation of Specified Quantity in Input): in split_authority/1 in lib/elixir/lib/uri.ex, URI.parse/1 matches the port with the regex (:(\d*))? and converts the digit run with String.to_integer/1 without any length bound. The VM therefore builds an integer of up to 1,262,592 decimal digits (roughly 30 ms to parse 400,000 digits), and a longer port raises SystemLimitError that escapes URI.parse/1 instead of returning a %URI{}; ports above 65535 are also accepted without complaint. The cost lands on the rendering side: URI.to_string/1 and inspect/1 both go through :erlang.integer_to_binary/1, which is quadratic on Erlang/OTP 27, 28 and 29.0 and becomes sub-quadratic from OTP 29.1 (erlang/otp PR 11074), and per the companion Erlang/OTP advisory GHSA-8qw4-2chm-mvj2 that conversion occupies a dirty CPU scheduler for its full duration. The same digits placed in the path instead of the port parse and render in about a millisecond or less, confirming the port parser is the specific weak point. Erlang/OTP's own :uri_string.parse/1 was hardened to a five-byte port limit under GHSA-8qw4-2chm-mvj2, which is why URI.new/1 and URI.new!/1 inherit protection on OTP 27.3.4.17, 28.5.0.6 and 29.0.6 or later, while URI.parse/1 performs its own parsing and does not. Reachability depends on the input channel: URL data in HTTP headers and the request line is bounded by server size limits, whereas form fields and JSON bodies are not (Plug's default JSON body limit is 8 MB), and one observed library path passes a user-supplied URL to Req inside a Bandit request so that Bandit's error logging formats the value, taking 2.8 seconds at 400,000 digits on OTP 28. The vulnerability is scored 6.3 under CVSS v4.0 (AV:N/AC:L/AT:P/PR:N/UI:N/VA:L) and was reported through the EEF CNA, with the affected package tracked as otp/elixir.

Know when Elixir 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 6.3 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
vuln.today AI 5.3 MEDIUM

Remote unauthenticated input to URI.parse/1 (AV:N, PR:N, UI:N); low complexity to send the payload; only partial availability impact via CPU exhaustion (A:L), with no confidentiality or integrity effect.

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

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

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

DescriptionCVE.org

Improper Validation of Specified Quantity in Input vulnerability in the Elixir standard library's URI module allows an attacker who supplies a URL to cause a denial of service through CPU exhaustion.

URI.parse/1 converts the port component with String.to_integer/1 in split_authority/1 (lib/elixir/lib/uri.ex) without bounding its length, so a port of up to 1,262,592 decimal digits produces a bignum of that size and a longer one raises SystemLimitError. Rendering the parsed URI back to text (URI.to_string/1, inspect/1, logging, error formatting) converts the bignum with :erlang.integer_to_binary/1, which is quadratic on Erlang/OTP 27, 28 and 29.0: a 400,000-digit port renders in about 2.6 seconds and a 1 MB port in about 18 seconds. Ports above 65535 are also accepted.

This issue affects elixir: from 0.5.0 before 1.18.6, from 1.19.0-rc.0 before 1.19.7, and from 1.20.0-rc.0 before 1.20.5.

Threat Intelligence Overview

EPSS Score
0.5%
Top 57% exploitable
Prevalence
Medium
standard library of a moderately popular Elixir/Phoenix web backend ecosystem
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High

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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

32
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
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 Elixir

View all
CVE-2026-54451 HIGH POC
8.2 Jul 15

Unbounded recursion in the Elixir `protobuf` Hex package (versions >= 0.8.0, < 0.16.1) lets unauthenticated remote attac

CVE-2026-91187 CRITICAL
9.3 Sep 24

Improper JWT signature verification in Dashbit's nimble_zta (0.1.2 up to but not including 0.1.3) lets an unauthenticate

CVE-2026-76949 CRITICAL
9.1 Sep 17

Session-swapping authentication bypass in the Elixir library AshAuthentication (versions 4.10.0 before 4.15.0 and 5.0.0-

CVE-2026-91039 CRITICAL
9.1 Sep 17

Authentication bypass in the Elixir library ash_authentication lets an attacker who operates one federated identity-prov

CVE-2026-88952 CRITICAL
9.1 Sep 17

Account takeover in AshAuthentication (Elixir/Ash) 4.14.0 through 4.14.x and 5.0.0-rc.10 through 5.0.0-rc.13 lets unauth

CVE-2026-77866 CRITICAL
9.0 Sep 15

Server-Side Request Forgery protection bypass in the Elixir safeurl library (versions 0.1.0 and later) allows unauthenti

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-111101 HIGH
8.7 Oct 26

Unauthenticated remote denial of service in the Elixir HTTP server Bandit (mtrudel/bandit) from 0.1.0 before 1.14.0 lets

CVE-2026-113436 HIGH
8.7 Oct 26

Unauthenticated remote attackers can consume disproportionate server CPU on Bandit (mtrudel/bandit, Elixir/Erlang) by se

CVE-2026-104635 HIGH
8.2 Oct 09

Memory-exhaustion denial of service in the elixir-protobuf library (protobuf) from 0.8.0 onward allows an unauthenticate

CVE-2026-94201 HIGH
8.2 Oct 05

Atom table exhaustion in the Ash framework (Elixir) allows an unauthenticated remote attacker to crash a BEAM node by su

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