Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit small crafted layered SVG
-
ExploitApplication passes it to Sanitizer::sanitize()
-
ExecutionUnmemoized hasInfiniteLoop()/countUse() enumerate ~k^depth paths
-
ImpactPHP worker CPU pinned for hours, pool saturated
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource consumption limits
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The target application must accept attacker-supplied SVG and process it through svg-sanitizer's Sanitizer::sanitize() (the costly walk runs during Resolver::collect(), before any <use> element is removed); no non-default configuration is required - the advisory confirms the behavior on default settings. The attacker crafts an acyclic layered DAG of exactly <=15 <use> nesting levels so the useNestingLimit=15 DEPTH guard (which bounds depth, not total work) never fires. Limiting factors: exploitation is bounded by PHP max_execution_time on web SAPIs (worker freed at the limit) but is effectively unbounded under CLI or queue/background workers; and real-world reach depends on whether the SVG-ingest path is exposed to unauthenticated users. Affected only on svg-sanitizer >= 0.11.0 and <= 1.0.0. |
| Impact | This is a genuine availability risk but not an emergency. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) with VA:H and a score of 8.7 is consistent with the GHSA evidence: a single ~4-12 KB SVG passed to Sanitizer::sanitize() forces super-polynomial (~k^depth) CPU in the unmemoized hasInfiniteLoop()/countUse() reference-graph walk, measured at ~1.3 s for a 4 KB file and extrapolated to ~28 CPU-hours for buildSvg(15,6). Impact is strictly availability - confidentiality and integrity are untouched (VC:N/VI:N) - so despite the high score this is a resource-exhaustion issue, not RCE or data compromise. The vuln.today Decision label is 'this_week' (not act_now/emergency), and there is no CISA KEV listing and no EPSS score in the supplied data, so there is no evidence of active exploitation; the priority rests on how easy and cheap the attack is (tiny input, no auth required per PR:N, confirmed on default settings) rather than on observed in-the-wild use. One caveat: the CVSS assigns PR:N, but real-world exploitability depends on whether the application accepts SVG from unauthenticated users or only from authenticated/privileged ones - verify the deployment's upload path. Worst case is severe under CLI/queue workers where no max_execution_time bounds the walk. |
| Exploit ScenarioDerived | An attacker submits a ~12 KB SVG containing 15 layers of fanned-out <use> elements (every node's 6 <use> children point at all nodes in the next layer) to any endpoint that sanitizes user-supplied SVGs with svg-sanitizer. During Resolver::collect(), hasInfiniteLoop() enumerates ~7.84e10 root-to-leaf paths, consuming tens of CPU-hours and pinning a PHP worker until max_execution_time - or indefinitely under CLI/queue workers. A working generator and measured scaling data are published in the GHSA advisory, so a reproducible public PoC reference exists, though the input does not flag it as a verified weaponized exploit. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 03, 2026
Algorithmic-complexity denial of service in svg-sanitizer (Composer package enshrined/svg-sanitize) versions 0.11.0 through 1.0.0 lets remote attackers burn extreme CPU by uploading a tiny layered SVG. The <use> reference-graph analysis in Subject.php::hasInfiniteLoop() and countUse() enumerates every root-to-leaf path without memoization, and the only guard (useNestingLimit = 15) caps depth rather than total work, so an acyclic DAG of 15 fanned-out layers (roughly 4-12 KB) projects to tens of hours of CPU for a single sanitize() call; no public exploit code was identified at time of analysis, though the advisory publishes a generator and measured timings. Availability-only impact; the trigger runs during Resolver::collect() before any <use> element is removed, so it cannot be avoided by how the sanitizer later strips elements.
RemediationAI
Vendor-released patch: upgrade enshrined/svg-sanitize to 1.1.0, the first fixed release, via composer require enshrined/svg-sanitize:^1.1.0 and re-run composer update; the fix is referenced in GHSA-hrwm-vcc9-hcm4 and the VulnCheck advisory. Because the vulnerability is triggered only inside Sanitizer::sanitize(), patching is required on every code path that accepts untrusted SVG, including background and queue workers where the impact is effectively unbounded. If an immediate upgrade is not possible, the advisory's technical analysis shows that the walk short-circuits as soon as depth exceeds 15, so rejecting any uploaded SVG whose <use> nesting depth is greater than 15 before invoking the sanitizer would strip the primitive used by the generator -- at the cost of rejecting deep-but-legitimate SVGs, which must then be reviewed manually. Running the sanitize step in a worker with a hard PHP max_execution_time and a bounded queue is only a partial limiting factor: it frees the web worker at the limit, but it does not stop the CPU burn from being repeated and does not bound CLI or queue workers, which have no execution-time limit unless one is set explicitly. Restricting the SVG-ingest endpoint to authenticated users lowers the exposed attack surface where upload is not a core public feature; it does not remove the flaw.
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
svg-sanitizer is a PHP library (composer/enshrined/svg-sanitize) used to strip malicious constructs from untrusted SVG uploads before storage or rendering; the affected CPE is daryldoyle:svg-sanitizer. The flaw is CWE-400 (uncontrolled resource consumption) with the advisory also classifying it as CWE-407 (inefficient algorithmic complexity). Resolver::collect() builds an element-reference graph by collecting each id'd element's direct <use> children via a relative XPath, keyed by target id, so k distinct <use> children yield fan-out k. hasInfiniteLoop() then recurses over that graph carrying the current path and only short-circuits when a node already appears on the path (in_array with strict comparison); a layered DAG never repeats a node along a path, so every root-to-leaf path is enumerated and shared nodes are re-walked once per path. countUse() performs the same unmemoized per-path recursion and is invoked from Sanitizer::isUseTagExceedingThreshold() for each <use>. The sole safeguard, useNestingLimit = 15, is enforced as a depth cap that throws NestingException only when level exceeds 15, so attack graphs at depth exactly 15 raise no exception and the exponential breadth is unbounded. Advisory measurements show the walk short-circuits quickly at L=16+ (exception fires) but completes slowly at L=15, confirming the attacker tunes k and L to any CPU budget; a benign 74 KB linear 2000-deep chain sanitizes in 0.013s, confirming the cost is driven by branching, not input size.
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
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Remote SVG submission with no auth or interaction (AV:N/AC:L/PR:N/UI:N) deterministically exhausts CPU; impact is availability-only (A:H), no confidentiality or integrity effect.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
svg-sanitizer from 0.11.0 before 1.1.0 contains an algorithmic complexity denial of service vulnerability in hasInfiniteLoop() and countUse() of the use reference-graph analysis. Attackers can upload a small layered SVG with 15 levels of fanned-out use elements, forcing exponential path enumeration that pins PHP workers for hours.
Technical POC Analysis
CWE-407 (Inefficient Algorithmic Complexity) / CWE-400 (Uncontrolled Resource Consumption) in src/ElementReference/Subject.php.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
CVE-2026-121444 exposes organizations using the svg-sanitizer library to a denial-of-service condition: a tiny, crafted SVG file can consume tens of hours of CPU during sanitization. This affects any application that processes user-supplied SVGs with the vulnerable library, potentially disrupting services and operations for customers and internal teams.
No vendor-released patch identified at time of analysis. Interim mitigations include rejecting unusually small yet deeply layered SVGs, enforcing maximum file size and structure complexity, and running sanitization in resource-constrained environments.
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 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-115866
GHSA-38xh-8h9r-v3mm
NVD
CVE.org
Exploit-DB