Description
Uncontrolled Recursion vulnerability in leandrocp mdex allows denial of service via deeply nested Markdown input.

mdex converts between an Elixir %MDEx.Document{} struct and Comrak's internal AST using two mutually recursive Rust functions, ex_document_to_comrak_ast and comrak_ast_to_ex_document, in the NIF source file document.rs. Neither function enforces a maximum nesting depth, so the recursion depth is bounded only by the structure of the input. An attacker who can get a Markdown document rendered (for example through MDEx.parse_document!/1 or MDEx.to_html/1) can supply a document with thousands of nested block quotes, which drives unbounded recursion across the NIF boundary and exhausts the native C stack.

Because the resulting stack overflow is an uncatchable SIGSEGV raised inside a NIF, it cannot be contained by the Erlang runtime. It terminates the operating system process running the BEAM, killing every Elixir and Erlang process on the node, not just the caller that triggered the render. No authentication or special privileges are required.

The vulnerable conversion code was extracted from mdex into the separate mdex_native package starting in mdex 0.12.3. This issue affects mdex from 0.3.0 before 0.12.3 and mdex_native from 0.1.0 before 0.2.3.
Published: 2026-06-29
Score: 6.9 Medium
EPSS: < 1% Very Low
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

An uncontrolled recursion flaw in leandrocp’s mdex allows an attacker to supply a Markdown document with extremely deep nesting of block quotes. The conversion between Elixir structs and Comrak’s AST uses two mutually recursive Rust functions without a depth check, so the native C stack is exhausted, causing an uncatchable SIGSEGV. This terminates the operating system process that hosts the BEAM virtual machine, bringing down every Erlang and Elixir process on the node. The flaw is a classic stack‑overflow denial of service, identified as CWE‑674, and it requires no authentication or special privileges.

Affected Systems

The vulnerability affects the leandrocp mdex library from version 0.3.0 up to, but not including, 0.12.3, and the mdex_native package from 0.1.0 up to, but not including, 0.2.3. Versions newer than those contain the necessary recursion‑depth mitigation implemented in a recent commit.

Risk and Exploitability

With a CVSS score of 6.9 the risk is moderate, but because the crash is uncontainable within the BEAM and the attacker can supply Markdown through any exposed parse or render call, the practical danger is high. The EPSS score is not available and the vulnerability is not listed in the CISA KEV catalog, yet the lack of authentication and the severity of a full node crash make immediate attention warranted. An attacker who can inject Markdown – even via user‑generated content – can trigger an immediate and total denial of service.

Generated by OpenCVE AI on June 29, 2026 at 20:50 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade mdex to 0.12.3 or later and mdex_native to 0.2.3 or later, which include a recursion‑depth guard in the conversion functions.
  • If an update is not immediately possible, validate all Markdown input in the application layer and enforce a reasonable maximum nesting depth before invoking the NIF conversion; reject or truncate documents that exceed this limit.
  • Configure the runtime to restart the BEAM node automatically after a crash and monitor for repeated crashes, ensuring high availability and minimizing downtime.

Generated by OpenCVE AI on June 29, 2026 at 20:50 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 29 Jun 2026 21:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Mon, 29 Jun 2026 19:30:00 +0000

Type Values Removed Values Added
Description Uncontrolled Recursion vulnerability in leandrocp mdex allows denial of service via deeply nested Markdown input. mdex converts between an Elixir %MDEx.Document{} struct and Comrak's internal AST using two mutually recursive Rust functions, ex_document_to_comrak_ast and comrak_ast_to_ex_document, in the NIF source file document.rs. Neither function enforces a maximum nesting depth, so the recursion depth is bounded only by the structure of the input. An attacker who can get a Markdown document rendered (for example through MDEx.parse_document!/1 or MDEx.to_html/1) can supply a document with thousands of nested block quotes, which drives unbounded recursion across the NIF boundary and exhausts the native C stack. Because the resulting stack overflow is an uncatchable SIGSEGV raised inside a NIF, it cannot be contained by the Erlang runtime. It terminates the operating system process running the BEAM, killing every Elixir and Erlang process on the node, not just the caller that triggered the render. No authentication or special privileges are required. The vulnerable conversion code was extracted from mdex into the separate mdex_native package starting in mdex 0.12.3. This issue affects mdex from 0.3.0 before 0.12.3 and mdex_native from 0.1.0 before 0.2.3.
Title Uncontrolled recursion over deeply nested Markdown crashes the BEAM in mdex
First Time appeared Leandrocp
Leandrocp mdex
Leandrocp mdex Native
Weaknesses CWE-674
CPEs cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*
cpe:2.3:a:leandrocp:mdex_native:*:*:*:*:*:*:*:*
Vendors & Products Leandrocp
Leandrocp mdex
Leandrocp mdex Native
References
Metrics cvssV4_0

{'score': 6.9, 'vector': 'CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N'}


Subscriptions

Leandrocp Mdex Mdex Native
cve-icon MITRE

Status: PUBLISHED

Assigner: EEF

Published:

Updated: 2026-06-30T04:37:59.369Z

Reserved: 2026-06-16T10:47:13.915Z

Link: CVE-2026-54888

cve-icon Vulnrichment

Updated: 2026-06-29T20:47:45.481Z

cve-icon NVD

No data.

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-07-01T10:03:46Z

Weaknesses