Listen to this Post
The `mistune.math` plugin renders inline ($...$) and block ($$...$$) math by directly concatenating raw user input into the HTML output. This happens even when the `escape=True` flag is set—a flag that normally guarantees all user-controlled text is escaped. The core issue is in src/mistune/plugins/math.py:
def render_inline_math(renderer, text):
return r'<span class="math">(' + text + r")</span>"
def render_block_math(renderer, text):
return '
<div class="math">$$\n' + text + "\n$$</div>
\n"
Neither function calls mistune.util.escape(text), checks renderer._escape, nor applies any other sanitisation. The `escape=True` flag is only honoured by the main `HTMLRenderer` methods (paragraphs, headings, codespan, etc.), while plugin renderers registered via `md.renderer.register()` receive the renderer instance but have no enforcement mechanism—they must opt‑in manually, and `math.py` does not.
Exploitation is trivial:
- Baseline (escape works) – `”“` is correctly escaped to `<script>…`
– Bypass – the same payload wrapped inside `$…$` ($<script>alert(document.cookie)</script>$) is emitted raw, producing a live `$` → executes script
- `$$$$` → triggers `onerror`
- `$click$` → creates a malicious link
No further tricks or XSS filters are needed—the markdown parser outputs the payload unescaped.Protection from this CVE
- Upgrade to a fixed version – the maintainer has released a patch (e.g., commit that adds `escape()` calls in the math plugin).
- Manual workaround – subclass the math plugin and override `render_inline_math` / `render_block_math` to call
mistune.util.escape(text). - Avoid using the math plugin unless you have audited its output and are applying your own sanitisation.
- Content Security Policy (CSP) – a strict CSP (e.g.,
script-src 'self') can block inline script execution but does not mitigate all XSS variants (e.g., event handlers). - Input validation – block or escape any user input that contains math delimiters with raw HTML inside.
Impact
| Dimension | Assessment |
||-|
| Confidentiality | Attacker can exfiltrate session cookies, auth tokens, and any data visible to the victim’s browser session |
| Integrity | Attacker can mutate page content, inject phishing forms, redirect the user, or perform authenticated actions |
| Availability | Attacker can crash or freeze the page (denial‑of‑service to the user) |
Risk amplifier – Developers who have audited their application and confirmed `escape=True` is set believe they have XSS protection. This vulnerability silently invalidates that assumption for every math‑enabled parser instance, making it likely to be missed in code reviews and security audits.🎯Let’s Practice Exploiting & Learn Patching For Free:
Sources:
Reported By: github.com
Extra Source Hub:
Undercode🔐JOIN OUR CYBER WORLD [ CVE News • HackMonitor • UndercodeNews ]
📢 Follow DailyCVE & Stay Tuned:

