ApostropheCMS: Stored XSS via SVG SMIL URI-list scheme-policy bypass
ApostropheCMS is an open-source Node.js content management system, and sanitize-html provides a simple HTML sanitizer with a clear API. From version 1.9.0 until version 2.17.7, packages/sanitize-html/index.js validates an animation value attribute as one flat URL and does not recognize that attributeName selecting href or xlink:href gives the sibling values, from, to, or by attribute SVG SMIL URL semantics. In configurations that allow the animate, animateColor, animateMotion, animateTransform, or set elements, a values list can begin with a safe fragment and contain a later executable destination that survives allowedSchemesAppliedToAttributes checking. When the sanitized SVG is rendered, the browser can copy that later destination into the live link, and a victim who activates the link can execute script in the application's origin. This issue is fixed in version 2.17.7.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-84371
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 4 Nov 2026, 08:00 UTC · Revision 1
Source evidence
ApostropheCMS: Stored XSS via SVG SMIL URI-list scheme-policy bypass
core-osv · Original sourcePublished 1 Sept 2026, 20:51 UTC
ApostropheCMS is an open-source Node.js content management system, and sanitize-html provides a simple HTML sanitizer with a clear API. From version 1.9.0 until version 2.17.7, packages/sanitize-html/index.js validates an animation value attribute as one flat URL and does not recognize that attributeName selecting href or xlink:href gives the sibling values, from, to, or by attribute SVG SMIL URL semantics. In configurations that allow the animate, animateColor, animateMotion, animateTransform, or set elements, a values list can begin with a safe fragment and contain a later executable destination that survives allowedSchemesAppliedToAttributes checking. When the sanitized SVG is rendered, the browser can copy that later destination into the live link, and a victim who activates the link can execute script in the application's origin. This issue is fixed in version 2.17.7.
osv:CVE-2026-84371
Complete source record
{
"id": "9384476e6c61972df235e75a9a0783bc45dcb22f91ff154ef3f585214333f5d9",
"url": "https://osv.dev/vulnerability/CVE-2026-84371",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "ApostropheCMS: Stored XSS via SVG SMIL URI-list scheme-policy bypass",
"summary": "ApostropheCMS is an open-source Node.js content management system, and sanitize-html provides a simple HTML sanitizer with a clear API. From version 1.9.0 until version 2.17.7, packages/sanitize-html/index.js validates an animation value attribute as one flat URL and does not recognize that attributeName selecting href or xlink:href gives the sibling values, from, to, or by attribute SVG SMIL URL semantics. In configurations that allow the animate, animateColor, animateMotion, animateTransform, or set elements, a values list can begin with a safe fragment and contain a later executable destination that survives allowedSchemesAppliedToAttributes checking. When the sanitized SVG is rendered, the browser can copy that later destination into the live link, and a victim who activates the link can execute script in the application's origin. This issue is fixed in version 2.17.7.",
"evidence": "osv:CVE-2026-84371",
"products": [],
"severity": "medium",
"structured": {
"id": "CVE-2026-84371",
"aliases": [
"CVE-2026-84371",
"GHSA-g8qq-57p8-ggw5"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/apostrophecms/apostrophe",
"type": "GIT",
"events": [
{
"introduced": "c2e454f69e303c35fc6faae9b86332c2467bc3e2"
},
{
"fixed": "72f4531e7b491738049eec423d0c1c2342828e5f"
},
{
"fixed": "1135516a1a4a8f9638641c460488a43d8af20081"
},
{
"fixed": "38ff1106c8176b16c2da9872acd9b449adcbb949"
}
],
"database_specific": {
"extracted_events": [
{
"range": [
{
"introduced": "1.9.0"
},
{
"fixed": "2.17.7"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"range": [
{
"fixed": "1135516a1a4a8f9638641c460488a43d8af20081"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "38ff1106c8176b16c2da9872acd9b449adcbb949"
}
],
"source": "REFERENCES_COMMIT"
}
]
}
}
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-84371.json"
}
}
],
"modified": "2026-10-28T02:30:33.633981534Z",
"provider": "osv",
"references": [
"https://github.com/apostrophecms/apostrophe/blob/main/packages/sanitize-html/CHANGELOG.md",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/84xxx/CVE-2026-84371.json",
"https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-g8qq-57p8-ggw5",
"https://nvd.nist.gov/vuln/detail/CVE-2026-84371",
"https://github.com/apostrophecms/apostrophe/commit/1135516a1a4a8f9638641c460488a43d8af20081",
"https://github.com/apostrophecms/apostrophe/commit/38ff1106c8176b16c2da9872acd9b449adcbb949",
"https://github.com/apostrophecms/apostrophe/pull/5552"
],
"provider_metadata": {
"cwe_ids": [
"CWE-79"
],
"cna_assigner": "GitHub_M",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/84xxx/CVE-2026-84371.json"
}
},
"related_cves": [
{
"value": "CVE-2026-84371",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 501020,
"published_at": "2026-09-01T20:51:10.441+00:00"
}