Skip to main content

Elixir CVE-2026-75758

| EUVDEUVD-2026-67707 MEDIUM
Uncontrolled Recursion (CWE-674)
2026-08-28 EEF
5.9
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

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

  1. Recon
    Craft list: 4096+ valid code points then nil or atom
  2. Delivery
    Submit via application endpoint calling List.to_string/1
  3. Exploit
    IO.chardata_to_string/1 raises ArgumentError on full list
  4. Install
    Rescue clause calls inspect(list) to build error message
  5. C2
    inspect/1 re-enters charlist branch and raises again
  6. Execute
    Non-tail recursion retains all BEAM stack frames
  7. Impact
    Process heap exhausted, node OOM or process killed

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Recursion depth limits
Exploitation Conditions

The attacker must control the content of a list that reaches inspect/1, List.to_string/1, or List.to_charlist/1 within a running Elixir application. The crafted list must contain more than 4096 consecutive elements that are valid ASCII code points (the default :printable_limit), followed by at least one element that is not a valid Unicode code point - specifically an atom, nil, an integer outside the range 0-0xD7FF or 0xE000-0x10FFFF, or an improper list tail. Lists whose invalid element appears within the first 4096 positions do not trigger the recursive loop because the inner inspect/1 call then classifies the full list in ordinary bracket form and raises a single non-recursive ArgumentError. The CVSS AT:P metric confirms this specific structural precondition. Applications that do not expose user-controlled data to these standard library functions are not affected regardless of Elixir version.

Impact

The provided CVSS 4.0 vector (AV:L/AC:L/AT:P/PR:N/UI:N/VA:H) assigns a local attack vector, reflecting that exploitation requires the ability to pass a controlled list directly into the affected standard library functions. In practice, Phoenix web applications and other network-facing Elixir services frequently call inspect/1 or List.to_string/1 on user-supplied data, which could allow a remote attacker to reach this code path through an application endpoint - this discrepancy between the local vector and real-world deployment patterns should be verified against each application's data flow before dismissing network risk. AT:P correctly captures the specific structural precondition: the list must have more than printable_limit valid code points before the invalid element. No EPSS score was included in the provided intelligence, and the vulnerability does not appear in the CISA KEV catalogue, indicating no confirmed widespread exploitation at time of analysis. The availability impact is high - successful exploitation crashes the targeted process and, without max_heap_size configured, the entire BEAM node - while confidentiality and integrity are unaffected. The 'Information Disclosure' tag present in the source metadata is inconsistent with both the CVSS vector and the technical mechanism; no data exposure pathway is evident, and this tag should be treated as a mis-labelling. No public proof-of-concept code has been identified at time of analysis, though the attack is easily reconstructed from the public description and patch diff.

Exploit ScenarioDerived

An attacker submits a crafted payload to a Phoenix web API endpoint that internally calls List.to_string/1 or inspect/1 on user-provided binary-decoded list data - for example, a list of 4097 valid ASCII byte values (e.g., List.duplicate(?a, 4097) ++ [nil]) - causing IO.chardata_to_string/1 to raise ArgumentError, whose rescue clause recursively re-invokes inspect/1 on the same list, retaining all stack frames until the BEAM process heap is exhausted and the node becomes unresponsive or crashes. No public proof-of-concept code has been identified at time of analysis, though the attack vector is straightforwardly reconstructable from the public advisory and the patch diff committed to the Elixir repository.

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

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

Alert me

AnalysisAIv1 – Aug 28, 2026

Uncontrolled recursion between Elixir's charlist inspection path and the error-message rescue clause in List.to_string/1 and List.to_charlist/1 can exhaust a BEAM node's memory when an attacker controls list data reaching those functions. A crafted list whose printable prefix exceeds the 4096-element printable_limit but which carries an invalid element beyond that threshold bypasses the ASCII classification check, triggers ArgumentError in IO.chardata_to_string/1, and then recurses infinitely through the rescue clause because the inner inspect/1 call is not in tail position - every frame is retained on the process heap. No public exploit has been identified at time of analysis; vendor-released patches are available as Elixir 1.18.5, 1.19.6, and 1.20.4.

RemediationAI

Upgrade to Elixir 1.18.5, 1.19.6, or 1.20.4 according to your active release track; these are the first patched releases as confirmed by the upstream commits at https://github.com/elixir-lang/elixir/commit/1eff1acffd49bdcc0d7f57ca74c1603328eed68a, https://github.com/elixir-lang/elixir/commit/5230d73968f1b4969d2a2646786fa6c71475f5cc, https://github.com/elixir-lang/elixir/commit/a983c8c043b1fbf1d95df78a29149222dac2988c, and https://github.com/elixir-lang/elixir/commit/0bba5887577b1e328da825bd018815fdc519685a. If immediate upgrade is not feasible, applications should validate or truncate list inputs before passing them to inspect/1, List.to_string/1, or List.to_charlist/1, specifically rejecting lists that interleave large printable prefixes with non-code-point elements; this requires application-level schema validation and carries the trade-off of added latency and the risk of legitimate data being rejected if validation logic is overly broad. Enabling BEAM's max_heap_size process option limits blast radius to individual process termination rather than full-node OOM, though it does not prevent repeated exploitation attempts and requires careful tuning to avoid premature kills on memory-intensive legitimate workloads. The full vendor advisory at https://github.com/elixir-lang/elixir/security/advisories/GHSA-jf5q-v438-665c should be consulted for additional guidance.

Affected VersionsENISA

elixir 9718f2b90ce086ff8614d5782f4ec528495c98dd <*
elixir 1.19.0-rc.0 <1.19.6
elixir 1.15.0-rc.0 <1.18.5
elixir 1.20.0-rc.0 <1.20.4

Affected Packages

euvd elixir fix: 1.18.5, 1.19.6, 1.20.4

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 defect lives in the Inspect.List implementation within lib/elixir/lib/inspect.ex (CPE: cpe:2.3:a:elixir-lang:elixir). The charlist classification branch calls List.ascii_printable?/2, which examines only the first :printable_limit (default 4096) elements. A list whose first 4096 elements are valid ASCII code points but whose 4097th or later element is an atom, nil, an integer outside 0-0x10FFFF, or an improper tail passes the printable check and is forwarded to IO.chardata_to_string/1 over the full list. That call raises ArgumentError. The rescue clauses in List.to_string/1 and List.to_charlist/1 construct the error message by string-interpolating inspect(list), re-entering the same Inspect.List charlist branch and triggering the same error. Because the recursive inspect/1 call is an argument to raise rather than a tail call, each level is retained on the BEAM process stack; the heap grows monotonically until the process is killed by max_heap_size or the node runs out of memory. This is a textbook instance of CWE-674 (Uncontrolled Recursion). The upstream fix splits the list at printable_limit before conversion and changes error-message interpolation to inspect(list, charlists: :as_lists), which forces bracket-form rendering and breaks the recursive cycle.

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

AV:N reflects realistic exploitation through network-exposed Elixir applications; AC:H captures the specific list structure requirement; no confidentiality or integrity impact applies.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
SUSE 5.5 MEDIUM
AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Red Hat 6.2 MEDIUM

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Local
Attack Complexity
Low
Attack Requirements
Present
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

DescriptionCVE.org

Uncontrolled Recursion vulnerability in the Elixir standard library allows an attacker who controls a list passed to inspect/1, List.to_string/1, or List.to_charlist/1 to exhaust a BEAM node's memory.

Inspect.List's charlist branch in lib/elixir/lib/inspect.ex classifies a list as a charlist using List.ascii_printable?/2, which examines only the first :printable_limit (4096 by default) elements, and then calls IO.chardata_to_string/1 on the whole term. A list whose printable prefix exceeds that limit but which contains a later element that is not a code point (an atom, an out-of-range integer, or an improper tail) is therefore mis-classified, and the conversion raises ArgumentError. That conversion runs inside List.to_string/1, whose rescue clause builds its message by interpolating inspect(list), which re-enters the same branch and raises again. The nested inspection is an argument to raise, so the recursion is not in tail position and every level is retained: the process stack grows monotonically while each cycle re-walks the list, until the process is killed by max_heap_size or, by default, the node runs out of memory. List.to_charlist/1 has the same rescue shape.

Below the printable limit the inner inspect/1 sees the invalid element within its counter and renders the list in ordinary bracket form, so a single ArgumentError is raised and no recursion occurs.

This issue affects elixir: from 1.15.0-rc.0 before 1.18.5, from 1.19.0-rc.0 before 1.19.6, and from 1.20.0-rc.0 before 1.20.4.

Threat Intelligence Overview

EPSS Score
0.1%
Top 97% exploitable
Prevalence
Medium
popular in fintech and telecom Elixir backends, not mainstream-ubiquitous
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment Vendor GitHub

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.1%
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
Small
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Module for Package Hub 15 SP7 Affected
SUSE Linux Enterprise Module for Package Hub 15 SP6 Affected
openSUSE Leap 15.3 Affected
openSUSE Leap 15.4 Affected
openSUSE Leap 15.5 Affected

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