Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconCraft list: 4096+ valid code points then nil or atom
-
DeliverySubmit via application endpoint calling List.to_string/1
-
ExploitIO.chardata_to_string/1 raises ArgumentError on full list
-
InstallRescue clause calls inspect(list) to build error message
-
C2inspect/1 re-enters charlist branch and raises again
-
ExecuteNon-tail recursion retains all BEAM stack frames
-
ImpactProcess 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
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
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
AV:N reflects realistic exploitation through network-exposed Elixir applications; AC:H captures the specific list structure requirement; no confidentiality or integrity impact applies.
AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
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
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.
Unbounded recursion in the Elixir `protobuf` Hex package (versions >= 0.8.0, < 0.16.1) lets unauthenticated remote attac
Improper JWT signature verification in Dashbit's nimble_zta (0.1.2 up to but not including 0.1.3) lets an unauthenticate
Session-swapping authentication bypass in the Elixir library AshAuthentication (versions 4.10.0 before 4.15.0 and 5.0.0-
Authentication bypass in the Elixir library ash_authentication lets an attacker who operates one federated identity-prov
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
Server-Side Request Forgery protection bypass in the Elixir safeurl library (versions 0.1.0 and later) allows unauthenti
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
Unauthenticated remote denial of service in the Elixir HTTP server Bandit (mtrudel/bandit) from 0.1.0 before 1.14.0 lets
Unauthenticated remote attackers can consume disproportionate server CPU on Bandit (mtrudel/bandit, Elixir/Erlang) by se
Memory-exhaustion denial of service in the elixir-protobuf library (protobuf) from 0.8.0 onward allows an unauthenticate
Atom table exhaustion in the Ash framework (Elixir) allows an unauthenticated remote attacker to crash a BEAM node by su
Same weakness CWE-674 – Uncontrolled Recursion
View allSame technique Information Disclosure
View allVendor 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 |
| openSUSE Leap 15.6 | Affected |
EUVD-2026-67707
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB