Read the docs
TI-2026-53033 Aliases CVE-2026-75758

Unbounded recursion between Inspect.List charlist rendering and List.to_string/1 error path in Elixir

Priority MEDIUM 60CWE-674Published · Updated

Key facts

Attack vector
Local
Privileges required
None
User interaction
None
Attack complexity
Low
Attack requirements
Present
Impact type
Denial of service
Confidentiality · integrity · availability
None · None · High
Fix status
Partial Red Hat: 2 without a fix

Attack profile from CVSS 4.0 · CNA. Fix status from CNA and Red Hat. Impact type from CWE-674.

Summary

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.

Why it matters now

Exploitation Proof of concept CISA SSVC · not in CISA KEV
EPSS 0.0018 7th percentileScored 2026-11-07
Fix Partial elixir (elixir-lang): 1.18.5, 1.19.6, 1.20.4Red Hat: 2 without a fix

SSVC decision points

CISA ADP · SSVC 2.0.3

Exploitation
Poc
Automatable
No
Technical impact
Partial

The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.

Affected products

VendorProductAffected versionsFixed inStatusSource
elixir-langelixir1.15.0-rc.0 to before 1.18.5; 1.19.0-rc.0 to before 1.19.6; 1.20.0-rc.0 to before 1.20.41.18.5, 1.19.6, 1.20.4Patch availableCNA
  • elixir Vendorelixir-lang Affected 1.15.0-rc.0 to before 1.18.5; 1.19.0-rc.0 to before 1.19.6; 1.20.0-rc.0 to before 1.20.4 Fixed in 1.18.5, 1.19.6, 1.20.4 Patch available CNA

CPE names CNA · 1

CPEVersionsRoleVendor
cpe:2.3:a:elixir-lang:elixir:*:*:*:*:*:*:*:*———
  • cpe:2.3:a:elixir-lang:elixir:*:*:*:*:*:*:*:* Versions — — ·—

Remediation

  • Fix · CNA elixir (elixir-lang) Fixed in 1.18.5, 1.19.6, 1.20.4

Vendor assessments

Red Hat

Red Hat rating: Moderate. Red Hat's page for this CVE →

ProductStatusPlan or fix
Red Hat OpenStack Platform 16.2Affected—
Red Hat OpenStack Platform 17.1Affected—
Not affected: 1 product
  • Red Hat OpenStack Platform 18.0

Timeline

  1. 2026-10-02 Threatist record created from CVE-2026-75758
  2. 2026-10-16 Affected versions changed · Red Hat

References

  • TI-2026-82969 Elixir JSON.decode lets huge integers exhaust CPU and memory CVSS 4.0MEDIUM 6.9
  • TI-2026-82968 Unbounded port parsing in Elixir URI.parse/1 enables CPU exhaustion CVSS 4.0MEDIUM 6.3
  • TI-2026-82970 Insecure temporary file in Mix deps.partition enables code execution CVSS 4.0MEDIUM 5.4
  • TI-2026-36671 Unbounded integer parsing in the Version module enables CPU and memory exhaustion denial of service CVSS 4.0MEDIUM 5.1

Sources