Safeguard
Vulnerability Analysis•

CVE-2026-86144: Medium XInclude Flag Bypass in libxml2 Before 2.15.4

CVE-2026-86144: libxml2 XInclude processing dropped parse flags such as XML_PARSE_NONET, enabling SSRF or XXE with custom loaders. Update to 2.15.4.

Safeguard Security Team
4 min read

CVE-2026-86144 is a medium severity flaw in libxml2 before 2.15.4. XInclude processing did not propagate parse flags, so restrictions such as XML_PARSE_NONET could be ignored. With a custom resource loader, that can enable server side request forgery or external entity injection. Fixed in 2.15.4.

What's affected

Affected: libxml2 before 2.15.4, specifically applications that use XInclude processing and rely on parse flags to restrict what the parser may load.

Upstream's fixed release is libxml2 2.15.4. The record says "before 2.15.4", and the comparison between v2.15.3 and v2.15.4 spans 39 commits. The record scores this one 5.6, the lowest in the group. The record does not list this CVE in CISA KEV, and I found no statement of exploitation in the pages I reviewed.

How to check if you're exposed

libxml2 reaches you in three ways: as a system package, as a library bundled inside another product, and as a copy statically linked into a language binding.

For the system library and command line tool:

xmllint --version
dpkg -l libxml2          # Debian and Ubuntu
rpm -q libxml2           # RHEL, Fedora, SUSE

For Python's lxml, which can bundle its own libxml2:

python -c "from lxml import etree; print(etree.LIBXML_VERSION)"

Anything reporting a version below 2.15.4 is in range upstream. Linux distributions often backport fixes without changing the version number, so also check your distribution's security tracker for this CVE. Container images and vendored copies need an SBOM or image scan, since the version is not visible from the host.

What to do now

  1. Inventory where libxml2 runs: host packages, container images, and language packages that bundle it.
  2. Upgrade to libxml2 2.15.4 or later, or install your distribution package that lists this CVE as fixed.
  3. Rebuild and redeploy container images and statically linked binaries, since upgrading the host package does not touch them.
  4. Until patched, avoid feeding untrusted XML, URIs or XPointer expressions of unusual size to services that use libxml2.
  5. Run a dependency scan to catch copies you did not know about. Safeguard offers a free in-browser dependency scan at gold.safeguard.sh/scan that lists the package versions a project pulls in, which is a quick way to see whether an affected release is in your tree. Reachability analysis can then help you judge whether the vulnerable code path is actually used.

Why it matters

The cause is that xmlXIncludeProcess and xmlXIncludeProcessTree did not pass parseFlags along to the documents they pull in. So a caller who set a restriction, for example the flag that forbids network access, believed it applied to the whole operation. For included content it did not.

The record says this matters "if (without it) a custom resource loader accesses the internet", leading to XML external entity injection, server side request forgery, or a denial of service from a deliberately slow remote resource. The practical condition is therefore specific: XInclude must be on, and a loader must exist that will fetch remote resources.

This is classified as CWE-669, incorrect resource transfer between spheres, where a control that should travel with the data does not. The fix commit adds tests and propagates the flags. Medium at 5.6 reflects those preconditions.

Quick check

What do I check in my own code?

Whether you enable XInclude processing, and whether any custom resource loader can reach the network.

Does the fix change behavior?

Yes, by design: flags you set now apply to included content, so previously permitted loads can be refused.

Sources

Last reviewed: 18 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.