🛡️ RUSTSEC-2026-0195 — quick-xml

⚪ Unknown ✅ No Known Exploit OSV
N/A
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Unbounded namespace-declaration allocation in NsReader enables memory-exhaustion denial of service

NsReader resolves namespaces by calling NamespaceResolver::push for every

Start/Empty event *before* the event is returned to the caller. push

iterated all xmlns / xmlns:* attributes on the start tag and, for each one,

appended the prefix bytes to an internal buffer and pushed a NamespaceBinding

(32 bytes on 64-bit) to an internal Vec, with no upper bound on the number of

declarations.

Impact

A start tag with N namespace declarations drove roughly the tag's byte

size in NamespaceResolver heap, allocated *inside* quick-xml before the

NsReader consumer ever received the event and could inspect or reject it. A

consumer that bounds its *input* size therefore still cannot bound this

allocation: an M-byte start tag yields on the order of 3 × M bytes of

resolver heap the caller never sees.

On untrusted XML this lets a remote, unauthenticated attacker force large heap

allocations with a single start tag. With several NsReaders running

concurrently on independent inputs (a common server pattern), the allocations

stack and can exhaust process memory, causing the operating system to kill the

process (OOM). This was confirmed against a real-world RPKI relying party (NLnet

Labs Routinator), where concurrent RRDP validation workers parsing a crafted

snapshot.xml exceeded the memory limit and the process was OOM-killed.

Affected code paths

Consumers using NsReader (which always calls NamespaceResolver::push before

yielding Start/Empty), or calling NamespaceResolver::push directly. A plain

Reader that does not perform namespace resolution is not affected.

Remediation

Upgrade to quick-xml >= 0.41.0. NamespaceResolver::push now rejects a start

tag that declares more than DEFAULT_MAX_DECLARATIONS_PER_ELEMENT (256)

namespace bindings, returning the new NamespaceError::TooManyDeclarations

instead of allocating without limit. The limit is configurable via

NamespaceResolver::set_max_declarations_per_element (use usize::MAX to

restore the previous unbounded behavior), and NsReader::resolver_mut() is

provided to reach it.

There is no clean workaround for NsReader consumers before 0.41.0, as the

allocation happens inside the reader with no configuration knob to cap it.

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 unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity none, availability high.

Affected software

RUSTSEC-2026-0195 is recorded against 1 package.

  • quick-xml

Timeline and source

Published on 29 June 2026 and last revised on 2 July 2026. No public exploit is currently recorded for this entry. Record sourced from OSV.

References

crates.io (Package)
rustsec.org (Advisory)
github.com (Report)
github.com (Web)

Details

Severity Unknown
CVSS Score N/A
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
CWE N/A
Public Exploit ✅ No
Source OSV
Published 2026-06-29
Updated 2026-08-12
Modified 2026-07-02
Fix URL N/A

Affected Packages

Software From version Fixed in
quick-xml

Similar Threats

Free Vulnerability Check

Is your site affected by RUSTSEC-2026-0195?

BotEraser helps you identify potentially vulnerable plugins and themes by checking your installation against RUSTSEC-2026-0195 and other known CVE records.

Scan My Site Free →

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.