highVulnerability

CVE-2026-83609

## Summary An embedded line terminator bypasses xmldom's always-on, WHATWG-mandated creation-time name validation. `createElementNS`, `createAttributeNS`, `createDocumentType`, and `createAttribute` should reject a malformed qualified name with `InvalidCharacterError`, but a name whose first line is well-formed slips through and enters the DOM. On serialization it is emitted verbatim, so the characters after the line terminator inject markup into the output. The injection reaches the default serialization path, and enabling `requireWellFormed` does not prevent it. ## Details `createElementNS`, `createAttributeNS`, and `createDocumentType` route through `validateQualifiedName`, and `createAttribute` performs the analogous check; each validates the name with `g.QName_exact.test(name)`. `QName_exact = reg('^', QName, '$')` inherits the `m` flag from xmldom's shared regexp builder, so the matcher accepts any name whose first line is a valid `QName` and leaves the remaining lines unconstrained (see Root Cause). ### Root Cause 1. A shared regexp builder compiles anchored productions with the `m` flag. 2. `^…$` under `m` are line anchors, not string anchors. 3. `validateQualifiedName` / `createAttribute` validate with `.test()` against such a production, so a line terminator followed by breakout markup passes and the malformed name is stored. The triggering line terminators are the ECMAScript `LineTerminator` set: U+000A, U+000D, U+2028, U+2029. ## Proof of Concept ```js const { DOMImplementation, XMLSerializer } = require('@xmldom/xmldom'); const impl = new DOMImplementation(); const doc = impl.createDocument('urn:x', 'root', null); const el = doc.createElementNS('urn:x', 'a\n><script>x</script'); // ACCEPTED (no throw) doc.documentElement.appendChild(el); // DEFAULT serialization — requireWellFormed NOT set: console.log(new XMLSerializer().serializeToString(doc)); // Observed: <root xmlns="urn:x"><a // ><script>x</script/></root> <-- injected eleme

Properties

ghsa_id
GHSA-3px3-54cx-rmw9
summary
xmldom: Creation-time XML Name/QName validation is bypassable via an embedded line terminator, allowing injection on the default serialization path
severity
high
epss_score
0.00326
cve_id
CVE-2026-83609
is_ghsa_only
false
ghsa_published
2026-09-08T21:02:33Z
source_url
https://github.com/advisories/GHSA-3px3-54cx-rmw9
epss_percentile
0.2532
ghsa_updated
2026-09-08T21:02:34Z

Related Entities (6)

ENRICHED_BY (1)

[Source]FIRST EPSS

HAS_WEAKNESS (2)

[Weakness]XML Injection (aka Blind XPath Injection)
[Weakness]Permissive Regular Expression

REPORTED_BY (1)

[Source]GitHub Advisory Database

AFFECTS (1)

[Software]npm/@xmldom/xmldom

VULNERABLE_TO (1)

[Software]npm/@xmldom/xmldom

Explore deeper with Ninja Signal's threat intelligence graph

CVE-2026-83609 — Ninja Signal Threat Intelligence | Ninja Signal