ammonia: mXSS via MathML `annotation-xml` encoding strip
What fixes it
- 3.3.2ammonia, rustGitHub
- 4.0.2ammonia, rustGitHub
- 4.1.3ammonia, rustGitHub
- 3.3.2ammonia, crates.ioOSV
cargo update -p ammonia --precise 3.3.2 - 4.0.2ammonia, crates.ioOSV
cargo update -p ammonia --precise 4.0.2 - 4.1.3ammonia, crates.ioOSV
cargo update -p ammonia --precise 4.1.3
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
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.
[elements]: https://github.com/servo/html5ever/blob/045a0378f2b0f8d4a350793899cf722a2a9b3d11/html5ever/src/tree_builder/rules.rs
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.
Text from GitHub Advisory Database
Affected versions 9
- ammonia, rust< 3.3.2GitHub
- ammonia, rust>= 4.0.0, < 4.0.2GitHub
- ammonia, rust>= 4.1.0, < 4.1.3GitHub
- ammoniaaffected: < 3.3.2CVE List
- ammoniaaffected: >= 4.0.0, < 4.0.2CVE List
- ammoniaaffected: >= 4.1.0, < 4.1.3CVE List
- ammonia, crates.iofrom first release, fixed in 3.3.2OSV
- ammonia, crates.iofrom 4.0.0, fixed in 4.0.2OSV
- ammonia, crates.iofrom 4.1.0, fixed in 4.1.3OSV
References 14
- github.com/rust-ammonia/ammonia/commit/004bf2cee4288f74a6ee619d589e3e90c24c09caFixvia CVE List
- github.com/rust-ammonia/ammonia/commit/7ac3fd3145236f28857eeecbadb544c8659cba31Fixvia CVE List
- github.com/rust-ammonia/ammonia/commit/b51bf4f9749ed3cd518330105f20a2c39c9ee274Fixvia CVE List
- github.com/rust-ammonia/ammonia/releases/tag/v3.3.2Fixvia CVE List
- github.com/rust-ammonia/ammonia/releases/tag/v4.0.2Fixvia CVE List
- github.com/rust-ammonia/ammonia/releases/tag/v4.1.3Fixvia CVE List
- rustsec.org/advisories/RUSTSEC-2026-0193.htmlAdvisoryvia CVE List
- github.com/advisories/GHSA-9jh8-v38h-cvhrAdvisoryvia GitHub
- github.com/rust-ammonia/ammonia/security/advisories/GHSA-9jh8-v38h-cvhrExploitvia CVE List
- nvd.nist.gov/vuln/detail/CVE-2026-63430Referencevia GitHub
- github.com/rust-ammonia/ammonia/pull/243Referencevia CVE List
- github.com/rust-ammonia/ammonia/pull/244Referencevia CVE List
- github.com/rust-ammonia/ammonia/pull/245Referencevia CVE List
- ivan09999.github.io/ammonia-mxssReferencevia CVE List