xmldom: Creation-time XML Name/QName validation is bypassable
Applications using vulnerable xmldom releases can let attackers insert unwanted markup into generated XML. If that output enters a web page, attacker-supplied code can run in visitors' browsers.
- Severity
- HighCVSS 4.0 · 8.7
- Fix
- Fixed in 0.9.12Fix recorded 2 days ago
- Affected versions
- 0.9.0 or newer, but before 0.9.12
- Weakness
- CWE-91XML Injection
- Exploit likelihood
- 0.33% in 30 daysEPSS, higher than 25% of known flaws
- Affects
- xmldom
How it works
- An application first passes attacker-controlled text into an affected element, attribute, or document-type naming function.
- The attacker places a line break after a valid first line, followed by unwanted markup. xmldom checks the valid line but accepts and stores the entire name.
- Converting the XML structure back to text then includes the unwanted markup unchanged.
- The stricter output option does not prevent this.
What to do
Run npm list @xmldom/xmldom inside the application directory and inspect nested copies. A result from 0.9.0 through 0.9.11 means vulnerable code is installed. Actual exposure also requires untrusted text to reach an affected name-creation function and the resulting XML structure to be serialized. This result does not prove the flaw was exploited.
Run this in the application environment you want to check:
npm list @xmldom/xmldomMove every affected copy to the patched 0.9.12 release using the project's existing dependency process. Then repeat the version check and confirm no copy from 0.9.0 through 0.9.11 remains.
Technical details
A shared regular expression incorrectly used multiline matching. QName validation could therefore approve a valid first line while ignoring attacker-controlled text after a line break. The affected creation functions stored the entire name. XMLSerializer then emitted it unchanged on both the default path and with requireWellFormed: true.
Cross-site scripting is possible when an application places the serialized output into HTML.
Severity breakdown
- Attack vector Network Requires network access to the vulnerable service
- Attack complexity Low No extra steps to bypass built-in attack protections
- Required conditions None No particular deployment or execution condition is required
- Privileges required None Attacker needs no account or login
- User action None No action by another user is required
- Vulnerable system: Data exposure None No data disclosure
- Vulnerable system: Data changes High Protected data can be changed with serious impact
- Vulnerable system: Service disruption None No availability impact
- Other systems: Data exposure None No additional impact beyond the vulnerable system
- Other systems: Data changes None No additional impact beyond the vulnerable system
- Other systems: Service disruption None No additional impact beyond the vulnerable system
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X Open in FIRST.org calculatorReferences
- github.com · 0.9.12 (tag) x_refsource_MISC patch release notes
- github.com · GHSA-3px3-54cx-rmw9 vendor advisory x_refsource_CONFIRM
- cve.org · CVERecord vdb entry
- nvd.nist.gov · CVE-2026-83609 us government resource vdb entry
- tenable.com · CVE-2026-83609 third party advisory vdb entry
- cvefeed.io · CVE-2026-83609 third party advisory vdb entry
- osv.dev · CVE-2026-83609 vdb entry
- euvd.enisa.europa.eu · EUVD-2026-69220 vdb entry
- github.com · PR #1071 x_refsource_MISC GitHub Advisory
- github.com · commit 7b2ec67 x_refsource_MISC GitHub Advisory