CVE-2026-63430 — ammonia
Fix: rust-ammonia/ammonia@004bf2cCVE-2026-63430 is a Cross-site Scripting (XSS) vulnerability in ammonia. A fix is available for ammonia — see the affected versions and patch details below.
ammonia: mXSS in ammonia via MathML `annotation-xml` encoding strip
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
Exploitation and automatability from CISA’s SSVC triage for CVE-2026-63430.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
Real-World Exposure
ammonia🦀ammonia🦀ammoniaReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects crates.io packages — download data is not available via public APIs for these ecosystems.
Description
If a certain set of MathML tags are enabled, an attacker can inject arbitrary JavaScript code into the user's browser.
The annotation-xml tag has slightly different behavior than the other "integration point"
tags in MathML and SVG, but ammonia didn't handle it, so it didn't correctly
strip the namespace-incompatible tags.
This vulnerability only has an effect when the math and annotation-xml tags
are both enabled, but the encoding attribute is disabled, because it relies
on the following sequence of steps:
- User writes code like
<math><annotation-xml encoding="text/html"><gadget></annotation-xml></math>. - Namespace filtering checks the DOM, and it passes.
<gadget>is parsed as HTML. - Attribute filter strips it down to
<math><annotation-xml><gadget></annotation-xml></math>. Because the encoding attribute is gone,<gadget>is now parsed as MathML. - The gadget is written in such a way that it exploits the parsing differences between HTML and MathML.
Additionally, the gadget can only be written using a tag that is parsed as raw text in HTML. These elements are:
- title
- textarea
- xmp
- iframe
- noembed
- noframes
- plaintext
- noscript
- style
- script
Applications that do not explicitly allow any of these tags should not be affected, since none are allowed by default.
Impact
Low: Requires both MathML and at least one raw-text HTML tag to be enabled, and most websites don't enable either of those.
Patches
- https://github.com/rust-ammonia/ammonia/pull/245 (released in 4.1.3)
- https://github.com/rust-ammonia/ammonia/pull/244 (released in 4.0.2)
- https://github.com/rust-ammonia/ammonia/pull/243 (released in 3.3.2)
Workarounds
Call <code>builder.add_clean_content_tags("annotation-xml")</code> to remove the annotation-xml element and all of its children, including the XSS gadget.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🦀crates.io | ammonia | all versions | 3.3.2cargo update -p ammonia --precise 3.3.2 |
| 🦀crates.io | ammonia | ≥ 4.0.0&&< 4.0.2 | 4.0.2cargo update -p ammonia --precise 4.0.2 |
| 🦀crates.io | ammonia | ≥ 4.1.0&&< 4.1.3 | 4.1.3cargo update -p ammonia --precise 4.1.3 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for ammonia, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update ammonia to 3.3.2 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-63430 is resolved across your whole dependency graph.
Workarounds
Escape or sanitise the affected output on the server side rather than relying on client-side filtering, and add a Content-Security-Policy that blocks inline script execution so injected markup cannot run even if it reaches the page.
Frequently Asked Questions
Is CVE-2026-63430 in your dependencies?
Find it across crates.io, including transitive dependencies.