Skip to main content

libexpat EUVDEUVD-2026-104922

| CVE-2026-113351 HIGH
Missing Initialization of Resource (CWE-909)
2026-10-20 VulnCheck GHSA-6r6q-9jmv-gg3h
8.2
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach service reusing one expat parser
  2. Exploit
    Submit single oversized XML document
  3. Execution
    Allocation counter stays inflated after reset
  4. Impact
    Subsequent documents rejected with XML_ERROR_NO_MEMORY

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Missing initialization of resource
Exploitation Conditions

Exploitation requires that the consuming application reuse a single XML_Parser across multiple documents by calling XML_ParserReset() instead of allocating a fresh parser per document, and that libexpat be built with its allocation/amplification accounting enabled (XML_GE==1, the default) - the vulnerable code path is the m_alloc_tracker.bytesAllocated counter that reset fails to offset. Limiting factors: applications that create a new parser for each document are not affected; the impact is confined to the affected parser instance and is fully recoverable by destroying and recreating it; and no authentication or user interaction is needed (PR:N/UI:N) once a reusing service is reachable over the network.

Impact

The CVSS 4.0 base score is 8.2 (High), driven entirely by availability impact (VA:H) with no confidentiality or integrity impact and no scope change - consistent with a pure denial-of-service bug. The vector shows network reachability (AV:N), low complexity (AC:L), no privileges (PR:N) and no user interaction (UI:N), but critically includes AT:P, a present attack requirement: exploitation depends on the target application reusing a single parser across documents via XML_ParserReset() rather than creating a fresh parser each time. This AT:P condition is the dominant risk discriminator and tempers the otherwise-remote-unauthenticated profile. Exploitation signals are weak-to-absent: there is no CISA KEV listing and no public exploit identified, so this is not confirmed to be actively exploited; EPSS and SSVC data were not provided in the input and cannot be cited. The impact is also recoverable - the application can restore service by destroying and recreating the parser - so the 'high availability' rating reflects sustained failure only within a long-lived, reused parser instance rather than a full system crash. Net: this is a legitimate but conditional DoS that matters most for long-running services that pool/reuse expat parsers; it is a patch-on-schedule issue rather than an emergency, and the high base score overstates universal real-world risk because of the parser-reuse precondition.

Exploit ScenarioDerived

An attacker sends a single large XML document to a network service that reuses one libexpat parser across requests via XML_ParserReset(). Because the reset zeroes the direct byte count but never offsets the tracked heap allocation total, the inflated allocation counter persists, and every subsequent document the attacker or legitimate users submit fails with XML_ERROR_NO_MEMORY until the service recreates the parser. No public exploit code was identified, but the trigger is trivial - one oversized well-formed document.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.5% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 20, 2026

Denial of service in libexpat 2.7.2 through 2.9.0 lets a remote attacker render a reused XML parser permanently unusable for subsequent documents: XML_ParserReset() clears the direct byte counter but never offsets the tracked heap allocations (m_alloc_tracker.bytesAllocated) accumulated by the previous document, so a large XML document followed by a reset causes the next document on that parser to fail with XML_ERROR_NO_MEMORY until the parser object is destroyed and recreated. Only services that keep one parser alive across documents via XML_ParserReset() and link an XML_GE==1 build (the default) are affected; applications that allocate a fresh parser per document are not. Exploitation requires a non-default reuse pattern (assessed CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H), impact is limited to availability with no confidentiality or integrity loss, and no public exploit code or in-the-wild activity was identified at time of analysis; a vendor fix exists in upstream PR #1431.

RemediationAI

Apply the upstream fix referenced in the advisory: update to a libexpat release containing upstream PR #1431 (https://github.com/libexpat/libexpat/pull/1431), which introduces the bytesAllocatedWhenLastReset baseline and subtracts it in expat_heap_increase_tolerable - note that this reference is a pull request/commit, so confirm the patch is present in the exact tagged version you deploy rather than assuming a patched release number, and rebuild all statically vendored copies. Where an immediate upgrade is not possible, the most effective compensating control is architectural: stop reusing parsers across documents - replace each XML_ParserReset() call with XML_ParserFree() followed by XML_ParserCreate() so the allocation tracker starts from a clean baseline, at the cost of a small per-document allocation overhead and code changes wherever reset is used. A second option is to reject or cap oversized documents (and cap cumulative bytes per connection/tenant) so a single large request cannot push the shared tracker high enough to starve later parses, though this is a partial mitigation because the residual counter still accumulates across resets. Building with XML_GE=0 removes the vulnerable accounting path, but it also disables expat's billion-laughs amplification protection and re-exposes the service to entity-expansion denial of service, so it is not recommended for internet-facing XML ingestion. Finally, treat the condition as recoverable rather than catastrophic: applications should detect XML_ERROR_NO_MEMORY from a reused parser and transparently recreate it, which restores service without restarting the process. Details and patch links: https://github.com/libexpat/libexpat/pull/1431 and https://www.vulncheck.com/advisories/libexpat-2.7.2-through-2.9.0-denial-of-service-via-xml-parserreset.

Affected VersionsENISA

libexpat 2.7.2 ≤2.9.0

Affected Packages

euvd libexpat no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw lives in expat's allocation accounting (XML_GE / general-entity protection) subsystem inside expat/lib/xmlparse.c. In XML_GE==1 builds expat maintains an m_alloc_tracker that accumulates bytesAllocated so that parserCreate/expat_heap_increase_tolerable can enforce the billion-laughs amplification factor and activation threshold defaults (EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_*). XML_ParserReset() re-initializes the parser through parserInit(), which historically did a memset of both the ACCOUNTING and ENTITY_STATS structs and reset countBytesDirect/countBytesIndirect - but the tracked heap bytesAllocated kept growing across the reset boundary, so a large first document permanently skewed the accounting statistics for every later document parsed on that same parser, driving the amplification/heap guard to fail closed with XML_ERROR_NO_MEMORY. This is a resource-state lifecycle defect (CWE-909, Missing Initialization of Resource): per-document state that should be re-based on reset is instead carried forward. The upstream patch (PR #1431) adds a bytesAllocatedWhenLastReset field to the accounting struct, subtracts that baseline inside expat_heap_increase_tolerable before the overflow and amplification checks, and makes parserInit() accept an isReset flag so a reset clears only counts and per-document entity stats while preserving the configured debugLevel, maximumAmplificationFactor and activationThresholdBytes; XML_ParserReset() then snapshots the current bytesAllocated. Regression tests test_amplification_reset_neutrality and test_alloc_tracker_reset_neutrality confirm a parser behaves identically before and after reset. Consumers of libexpat include HTTP servers, SOAP/XML-RPC stacks, SAML implementations and many language bindings, so the vulnerable code is typically reached indirectly rather than by direct libexpat users.

Know when Libexpat gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (VulnCheck) PRIMARY 8.2 HIGH
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
vuln.today AI 5.9 MEDIUM

Network-reachable and unauthenticated, but AC:H because exploitation depends on the non-default parser-reuse-via-reset pattern; only availability of the reused parser is affected (A:H), no C/I impact.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Red Hat 5.9 MEDIUM

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

libexpat 2.7.2 through 2.9.0 contains a denial of service vulnerability because XML_ParserReset zeroes the direct byte count but never offsets tracked heap allocations. Attackers can submit a large XML document so later documents on the same reset parser fail with XML_ERROR_NO_MEMORY until it is recreated.

Executive ViewAI

Why It Matters

libexpat versions 2.7.2 through 2.9.0 contain a denial-of-service flaw that can permanently break a reused XML parser, causing every subsequent document on that parser to fail with an out-of-memory error until the parser is destroyed. Only services that deliberately keep a single parser alive across documents via XML_ParserReset() on a default memory-tracking build are exposed; typical applications that create a fresh parser per document are not affected. Leadership should care because impacted XML-processing services can be silently degraded after handling a single large document, disrupting availability of integrations and data feeds even though no data is exposed or altered.

Business Impact: Medium
Compensating Controls

Apply vendor patch. Until patched, stop reusing parsers across documents: allocate a fresh parser per document or destroy and recreate the parser object after each document rather than calling XML_ParserReset(), and monitor XML services for XML_ERROR_NO_MEMORY bursts as an early indicator.

Threat Intelligence Overview

EPSS Score
0.5%
Top 60% exploitable
Prevalence
Ubiquitous
expat is a core XML parser bundled across Linux distros, Python, and browsers
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment Vendor GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
Medium
Technical Impact
Partial

Priority Score

41
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +41
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

CVE-2022-25315 CRITICAL POC
9.8 Feb 18

In Expat (aka libexpat) before 2.4.5, there is an integer overflow in storeRawNames. Rated critical severity (CVSS 9.8),

CVE-2025-59375 HIGH POC
7.5 Sep 15

libexpat in Expat before 2.7.2 allows attackers to trigger large dynamic memory allocations via a small document that is

CVE-2019-15903 HIGH POC
7.5 Sep 04

In libexpat before 2.2.8, crafted XML input could fool the parser into changing from DTD parsing to document parsing too

CVE-2026-115506 HIGH POC
8.7 Oct 22

CPU exhaustion in libexpat through 2.9.0 lets remote attackers stall XML parsing workloads by supplying a moderately siz

CVE-2026-93990 HIGH POC
8.7 Sep 19

Malformed UTF-16 decoding in libexpat through 2.8.4 lets remote attackers hide XML markup from the parser: a lone high s

CVE-2022-43680 HIGH POC
7.5 Oct 24

In libexpat through 2.4.9, there is a use-after free caused by overeager destruction of a shared DTD in XML_ExternalEnti

CVE-2024-28757 HIGH POC
7.5

Alpine Linux: expat fixed in 2.6.2-r0

CVE-2017-9233 HIGH POC
7.5 Jul 25

XML External Entity vulnerability in libexpat 2.2.0 and earlier (Expat XML Parser Library) allows attackers to put the p

CVE-2026-45186 HIGH POC
7.5 May 10

Denial of service in libexpat before 2.8.1 lets remote attackers exhaust CPU by submitting moderately sized crafted XML

CVE-2013-0340 MEDIUM POC
6.8 Jan 21

expat before version 2.4.0 does not properly handle entities expansion unless an application developer uses the XML_SetE

CVE-2016-0718 CRITICAL
9.8 May 26

Expat allows context-dependent attackers to cause a denial of service (crash) or possibly execute arbitrary code via a m

CVE-2024-45492 CRITICAL
9.8 Aug 30

An issue was discovered in libexpat before 2.6.3. Rated critical severity (CVSS 9.8), this vulnerability is remotely exp

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy