{"id":"CVE-2026-121447","kind":"vulnerability","aliases":["CVE-2026-121447"],"related":[],"title":"svg-sanitizer: javascript URLs in animateTransform bypass sanitization, enabling XSS","description":"svg-sanitizer before 1.1.0 contains a cross-site scripting vulnerability that allows attackers to bypass sanitization by placing javascript: URLs in the animateTransform values attribute. Attackers can upload crafted SVG files whose animateTransform targets the href attribute, executing arbitrary JavaScript when Safari users click the link.","summary":"svg-sanitizer before 1.1.0 fails to strip javascript: URLs placed in the animateTransform values attribute, so a crafted SVG can smuggle script through the sanitizer. When a user clicks the resulting link in Safari, arbitrary JavaScript runs in the page's origin.","severity":"medium","cvss":6.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["file-upload","node","package","svg-sanitizer","xss"],"not_affected_if":["not-using-svg-sanitizer","sanitized-version-1.1.0","svg-not-rendered"],"how_to_check":"- Check the installed version of svg-sanitizer with `npm ls svg-sanitizer` or the lockfile.\n- Search your code for places where SVG uploads are sanitized with svg-sanitizer and then rendered inline or served from your domain.","fix":"- svg-sanitizer `1.1.0` (fixed release per the description: all versions before 1.1.0 are affected).","status":"open","published_at":"2026-11-03T15:17:37+00:00","first_seen_at":"2026-11-03T15:22:01+00:00","triaged_at":"2026-11-03T15:23:19+00:00","updated_at":"2026-11-03T15:23:19+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-03T15:23:19Z","model":"claude-haiku-5-5","output":{"fix":"- svg-sanitizer `1.1.0` (fixed release per the description: all versions before 1.1.0 are affected).","reach":"internet","title":"svg-sanitizer: javascript URLs in animateTransform bypass sanitization, enabling XSS","impact":"medium","summary":"svg-sanitizer before 1.1.0 fails to strip javascript: URLs placed in the animateTransform values attribute, so a crafted SVG can smuggle script through the sanitizer. When a user clicks the resulting link in Safari, arbitrary JavaScript runs in the page's origin.","audience":"developers","category":"package","nicknames":[],"who_cares":["svg-sanitizer","node","file-upload","xss"],"confidence":0.7,"fix_status":"available","needs_auth":"unknown","worst_case":"arbitrary JavaScript runs in victim's browser session","analyst_note":"","how_to_check":"- Check the installed version of svg-sanitizer with `npm ls svg-sanitizer` or the lockfile.\n- Search your code for places where SVG uploads are sanitized with svg-sanitizer and then rendered inline or served from your domain.","plain_action":"","needs_analyst":false,"not_affected_if":["not-using-svg-sanitizer","svg-not-rendered","sanitized-version-1.1.0"],"who_is_affected":"Applications that use svg-sanitizer to clean user-uploaded SVG files and then display them to other users, especially on the same origin as the app. Apps that do not use the library, or that never render sanitized SVGs to browsers, are not exposed. Exploitation needs a victim who clicks the crafted link in Safari.","user_interaction":"yes","needs_special_setup":"unknown","severity_if_unknown":"medium"},"cost_usd":0.000726,"input_tokens":4186,"output_tokens":614,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-121447':14A,17A '-2026':13A,16A '1.1.0':31B,74C 'allow':83C 'animatetransform':7A,40B,94C,104C 'arbitrari':62B,110C 'attack':84C,97C 'attribut':42B,96C,108C 'bypass':8A,86C 'click':56B,115C 'contain':75C 'craft':45B,100C 'cross':78C 'cross-sit':77C 'cve':12A,15A 'enabl':10A 'execut':109C 'fail':32B 'file':19B,102C 'file-upload':18B 'href':107C 'javascript':4A,35B,63B,90C,111C 'link':59B,117C 'node':21B 'origin':69B 'packag':22B 'page':67B 'place':37B,89C 'result':58B 'run':64B 'safari':61B,113C 'sanit':3A,9A,25B,29B,52B,72C,87C 'script':49B,80C 'site':79C 'smuggl':48B 'strip':34B 'svg':2A,24B,28B,46B,71C,101C 'svg-sanit':1A,23B,27B,70C 'target':105C 'upload':20B,99C 'url':5A,36B,91C 'user':55B,114C 'valu':41B,95C 'vulner':81C 'whose':103C 'xss':11A,26B","nicknames":[],"mitigations":[],"who_affected":"Applications that use svg-sanitizer to clean user-uploaded SVG files and then display them to other users, especially on the same origin as the app. Apps that do not use the library, or that never render sanitized SVGs to browsers, are not exposed. Exploitation needs a victim who clicks the crafted link in Safari.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["fileupload","medium","node","package","svgsanitizer","xss"],"first_public_at":"2026-10-19T12:09:17+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"disclosure@vulncheck.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-121447","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-121447","severity":null,"published_at":"2026-11-03T15:17:37+00:00","modified_at":"2026-11-03T15:17:37+00:00","first_seen_at":"2026-11-03T15:22:01+00:00","fetched_at":"2026-11-03T15:22:01+00:00","note":null}],"documents":[{"id":58421,"url":"https://github.com/darylldoyle/svg-sanitizer/security/advisories/GHSA-q546-85r6-f39q","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-19T12:09:17+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"},{"id":58422,"url":"https://www.vulncheck.com/advisories/svg-sanitizer-before-1.1.0-xss-via-animatetransform-on-safari","title":"Third-party advisory: www.vulncheck.com","kind":"advisory","source":"nvd","publisher":"research","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Third-party advisory: www.vulncheck.com"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}