{"id":"CVE-2026-121445","kind":"vulnerability","aliases":["CVE-2026-121445"],"related":[],"title":"svg-sanitizer: regex flaw lets crafted SVGs exhaust CPU or bypass sanitizing","description":"darylldoyle svg-sanitizer from 1.0.0 before 1.1.0 contains a regular expression denial of service vulnerability in the image-set pattern of stripRemoteCssTokens() when removeRemoteReferences is enabled. Attackers can submit SVGs with many unclosed image-set tokens to exhaust CPU, or trigger PCRE limits causing sanitize() to throw a TypeError and leave unsanitized content.","summary":"The svg-sanitizer npm package has a regular expression denial of service flaw in its remote CSS token stripping when removeRemoteReferences is enabled. Crafted SVGs with many unclosed image-set tokens can exhaust CPU, or make sanitize() throw and return unsanitized content.","severity":"high","cvss":8.2,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["node","package","svg-sanitizer","user-uploads"],"not_affected_if":["not-using-svg-sanitizer","removeremotereferences-disabled"],"how_to_check":"- Check the installed version of `svg-sanitizer` in your lockfile or with `npm ls svg-sanitizer`\n- Look for calls to `sanitize()` with `removeRemoteReferences` enabled on user-supplied SVGs","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:22:45+00:00","updated_at":"2026-11-03T15:22:45+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-03T15:22:45Z","model":"claude-haiku-5-5","output":{"fix":"- `svg-sanitizer` move to `1.1.0` or later","reach":"internet","title":"svg-sanitizer: regex flaw lets crafted SVGs exhaust CPU or bypass sanitizing","impact":"medium","summary":"The svg-sanitizer npm package has a regular expression denial of service flaw in its remote CSS token stripping when removeRemoteReferences is enabled. Crafted SVGs with many unclosed image-set tokens can exhaust CPU, or make sanitize() throw and return unsanitized content.","audience":"developers","category":"package","nicknames":[],"who_cares":["svg-sanitizer","node","user-uploads"],"confidence":0.6,"fix_status":"available","needs_auth":"unknown","worst_case":"Server CPU exhausted, or unsanitized SVG content passed through","analyst_note":"","how_to_check":"- Check the installed version of `svg-sanitizer` in your lockfile or with `npm ls svg-sanitizer`\n- Look for calls to `sanitize()` with `removeRemoteReferences` enabled on user-supplied SVGs","plain_action":"","needs_analyst":false,"not_affected_if":["not-using-svg-sanitizer","removeRemoteReferences-disabled"],"who_is_affected":"Applications that use svg-sanitizer from 1.0.0 before 1.1.0 to clean user-uploaded SVGs, especially with removeRemoteReferences enabled. Apps that do not sanitize untrusted SVGs or do not use that option are less exposed. The sources do not say how the sanitize() exception path is handled by callers.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000722,"input_tokens":4223,"output_tokens":599,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-121445':16A,19A '-2026':15A,18A '1.0.0':77C '1.1.0':79C 'attack':100C 'bypass':12A 'caus':118C 'contain':80C 'content':71B,127C 'cpu':10A,63B,113C 'craft':7A,52B 'css':45B 'cve':14A,17A 'darylldoyl':72C 'denial':38B,84C 'enabl':51B,99C 'exhaust':9A,62B,112C 'express':37B,83C 'flaw':5A,41B 'imag':58B,91C,108C 'image-set':57B,90C,107C 'leav':125C 'let':6A 'limit':117C 'make':65B 'mani':55B,105C 'node':20B 'npm':32B 'packag':21B,33B 'pattern':93C 'pcre':116C 'regex':4A 'regular':36B,82C 'remot':44B 'removeremoterefer':49B,97C 'return':69B 'sanit':3A,13A,24B,31B,66B,75C,119C 'servic':40B,86C 'set':59B,92C,109C 'strip':47B 'stripremotecsstoken':95C 'submit':102C 'svg':2A,23B,30B,74C 'svg-sanit':1A,22B,29B,73C 'svgs':8A,53B,103C 'throw':67B,121C 'token':46B,60B,110C 'trigger':115C 'typeerror':123C 'unclos':56B,106C 'unsanit':70B,126C 'upload':27B 'user':26B 'user-upload':25B 'vulner':87C","nicknames":[],"mitigations":[],"who_affected":"Applications that use svg-sanitizer from 1.0.0 before 1.1.0 to clean user-uploaded SVGs, especially with removeRemoteReferences enabled. Apps that do not sanitize untrusted SVGs or do not use that option are less exposed. The sources do not say how the sanitize() exception path is handled by callers.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["high","node","package","svgsanitizer","useruploads"],"first_public_at":"2026-10-19T12:09:20+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/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-121445","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-121445","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":58417,"url":"https://github.com/darylldoyle/svg-sanitizer/security/advisories/GHSA-94x8-pw3c-6qcq","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-19T12:09:20+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"},{"id":58418,"url":"https://www.vulncheck.com/advisories/svg-sanitizer-1.0.0-before-1.1.0-redos-and-fail-open-via-image-set-css-stripping","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"}