CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-84371

CVE-2026-84371: Stored XSS via SVG SMIL URI-list Scheme-Policy Bypass in sanitize-html

Alon Barad
Alon Barad
Software Engineer

Sep 2, 2026·5 min read·2 visits

Executive Summary (TL;DR)

SVG SMIL animation tags allow bypass of sanitize-html's scheme filtering via semicolon-separated lists in 'values' attributes, leading to arbitrary JavaScript execution.

A stored Cross-Site Scripting (XSS) vulnerability exists in sanitize-html from version 1.9.0 up to 2.17.6. The flaw permits attackers to bypass scheme-policy enforcement using SVG SMIL animation elements targeting URL attributes with semicolon-separated URI lists.

Vulnerability Overview

The library sanitize-html is designed to parse and clean untrusted HTML input, neutralizing script execution vectors while allowing safe tags and attributes to persist. In applications handling user-generated content, rich-text features often allow a subset of SVG tags to enable vector illustrations or animated graphics.

SVG Synchronized Multimedia Integration Language (SMIL) elements, such as <animate> or <set>, present a unique challenge to static sanitizers. These elements allow dynamic manipulation of DOM attributes of parent or sibling tags directly inside the browser's XML rendering engine.

When sanitize-html is configured to allow certain SVG animation elements, it exposes an attack surface where client-side state transitions can alter attributes after sanitization. By abusing this dynamic state transition, attackers can craft payloads that bypass standard URI scheme policies.

Root Cause Analysis

The underlying vulnerability arises from how the sanitization library evaluates complex attribute values compared to how web browsers render them at runtime.

Standard HTML attributes like href hold a single URL value, which the sanitizer evaluates as a flat string. If sanitize-html encounters an anchor or SVG link attribute, it checks whether the URI scheme starts with a safe scheme such as http, https, or # (relative fragment).

In the SVG SMIL specification, elements use the values attribute to specify a transition path. When the attributeName of an <animate> tag is set to href, the values attribute takes a semicolon-separated list of target URIs (e.g., values="#safe;javascript:alert(1)").

During sanitization, the parser evaluates the entire values string as a single, flat URL structure. Since the string begins with the allowed fragment character #, the library's scheme validator rules it safe and retains the attribute. Upon browser rendering, the client engine splits the semicolon-separated list and eventually executes the dynamic write of the subsequent javascript: URI into the host element's live href sink, bypassing the sanitization layer completely.

Code Analysis

To understand the implementation flaw, we examine the behavioral difference between the vulnerable code path and the patched implementation.

In vulnerable versions of the library, attributes such as values were evaluated on a per-attribute level based on basic regex or scheme matching logic. The library lacked the context that the value in the values attribute would eventually be written to a target URL sink defined by attributeName.

In the patched version (2.17.7), the maintainers introduced the animatesUrlAttribute helper function. This helper intercepts incoming SVG SMIL elements (animate, animatecolor, animatemotion, animatetransform, set) and inspects their target configuration:

function animatesUrlAttribute(name, attribs) {
  if (svgAnimationTags.indexOf(name.toLowerCase()) === -1) {
    return false;
  }
  const schemeCheckedAttributes = options.allowedSchemesAppliedToAttributes || [];
  return Object.keys(attribs || {}).some(function(attributeName) {
    if (attributeName.toLowerCase() !== 'attributename') {
      return false;
    }
    const target = (attribs[attributeName] || '').trim().toLowerCase();
    const localName = target.slice(target.lastIndexOf(':') + 1);
    return alwaysUrlAttributes.indexOf(localName) !== -1 ||
      schemeCheckedAttributes.indexOf(target) !== -1 ||
      schemeCheckedAttributes.indexOf(localName) !== -1;
  });
}

If the parser detects that an animation element is targeting a URL-bearing attribute (like href or a custom configured scheme attribute), the validator immediately discards the entire element rather than trying to sanitize the complex value lists.

Exploitation & Attack Flow

Exploitation of this vulnerability requires that the target application has enabled SVG and SMIL animation tags in its configuration. When these conditions are met, the attack can be executed using a stored XSS vector.

An attacker crafts a payload where an anchor element wraps a SMIL animation. The animation element targets the href attribute and passes a semicolon-separated list where the initial entry matches a benign destination, while the second entry contains the malicious payload:

<svg>
  <a>
    <animate attributeName="href" values="#safe;javascript:alert(document.domain)" dur=".01s" fill="freeze"></animate>
    <text y="30">Click to trigger action</text>
  </a>
</svg>

When the browser parses this structure, the SMIL engine triggers the animation. Because dur is set to .01s and fill is set to freeze, the parent anchor tag's href attribute is permanently rewritten to javascript:alert(document.domain) almost instantly. Clicking the text triggers the script immediately in the victim's session context.

Impact Assessment

The impact of this vulnerability depends heavily on the execution environment and context of the web application. Stored XSS typically allows attackers to execute arbitrary JavaScript in the context of authenticated sessions of other users.

In web portals, CMS platforms, or message boards where high-privilege users (such as administrators or content managers) interact with content, this flaw could allow an attacker to hijack active sessions, extract sensitive access tokens, or perform actions on behalf of other users.

The vulnerability is classified under CWE-79 (Cross-site Scripting). While the CVSS score is assigned as 5.4, the impact is bound by the fact that the application must explicitly allow SVG elements in its configuration, limiting the exploitability on default out-of-the-box configurations.

Remediation and Defense-in-Depth

The primary remediation for this vulnerability is to upgrade the sanitize-html library to version 2.17.7 or higher, which handles SMIL animation components safely.

For applications that are unable to apply the package upgrade immediately, several defense-in-depth measures can be deployed to block this vector. The most effective mitigation is to review the allowedTags parameter in your sanitize-html configuration and ensure that SMIL tags like animate, animatecolor, animatemotion, animatetransform, and set are excluded from the allowed list.

Additionally, implementing a strict Content Security Policy (CSP) that restricts inline script execution (script-src 'self') will block the execution of the injected javascript: URI even if it successfully bypasses the sanitization parser.

Fix Analysis (2)

Technical Appendix

CVSS Score
5.4/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N

Affected Systems

sanitize-html

Affected Versions Detail

Product
Affected Versions
Fixed Version
sanitize-html
apostrophecms
>= 1.9.0, < 2.17.72.17.7
AttributeDetail
CWE IDCWE-79
Attack VectorNetwork (AV:N)
CVSS Severity Score5.4 (Medium)
Exploit Statuspoc
CISA KEV StatusNot Listed
ImpactStored Cross-Site Scripting (XSS)

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1185Browser Session Hijacking
Collection
CWE-79
Cross-site Scripting

Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Known Exploits & Detection

GitHub Security AdvisoryOfficial advisory with detailed explanation of SVG SMIL bypass

References & Sources

  • [1]Official GitHub Security Advisory
  • [2]Upstream Fix Commit (Branch Integration)
  • [3]Upstream Fix Commit (Reconciliation & Release)
  • [4]Official Pull Request
  • [5]Changelog Documentation

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 2 hours ago•CVE-2026-84305
5.1

CVE-2026-84305: Algorithmic Complexity Vulnerability (ReindentFilter CPU Exhaustion) in sqlparse

An algorithmic complexity vulnerability in the python sqlparse library versions before 0.6.0 allows an attacker to cause high CPU usage and denial of service via a crafted SQL statement during formatting.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 3 hours ago•CVE-2026-84309
6.9

CVE-2026-84309: Infinite Loop and CPU Exhaustion in pypdf TreeObject.insert_child

An infinite loop vulnerability in pypdf versions prior to 6.16.0 allows attackers to trigger computational resource exhaustion and complete thread locking by supplying a malformed PDF with a cyclic tree structure. When modifying or rewriting document outlines containing circular references, the library endlessly traverses /Next pointers, resulting in application denial of service.

Alon Barad
Alon Barad
5 views•6 min read
•about 4 hours ago•CVE-2026-84311
4.8

CVE-2026-84311: Algorithmic Complexity Denial of Service in pypdf

CVE-2026-84311 (GHSA-763m-79hh-57f2) is an algorithmic complexity Denial of Service (DoS) vulnerability in the pypdf library. Prior to version 6.16.1, the library does not place limits on iterations during the parsing of PDF document outlines and recursive Form XObject (XForm) expansions. An attacker can craft a malicious, highly compressed PDF document containing nested structures which, when parsed, trigger exponential iteration paths, resulting in severe CPU and memory exhaustion.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 5 hours ago•CVE-2026-84310
4.8

CVE-2026-84310: Algorithmic Complexity Exhaustion in pypdf

An algorithmic complexity vulnerability in the pypdf library before version 6.16.1 allows remote or local attackers to cause an application denial of service. The flaw is triggered via maliciously crafted PDF documents that utilize either deeply nested outlines or exponential Directed Acyclic Graph (DAG) structures in Form XObjects.

Alon Barad
Alon Barad
2 views•7 min read
•about 6 hours ago•CVE-2026-77567
8.1

CVE-2026-77567: Multi-Factor Authentication Bypass in Filament App-Based MFA

An authentication bypass vulnerability exists in Filament's app-based (TOTP/authenticator) multi-factor authentication (MFA) system when recovery codes are enabled. This allow attackers possessing primary credentials to bypass the second-factor authentication check entirely by manipulating the Livewire state during the challenge-form validation lifecycle.

Alon Barad
Alon Barad
6 views•7 min read
•about 7 hours ago•CVE-2026-84307
3.7

CVE-2026-84307: Authentication Oracle and Multi-Factor Authentication Challenge Leak in Filament

An authentication oracle vulnerability exists in Filament before 4.12.5 and 5.7.5. The application initiates MFA challenge workflows prior to verifying user authorization policies, allowing unauthenticated attackers to validate guessed credentials.

Alon Barad
Alon Barad
4 views•6 min read