{"id":"CVE-2026-121446","kind":"vulnerability","aliases":["CVE-2026-121446"],"related":[],"title":"svg-sanitizer: CSS escapes let SVG files fetch remote URLs","description":"svg-sanitizer from 0.5.0 before 1.1.0 contains an incomplete filtering vulnerability that allows attackers to bypass remote URL removal by using CSS escape sequences inside url() in SVG presentation attributes. Attackers can supply SVG files with attributes like fill containing escaped slashes that browsers resolve to remote URLs, triggering external requests and enabling data exfiltration.","summary":"svg-sanitizer versions from 0.5.0 before 1.1.0 fail to remove remote url() references written with CSS escape sequences in SVG presentation attributes such as fill. A crafted SVG passes the filter, and when a browser renders it the file makes external requests that can leak data.","severity":"medium","cvss":5.3,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["node","package","svg-sanitizer","user-uploads"],"not_affected_if":["no-untrusted-svg","not-using-svg-sanitizer"],"how_to_check":"- Check the installed version of svg-sanitizer in your project, for example with `npm ls svg-sanitizer` or by reading its package.json.\n- Look for any code path that passes user-supplied SVG through svg-sanitizer before serving or rendering it.","fix":"- svg-sanitizer: move to `1.1.0` or later","status":"open","published_at":"2026-11-03T15:17:36+00:00","first_seen_at":"2026-11-03T15:22:01+00:00","triaged_at":"2026-11-03T15:23:28+00:00","updated_at":"2026-11-03T15:23:28+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-03T15:23:28Z","model":"claude-haiku-5-5","output":{"fix":"- svg-sanitizer: move to `1.1.0` or later","reach":"internet","title":"svg-sanitizer: CSS escapes let SVG files fetch remote URLs","impact":"low","summary":"svg-sanitizer versions from 0.5.0 before 1.1.0 fail to remove remote url() references written with CSS escape sequences in SVG presentation attributes such as fill. A crafted SVG passes the filter, and when a browser renders it the file makes external requests that can leak data.","audience":"developers","category":"package","nicknames":[],"who_cares":["svg-sanitizer","node","user-uploads"],"confidence":0.6,"fix_status":"available","needs_auth":"no","worst_case":"Remote requests fire from rendered SVG, leaking data to attackers.","analyst_note":"","how_to_check":"- Check the installed version of svg-sanitizer in your project, for example with `npm ls svg-sanitizer` or by reading its package.json.\n- Look for any code path that passes user-supplied SVG through svg-sanitizer before serving or rendering it.","plain_action":"","needs_analyst":false,"not_affected_if":["not-using-svg-sanitizer","no-untrusted-svg"],"who_is_affected":"Applications that use svg-sanitizer to clean user-uploaded SVG files and then serve or render them in a browser are exposed. Projects that do not use this library, or that never accept untrusted SVG, can skip it.","user_interaction":"unknown","needs_special_setup":"no","severity_if_unknown":"medium"},"cost_usd":0.000692,"input_tokens":4214,"output_tokens":541,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-121446':14A,17A '-2026':13A,16A '0.5.0':31B,77C '1.1.0':33B,79C 'allow':86C 'attack':87C,104C 'attribut':48B,103C,110C 'browser':61B,117C 'bypass':89C 'contain':80C,113C 'craft':53B 'css':4A,42B,95C 'cve':12A,15A 'data':72B,127C 'enabl':126C 'escap':5A,43B,96C,114C 'exfiltr':128C 'extern':67B,123C 'fail':34B 'fetch':9A 'file':8A,65B,108C 'fill':51B,112C 'filter':57B,83C 'incomplet':82C 'insid':98C 'leak':71B 'let':6A 'like':111C 'make':66B 'node':18B 'packag':19B 'pass':55B 'present':47B,102C 'refer':39B 'remot':10A,37B,90C,120C 'remov':36B,92C 'render':62B 'request':68B,124C 'resolv':118C 'sanit':3A,22B,28B,75C 'sequenc':44B,97C 'slash':115C 'suppli':106C 'svg':2A,7A,21B,27B,46B,54B,74C,101C,107C 'svg-sanit':1A,20B,26B,73C 'trigger':122C 'upload':25B 'url':11A,38B,91C,99C,121C 'use':94C 'user':24B 'user-upload':23B 'version':29B 'vulner':84C 'written':40B","nicknames":[],"mitigations":[],"who_affected":"Applications that use svg-sanitizer to clean user-uploaded SVG files and then serve or render them in a browser are exposed. Projects that do not use this library, or that never accept untrusted SVG, can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["medium","node","package","svgsanitizer","useruploads"],"first_public_at":"2026-10-19T12:09:18+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:N/VA:N/SC:N/SI:N/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-121446","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-121446","severity":null,"published_at":"2026-11-03T15:17:36+00:00","modified_at":"2026-11-03T15:17:36+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":58419,"url":"https://github.com/darylldoyle/svg-sanitizer/security/advisories/GHSA-3vh3-jf65-656w","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-19T12:09:18+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"},{"id":58420,"url":"https://www.vulncheck.com/advisories/svg-sanitizer-0.5.0-before-1.1.0-incomplete-url-filtering-in-svg-attributes","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"}