Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft nesting-bomb SVG with mixed-case xlink:HrEf
-
DeliveryUpload or paste SVG to target application
-
ExploitCase-sensitive reference graph skips use nullification
-
ExecutionSanitizer re-canonicalizes attributes, output stays live
-
ImpactDownstream renderer exhausts memory/CPU (DoS)
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Case sensitivity handling
|
| Exploitation Conditions | Requires that the target application uses enshrined/svg-sanitize ≤ 0.22.0 to sanitize an attacker-supplied SVG and then serves or renders the sanitized result. The specific trigger is an SVG whose |
| Impact | This is a medium-severity (CVSS 6.5) availability-only issue - a sanitizer-bypass that resurrects a known |
| Exploit ScenarioDerived | An attacker uploads or pastes a crafted SVG whose |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 08, 2026
Sanitizer bypass in enshrined/svg-sanitize 0.22.0 and earlier lets an attacker smuggle a fully live SVG <use> nesting bomb past the library's useNestingLimit defenses by writing the href attribute with mixed casing, for example xlink:HrEf or HrEf. The resolver builds its reference graph with the case-sensitive XPath predicate use[@href or @xlink:href], so the mixed-case nodes never enter the graph and are never nullified, while Sanitizer::cleanHrefAttributes() runs later in the same pass and re-canonicalizes the attribute to xlink:href - handing back output that would have been stripped entirely had the input used canonical casing. Impact is availability only (CVSS 6.5, CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H): unauthenticated attackers able to upload or paste an SVG into an application that sanitizes and then serves it can cause a denial of service when the output is rendered (UI:R); publicly available exploit code exists (a reproducible proof of concept against tag 0.22.0 ships with the vendor advisory), but no CISA KEV entry indicates active exploitation.
RemediationAI
Vendor-released patch: upgrade composer/enshrined/svg-sanitize to 1.0.0 (https://github.com/darylldoyle/svg-sanitizer/releases/tag/1.0.0), which drops the case-sensitive XPath predicate and resolves href through a case-insensitive local-name lookup in Helper::getElementHref(); if a full upgrade is not immediately possible, cherry-pick or backport upstream commit 2dff6628314de8519155b7feb218bbe132785757, and verify the fix by testing the mixed-case variants xlink:HrEf, xlink:HREF, HrEf and HREF against your own useDosTest-style fixture. Where the library cannot be changed at all, the most direct compensating control is to pre-normalize input before sanitization - rewrite href attribute names case-insensitively to canonical href/xlink:href (or reject any SVG containing an href attribute whose name is not exactly href or xlink:href) so the resolver and the cleaner can no longer disagree; the trade-off is that aggressive name rewriting can mangle unrelated attributes or namespace prefixes, and the strict-reject variant will refuse spec-legal mixed-case SVGs that some producers emit. A second, blast-radius-only control is to keep treating the sanitized output as hostile: serve it from a separate origin inside a sandboxed iframe with a strict Content-Security-Policy, and render it in a process with hard memory and CPU limits, which does not remove the nesting bomb but bounds the resource cost if <use> expansion still occurs; note this is a mitigation, not a fix, and it leaves the sanitizer's advertised nesting-DoS guarantee broken. Because the trigger requires a downstream consumer to actually render the served SVG (UI:R), avoiding server-side rasterization or preview generation of user-supplied SVGs removes the immediate denial-of-service path until the upgrade lands.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in composer, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Root cause is CWE-178, improper handling of case sensitivity, in the PHP library enshrined/svg-sanitize (Composer package, CPE pkg:composer/enshrined_svg-sanitize). The library uses PHP's DOM/XPath stack: attribute-name matching in XPath is case sensitive, so the predicate built at src/ElementReference/Resolver.php:97-118 (use[@href or @xlink:href]) silently skips <use> elements whose href attribute is written as HrEf, xlink:HrEf or xlink:HREF. Those nodes are therefore absent from the element-reference graph that powers the nesting-DoS nullification and the useThreshold recursion counting. Ordering is the entire bug: Sanitizer::sanitize() builds the reference graph first and only afterwards runs Sanitizer::cleanHrefAttributes() (src/Sanitizer.php:479-504), which lowercases any attribute name that matches an allowed attribute case-insensitively and rewrites it via removeAttribute/setAttribute back to canonical href or xlink:href. The net effect is that the sanitizer emits a live nesting bomb whose attributes are canonical, i.e. exactly the input the useNestingLimit machinery exists to defuse. This is the mirror image of CVE-2025-55166, whose fix made href *value* checking case-insensitive but left node selection in the reference graph case-sensitive. The upstream fix removes the href predicate from the XPath query entirely and instead extends Helper::getElementHref() (Helper.php:10-19) with a case-insensitive local-name lookup that only accepts unprefixed href or an xlink-prefixed href, adding an XLINK_NAMESPACE_URI constant. Test coverage was extended with data providers for xlink:HrEf, xlink:HREF, href, HrEf and HREF; notably a mixed-case *prefix* such as XLINK:href is not bound to the xlink namespace and is dropped wholesale by cleanXlinkHrefs(), so it leaves inert <use> leftovers rather than a live reference and does not trigger the bug.
Know when PHP 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
AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
SVG is submitted remotely with no privileges (AV:N/PR:N/AC:L), but impact needs a consumer to render the output (UI:R); effect is DoS only, so C:N/I:N/A:H.
Primary rating from Vendor (https://github.com/darylldoyle/svg-sanitizer).
CVSS VectorVendor: https://github.com/darylldoyle/svg-sanitizer
DescriptionCVE.org
Summary
Resolver::processReferences() collects <use> elements with the XPath predicate use[@href or @xlink:href], which is case sensitive. A <use> element written as xlink:HrEf is therefore never added to the reference graph, so the nesting-DoS nullification never marks it for removal. Sanitizer::cleanHrefAttributes() then runs later in the same pass and rewrites xlink:HrEf back to the canonical xlink:href. The sanitizer hands back a fully live nesting bomb that it would have stripped completely had the input used canonical casing.
This is the mirror image of CVE-2025-55166: that fix made href *value* checking case insensitive, but the <use> reference graph still selects nodes case sensitively.
Where it is
src/ElementReference/Resolver.php:97-118, the case-sensitive node selection:
$useNodeName = $this->xPath->createNodeName('use');
foreach ($this->subjects as $subject) {
$useElements = $this->xPath->query(
$useNodeName . '[@href or @xlink:href]',
$subject->getElement()
);src/Sanitizer.php:479-504, the normalization that happens afterwards and makes the attribute live again:
// in case the attribute name is `HrEf`/`xlink:HrEf`, adjust it to `href`/`xlink:href`
if (!in_array($attribute->nodeName, $this->allowedAttrs, true)
&& in_array(strtolower($attribute->nodeName), $this->allowedAttrs, true)
) {
$element->removeAttribute($attribute->nodeName);
$element->setAttribute(strtolower($attribute->nodeName), $attribute->value);
}Ordering is the whole bug. Sanitizer::sanitize() builds the resolver graph first and normalizes attribute casing second, so the graph is built against names the sanitizer is about to change.
Impact
Anyone who can submit an SVG to an application that sanitizes it with this library and then serves it. No privileges beyond being able to upload or paste an SVG. The output is the project's own tests/data/useDosTest.svg nesting structure, intact, with canonical xlink:href attributes, which is exactly the input the useNestingLimit machinery exists to defuse.
Proof of concept
Against a clean clone of tag 0.22.0. The only change to the input is rewriting xlink:href to xlink:HrEf in the project's own DoS fixture.
<?php
spl_autoload_register(function ($class) {
$p = 'enshrined\\svgSanitize\\';
if (strpos($class, $p) !== 0) return;
$rel = str_replace('\\', '/', substr($class, strlen($p)));
$f = __DIR__ . '/svgsan/src/' . $rel . '.php';
if (file_exists($f)) require $f;
});
$orig = file_get_contents(__DIR__ . '/svgsan/tests/data/useDosTest.svg');
$mut = str_replace('xlink:href', 'xlink:HrEf', $orig);
function run($label, $input) {
$s = new \enshrined\svgSanitize\Sanitizer();
$s->removeRemoteReferences(true);
$out = $s->sanitize($input);
echo "[$label]\n";
echo " output <use count : ", substr_count($out, '<use '), "\n";
echo " output xlink:href : ", (strpos($out,'xlink:href')!==false?'YES':'NO'), "\n";
echo " output xlink:HrEf : ", (strpos($out,'xlink:HrEf')!==false?'YES':'NO'), "\n";
}
run('canonical xlink:href (control)', $orig);
run('mixed-case xlink:HrEf (attack)', $mut);Observed on PHP 8.5.9:
orig use count: 201
mutated input has xlink:HrEf: YES
[canonical xlink:href (control)]
output <use count : 0
output xlink:href : NO
output xlink:HrEf : NO
[mixed-case xlink:HrEf (attack)]
output <use count : 201
output xlink:href : YES
output xlink:HrEf : NO201 to 0 on canonical input, 201 to 201 on mixed-case input, and the output attribute name comes back canonical either way. To be precise about what I measured: I measured the nullification being skipped and the attribute being re-canonicalized. I did not measure renderer memory or CPU on the resulting file, so the downstream cost is whatever you already assign to useDosTest.svg.
Suggested fix
Stop matching attribute names case sensitively when the reference graph is built. Either select every descendant use and resolve the href in PHP with a case-insensitive local-name lookup (an extension of Helper::getElementHref() at Helper.php:10-19 is the smallest change), or move the cleanHrefAttributes() canonicalization so it runs before $this->elementReferenceResolver->collect() rather than after, so the resolver only ever sees href and xlink:href. The second option also removes the general class of bug where the graph and the cleaner disagree about a node's identity.
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
In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it
sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
EUVD-2026-101125
GHSA-m9xh-6747-9r6f
NVD
CVE.org
EPSS
Exploit-DB