NIST deprecates RSA-2048 from 2030. Find every one of them before attackers do.
🦀
🦀 crates.io
Not in CISA KEV
HIGH severity

CVE-2026-96889 — librsvg

HIGHFix: GNOME/librsvg@0bc935e

CVE-2026-96889 is a high-severity (CVSS 7.8) Use After Free vulnerability in librsvg. 1 public exploit or proof-of-concept reference is indexed, so weaponization risk is real. A fix is available for librsvg — see the affected versions and patch details below.

Librsvg: Use-after-free when XML includes have duplicated entities

Also known asRUSTSEC-2026-0305
Published
Updated
Affected
5 pkgs
Patched
5 / 5
Exploits
1 known
Exploitation data as of Nov 6, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

Proof-of-concept exploit code exists

  • CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
  • A successful exploit gives an attacker total control of the affected component, not partial access.

Exploitation and automatability from CISA’s SSVC triage for CVE-2026-96889.

EPSS Exploitation Probability

via FIRST.org ↗
0.6%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs47th percentile — riskier than 47% of all scored CVEsHighest risk
0.00%0.35%0.71%1.06%0.1%0.6%0.6%Oct 26Nov 26Nov 26

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

Where this sits among everything scored

Real-World Exposure

5 pkgs affected
🦀librsvg🦀librsvg🦀librsvg🦀librsvg🦀librsvg

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects crates.io packages — download data is not available via public APIs for these ecosystems.

Description

Librsvg uses libxml2, a C library, to parse XML. When librsvg parses an SVG document which has a nested Xinclude, an XML entity declaration with a duplicate name as an existing one can cause a use-after-free error.

While libxml2 is expanding an internal entity, a recursive XInclude can parse another document that declares an entity with the same name. Both parses use the same XmlState entity map on the librsvg side. entity_insert() replaces the first entry, whose Drop implementation calls xmlFreeNode(). The outer xmlCtxtParseEntity() then keeps using the freed 144-byte xmlEntity.

The included parse should not free an entity that the outer parser is still using.

The fix is in commit 8a1b0cd319e9af2d1e9cf878081dd77f227a0504, where librsvg will no longer free xmlEntity pointers that libxml2 is still using.

Affected Packages

5 total 5 fixed
EcosystemPackageVulnerable rangeFix
🦀crates.iolibrsvgall versions2.57.5cargo update -p librsvg --precise 2.57.5
🦀crates.iolibrsvg≥ 2.60.0-beta.0&&< 2.60.32.60.3cargo update -p librsvg --precise 2.60.3
🦀crates.iolibrsvg≥ 2.61.0&&< 2.61.52.61.5cargo update -p librsvg --precise 2.61.5
🦀crates.iolibrsvg≥ 2.62.0-beta.0&&< 2.62.42.62.4cargo update -p librsvg --precise 2.62.4
🦀crates.iolibrsvg≥ 2.63.0-beta.0&&< 2.63.22.63.2cargo update -p librsvg --precise 2.63.2
Exploits & PoCs
1

Research use only. For defensive security, authorized penetration testing, and academic research only. Never execute exploit code against systems without explicit written authorization.

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for librsvg, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update librsvg to 2.57.5 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-96889 is resolved across your whole dependency graph.

  3. Workarounds

    Stop feeding it untrusted input: reject or quarantine files and payloads from unverified sources until you can upgrade, restrict accepted formats to the ones you actually need, and run the parsing or decoding step in a least-privileged sandbox or short-lived worker so a crash or corrupted read cannot reach the rest of the process.

Fixing This On Your OS

If you run this on a Linux distribution, patch through your package manager against the distro's own security advisory below — it tracks the exact backported fix for your release, which can ship on a different timeline (and sometimes a different severity) than the upstream project.

Red HatImportant

This is an Important use-after-free flaw in librsvg, which could lead to arbitrary code execution or denial of service. The vulnerability occurs when processing a specially crafted SVG document containing nested Xincludes with duplicated XML entity declarations. Exploitation requires user interaction, such as opening…

Workaround published by Red Hat
Mitigation for this issue is either not available or the currently available options do not meet the Red Hat Product Security criteria comprising ease of use and deployment, applicability to widespread installation base or stability.
Source: Red Hat security advisory for CVE-2026-96889 (CC BY 4.0)
ProductFixed inAdvisory
Red Hat Enterprise Linux 10glycin-loaders-0:1.0.1-1.el10_2.2RHSA-2026:86331
Red Hat Enterprise Linux 10librsvg2-0:2.57.1-9.el10_2.10RHSA-2026:86841
Red Hat Enterprise Linux 10.0 Extended Update Supportlibrsvg2-0:2.57.1-9.el10_0.1RHSA-2026:92214
Red Hat Enterprise Linux 10.0 Extended Update Supportglycin-loaders-0:1.0.1-1.el10_0.1RHSA-2026:92573
Red Hat Enterprise Linux 7 Extended Lifecycle Supportlibrsvg2-0:2.40.20-1.el7_9.1RHSA-2026:92579
Red Hat Enterprise Linux 8librsvg2-0:2.42.7-6.el8_10RHSA-2026:86842
Red Hat Enterprise Linux 8.4 Advanced Mission Critical Update Supportlibrsvg2-0:2.42.7-4.el8_4.1RHSA-2026:92353
Red Hat Enterprise Linux 8.6 Advanced Mission Critical Update Supportlibrsvg2-0:2.42.7-4.el8_6.1RHSA-2026:92336

Frequently Asked Questions

Librsvg uses libxml2, a C library, to parse XML. When librsvg parses an SVG document which has a nested Xinclude, an XML entity declaration with a duplicate name as an existing one can cause a use-after-free error. While libxml2 is expanding an internal entity, a recursive XInclude can parse another document that declares an entity with the same name. Both parses use the same `XmlState` entity map on the librsvg side. `entity_insert()` replaces the first entry, whose `Drop` implementation calls `xmlFreeNode()`. The outer `xmlCtxtParseEntity()` then keeps using the freed 144-byte `xmlEntity`.
O3 Security · Impact-Aware SCA

Is CVE-2026-96889 in your dependencies?

Find it across crates.io, including transitive dependencies.

CVE-2026-96889: librsvg — Fixed in 2.57.5