Skip to main content

svg-sanitizer EUVDEUVD-2026-115866

| CVE-2026-121444 HIGH
Uncontrolled Resource Consumption (CWE-400)
2026-11-03 VulnCheck GHSA-38xh-8h9r-v3mm
8.7
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Submit small crafted layered SVG
  2. Exploit
    Application passes it to Sanitizer::sanitize()
  3. Execution
    Unmemoized hasInfiniteLoop()/countUse() enumerate ~k^depth paths
  4. Impact
    PHP 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

svg-sanitizer 0.11.0 <1.1.0

Affected Packages

euvd svg_sanitizer fix: 1.1.0

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

Vendor (VulnCheck) PRIMARY 8.7 HIGH
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
vuln.today AI 7.5 HIGH

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.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Nov 03, 2026 - 16:17 EUVD
CVE Published
Nov 03, 2026 - 14:28 cve.org
HIGH 8.7

DescriptionCVE.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

Why It Matters

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.

Business Impact: High
Compensating Controls

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

Prevalence
High
very widely used PHP SVG-sanitization library (enshrined/svg-sanitize), common in CMS stacks
Social Media
1
Sightings
Data Quality
4 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
High

Priority Score

44
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

More in PHP

View all
CVE-2019-11043 CRITICAL POC
9.8 Oct 28

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

CVE-2012-1823 CRITICAL POC
9.8 May 11

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

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2018-11138 CRITICAL POC
9.8 May 31

The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

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

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

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

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy