Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach service reusing one expat parser
-
ExploitSubmit single oversized XML document
-
ExecutionAllocation counter stays inflated after reset
-
ImpactSubsequent 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
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
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.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
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
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.
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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
In Expat (aka libexpat) before 2.4.5, there is an integer overflow in storeRawNames. Rated critical severity (CVSS 9.8),
libexpat in Expat before 2.7.2 allows attackers to trigger large dynamic memory allocations via a small document that is
In libexpat before 2.2.8, crafted XML input could fool the parser into changing from DTD parsing to document parsing too
CPU exhaustion in libexpat through 2.9.0 lets remote attackers stall XML parsing workloads by supplying a moderately siz
Malformed UTF-16 decoding in libexpat through 2.8.4 lets remote attackers hide XML markup from the parser: a lone high s
In libexpat through 2.4.9, there is a use-after free caused by overeager destruction of a shared DTD in XML_ExternalEnti
Alpine Linux: expat fixed in 2.6.2-r0
XML External Entity vulnerability in libexpat 2.2.0 and earlier (Expat XML Parser Library) allows attackers to put the p
Denial of service in libexpat before 2.8.1 lets remote attackers exhaust CPU by submitting moderately sized crafted XML
expat before version 2.4.0 does not properly handle entities expansion unless an application developer uses the XML_SetE
Expat allows context-dependent attackers to cause a denial of service (crash) or possibly execute arbitrary code via a m
An issue was discovered in libexpat before 2.6.3. Rated critical severity (CVSS 9.8), this vulnerability is remotely exp
EUVD-2026-104922
GHSA-6r6q-9jmv-gg3h
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB