GHSA-jmr7-xgp7-cmfj CVE-2026-26278
fast-xml-parser affected by DoS through entity expansion in DOCTYPE (no expansion limit)
- Severity
- 7.5 / 10
- High · CVSS 3.1
- Exploit chance (EPSS)
- 0.94%
- Chance of exploitation in the next 30 days. Higher than 60.87% of scored vulnerabilities.
- Known exploited
- No
- Not in CISA's catalog
- Weakness
- CWE-776 Improper Restriction of Recursive Entity References in DTDs ('XML Entity Expansion')
- Fix
4.5.4- Upgrade fast-xml-parser to this version or later
Description
Summary
The XML parser can be forced to do an unlimited amount of entity expansion. With a very small XML input, it’s possible to make the parser spend seconds or even minutes processing a single request, effectively freezing the application.
Details
There is a check in DocTypeReader.js that tries to prevent entity expansion attacks by rejecting entities that reference other entities (it looks for & inside entity values). This does stop classic “Billion Laughs” payloads.
However, it doesn’t stop a much simpler variant.
If you define one large entity that contains only raw text (no & characters) and then reference it many times, the parser will happily expand it every time. There is no limit on how large the expanded result can become, or how many replacements are allowed.
The problem is in replaceEntitiesValue() inside OrderedObjParser.js. It repeatedly runs val.replace() in a loop, without any checks on total output size or execution cost. As the entity grows or the number of references increases, parsing time explodes.
Relevant code:
DocTypeReader.js (lines 28–33): entity registration only checks for &
OrderedObjParser.js (lines 439–458): entity replacement loop with no limits
PoC
const { XMLParser } = require('fast-xml-parser');
const entity = 'A'.repeat(1000);
const refs = '&big;'.repeat(100);
const xml = `<!DOCTYPE foo [<!ENTITY big "${entity}">]><root>${refs}</root>`;
console.time('parse');
new XMLParser().parse(xml); // ~4–8 seconds for ~1.3 KB of XML
console.timeEnd('parse');
// 5,000 chars × 100 refs takes 200+ seconds
// 50,000 chars × 1,000 refs will hang indefinitely
Impact
This is a straightforward denial-of-service issue.
Any service that parses user-supplied XML using the default configuration is vulnerable. Since Node.js runs on a single thread, the moment the parser starts expanding entities, the event loop is blocked. While this is happening, the server can’t handle any other requests.
In testing, a payload of only a few kilobytes was enough to make a simple HTTP server completely unresponsive for several minutes, with all other requests timing out.
Workaround
Avoid using DOCTYPE parsing by processEntities: false option.
Affected versions
npm
| Package | Vulnerable | Fixed in |
|---|---|---|
| fast-xml-parser | >= 4.1.3, < 4.5.4 |
4.5.4 |
| fast-xml-parser | >= 5.0.0, < 5.3.6 |
5.3.6 |
| fast-xml-parser | >= 4.1.3, < 4.5.4 |
4.5.4 |
| fast-xml-parser | >= 5.0.0, < 5.3.6 |
5.3.6 |
How to fix
Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.
fast-xml-parser npm → 4.5.4
- npm
npm install fast-xml-parser@4.5.4- yarn
yarn add fast-xml-parser@4.5.4- pnpm
pnpm add fast-xml-parser@4.5.4
Severity breakdown
CVSS 3.1 7.5
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- Attack vector
- Network
- Attack complexity
- Low
- Privileges required
- None
- User interaction
- None
- Scope
- Unchanged
- Confidentiality
- None
- Integrity
- None
- Availability
- High
Weakness
CWE-776: Improper Restriction of Recursive Entity References in DTDs ('XML Entity Expansion')
The product uses XML documents and allows their structure to be defined with a Document Type Definition (DTD), but it does not properly control the number of recursive definitions of entities.
How to prevent it
- Operation: If possible, prohibit the use of DTDs or use an XML parser that limits the expansion of recursive DTD entities.
- Implementation: Before parsing XML files with associated DTDs, scan for recursive entity declarations and do not continue parsing potentially explosive content.
References
Advisories
Fixes and patches
Packages
Other links
- github.com/NaturalIntelligence/fast-xml-parser/releases/tag/v5.3.6
- access.redhat.com/errata/RHSA-2026:40984
- access.redhat.com/errata/RHSA-2026:41941
- access.redhat.com/errata/RHSA-2026:41944
- access.redhat.com/errata/RHSA-2026:51349
- access.redhat.com/errata/RHSA-2026:6174
- access.redhat.com/errata/RHSA-2026:6802
- access.redhat.com/errata/RHSA-2026:7110
- access.redhat.com/errata/RHSA-2026:7128
- access.redhat.com/security/cve/CVE-2026-26278
- bugzilla.redhat.com/show_bug.cgi
- security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-26278.json
Timeline
- Published
- Last updated by the source
- Latest EPSS score
Related advisories
| Advisory | Severity | Why it's related |
|---|---|---|
| GHSA-8r6m-32jq-jx6q fast-xml-parser: Repeated DOCTYPE declarations reset entity expansion limits | High | Also affects fast-xml-parser |
| GHSA-gh4j-gqv2-49f6 fast-xml-parser XMLBuilder: XML Comment and CDATA Injection via Unescaped Delimiters | Medium | Also affects fast-xml-parser |
| GHSA-jp2q-39xq-3w4g Entity Expansion Limits Bypassed When Set to Zero Due to JavaScript Falsy Evaluation in fast-xml-parser | Medium | Also affects fast-xml-parser |
| GHSA-8gc5-j5rx-235r fast-xml-parser affected by numeric entity expansion bypassing all entity expansion limits (incomplete fix for CVE-2026-26278) | High | Also affects fast-xml-parser |
| GHSA-fj3w-jwp8-x2g3 fast-xml-parser has stack overflow in XMLBuilder with preserveOrder | Low | Also affects fast-xml-parser |
| GHSA-m7jm-9gc2-mpf2 fast-xml-parser has an entity encoding bypass via regex injection in DOCTYPE entity names | Critical | Also affects fast-xml-parser |
| GHSA-37qj-frw5-hhjh fast-xml-parser has RangeError DoS Numeric Entities Bug | High | Also affects fast-xml-parser |
| GHSA-mpg4-rc92-vx8v fast-xml-parser vulnerable to ReDOS at currency parsing | High | Also affects fast-xml-parser |
Credits: ByamB4, yuezk
MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.
Check your repos with MergeHarbor