All vulnerabilities
CVE-2026-63430GHSA-9jh8-v38h-cvhrRUSTSEC-2026-0193

ammonia: mXSS via MathML `annotation-xml` encoding strip

rust-ammonia ammoniarustLibraries & packages
CVSS
6.3Medium
ExploitationPublic exploit codeCISA's assessment says proof of concept code is public, assessed 15 Oct 2026. Not in the KEV catalogCISA via CVE List
Exploit odds (EPSS)0.55%Chance of exploitation activity in the next 30 days, higher than 45% of CVEs. Scored 23 Oct 2026FIRST EPSS
Fixed in3.3.2Also 4.0.2, 4.1.3GitHub
Published15 Oct 2026Updated 22 Oct 2026CVE List

What fixes it

  • 3.3.2ammonia, rustGitHub
  • 4.0.2ammonia, rustGitHub
  • 4.1.3ammonia, rustGitHub
  • 3.3.2ammonia, crates.ioOSVcargo update -p ammonia --precise 3.3.2
  • 4.0.2ammonia, crates.ioOSVcargo update -p ammonia --precise 4.0.2
  • 4.1.3ammonia, crates.ioOSVcargo 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:

  1. User writes code like <math><annotation-xml encoding="text/html"><gadget></annotation-xml></math>.
  2. Namespace filtering checks the DOM, and it passes. <gadget> is parsed as HTML.
  3. 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.
  4. 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