CVE-2026-84370
SVGO: removeScripts allows executable links through namespace and control-character bypasses
SVGO, short for SVG Optimizer, is a Node.js library and command-line application for optimizing SVG files. From version 1.0.0 until versions 2.8.4, 3.3.5, and 4.1.0, the opt-in removeScripts plugin, named removeScriptElement in versions 2 and 3, incompletely filters executable links in plugins/removeScripts.js and lib/svgo/tools.js. The plugin does not recognize namespace-prefixed SVG anchor elements such as svg:a with href or namespaced *:href values, and it does not remove ASCII tab, line-feed, or carriage-return characters before checking URL schemes. Browsers remove those characters before parsing a scheme, allowing an executable link to pass the plugin's check. When an application processes attacker-controlled SVG input and serves the result in an active browser context, a victim who activates the surviving link can execute script in the SVG's origin, expose data, modify content, or perform actions as the victim. This issue is fixed in versions 2.8.4, 3.3.5, and 4.1.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
8.2
SVGO: removeScripts allows executable links through namespace and control-character bypasses
SVGO, short for SVG Optimizer, is a Node.js library and command-line application for optimizing SVG files. From version 1.0.0 until versions 2.8.4, 3.3.5, and 4.1.0, the opt-in removeScripts plugin, named removeScriptElement in versions 2 and 3, incompletely filters executable links in plugins/removeScripts.js and lib/svgo/tools.js. The plugin does not recognize namespace-prefixed SVG anchor elements such as svg:a with href or namespaced *:href values, and it does not remove ASCII tab, line-feed, or carriage-return characters before checking URL schemes. Browsers remove those characters before parsing a scheme, allowing an executable link to pass the plugin's check. When an application processes attacker-controlled SVG input and serves the result in an active browser context, a victim who activates the surviving link can execute script in the SVG's origin, expose data, modify content, or perform actions as the victim. This issue is fixed in versions 2.8.4, 3.3.5, and 4.1.0.
- Record
CVE-2026-84370- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N - Weakness
- CWE-79, CWE-184
- Updated
- 2026-11-02
EUVDEUVD-2026-69653
8.2
SVGO, short for SVG Optimizer, is a Node.js library and command-line application for optimizing SVG files. From version 1.0.0 until versions 2.8.4, 3.3.5, and 4.1.0, the opt-in removeScripts plugin, named removeScriptElement in versions 2 and 3, incompletely filters executable links in plugins/removeScripts.js and lib/svgo/tools.js. The plugin does not recognize namespace-prefixed SVG anchor elements such as svg:a with href or namespaced *:href values, and it does not remove ASCII tab, line-feed, or carriage-return characters before checking URL schemes. Browsers remove those characters before parsing a scheme, allowing an executable link to pass the plugin's check. When an application processes attacker-controlled SVG input and serves the result in an active browser context, a victim who activates the surviving link can execute script in the SVG's origin, expose data, modify content, or perform actions as the victim. This issue is fixed in versions 2.8.4, 3.3.5, and 4.1.0.
- Record
EUVD-2026-69653- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-w27v-7q3p-w38r
8.2
SVGO: removeScripts allows executable links through namespace and control-character bypasses
Summary
SVGO's opt-in removeScripts plugin failed to remove some executable links. Namespace-prefixed SVG anchors and URL schemes containing ASCII tabs or newlines could bypass its checks. Applications that used this plugin as their only protection for untrusted SVG input could expose users to cross-site scripting (XSS).
SVGO is an optimizer rather than a comprehensive sanitization library, but removeScripts is maintained for consumers that already rely on it to remove common script execution paths.
Details
Two related bypasses were present:
- The plugin inspected unprefixed SVG
<a>elements but did not recognize namespace-prefixed SVG anchors such as<svg:a>when the prefix was bound to the SVG namespace. Their executablehrefor namespaced*:hrefvalues remained intact. - The URL check did not account for ASCII tab, line-feed, or carriage-return characters embedded in a scheme. Browsers remove these characters before parsing the scheme, so values such as
java	script:could remain executable after bypassing the plugin'sjavascript:check.
Anchors in unrelated custom namespaces are not executable SVG anchors and remain untouched.
Impact
If an application optimized attacker-controlled SVGs with removeScripts and then served the result in an active browser context, a victim could follow a link that executes script in the SVG's origin. Depending on the embedding and origin configuration, this could expose cookies or local storage, modify content, or perform actions as the victim.
The plugin is opt-in, so consumers that do not enable it are not relying on the affected behavior. Typical local optimization of trusted SVG files is not affected.
Patches
Upgrade to one of the following releases for the maintained release line in use:
| Release line | Patched version | Plugin |
| --- | --- | --- |
| v2 | 2.8.4 | removeScriptElement |
| v3 | 3.3.5 | removeScriptElement |
| v4 | 4.1.0 | removeScripts |
The fix makes SVG anchor handling namespace-aware and strips ASCII tabs, line feeds, and carriage returns before checking executable URL schemes.
SVGO v1 is no longer maintained. Users of v1 should upgrade to a supported release line.
Workarounds
For hostile input, use a dedicated SVG sanitization tool before passing the SVG to SVGO. Applications can also reject links from untrusted SVG input and avoid serving user-controlled SVGs in an active same-origin context.
References
- v4 fix: https://github.com/svg/svgo/pull/2268
- related executable URL hardening: https://github.com/svg/svgo/pull/2263
- v3 backport: https://github.com/svg/svgo/pull/2269
- v2 backport: https://github.com/svg/svgo/pull/2272
- v4.1.0 release: https://github.com/svg/svgo/releases/tag/v4.1.0
- v3.3.5 release: https://github.com/svg/svgo/releases/tag/v3.3.5
- v2.8.4 release: https://github.com/svg/svgo/releases/tag/v2.8.4
- Record
GHSA-w27v-7q3p-w38r- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N - Weakness
- CWE-79, CWE-184
- Updated
- 2026-11-02
NVD
8.2
SVGO, short for SVG Optimizer, is a Node.js library and command-line application for optimizing SVG files. From version 1.0.0 until versions 2.8.4, 3.3.5, and 4.1.0, the opt-in removeScripts plugin, named removeScriptElement in versions 2 and 3, incompletely filters executable links in plugins/removeScripts.js and lib/svgo/tools.js. The plugin does not recognize namespace-prefixed SVG anchor elements such as svg:a with href or namespaced *:href values, and it does not remove ASCII tab, line-feed, or carriage-return characters before checking URL schemes. Browsers remove those characters before parsing a scheme, allowing an executable link to pass the plugin's check. When an application processes attacker-controlled SVG input and serves the result in an active browser context, a victim who activates the surviving link can execute script in the SVG's origin, expose data, modify content, or perform actions as the victim. This issue is fixed in versions 2.8.4, 3.3.5, and 4.1.0.
- Record
CVE-2026-84370- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N - Weakness
- CWE-79, CWE-184
- Updated
- 2026-11-02
OSV
8.2
SVGO: removeScripts allows executable links through namespace and control-character bypasses
SVGO, short for SVG Optimizer, is a Node.js library and command-line application for optimizing SVG files. From version 1.0.0 until versions 2.8.4, 3.3.5, and 4.1.0, the opt-in removeScripts plugin, named removeScriptElement in versions 2 and 3, incompletely filters executable links in plugins/removeScripts.js and lib/svgo/tools.js. The plugin does not recognize namespace-prefixed SVG anchor elements such as svg:a with href or namespaced *:href values, and it does not remove ASCII tab, line-feed, or carriage-return characters before checking URL schemes. Browsers remove those characters before parsing a scheme, allowing an executable link to pass the plugin's check. When an application processes attacker-controlled SVG input and serves the result in an active browser context, a victim who activates the surviving link can execute script in the SVG's origin, expose data, modify content, or perform actions as the victim. This issue is fixed in versions 2.8.4, 3.3.5, and 4.1.0.
- Record
CVE-2026-84370- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N - Weakness
- CWE-184, CWE-79
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-84370
8.2
SVGO, short for SVG Optimizer, is a Node.js library and command-line application for optimizing SVG files. From version 1.0.0 until versions 2.8.4, 3.3.5, and 4.1.0, the opt-in removeScripts plugin, named removeScriptElement in versions 2 and 3, incompletely filters executable links in plugins/removeScripts.js and lib/svgo/tools.js. The plugin does not recognize namespace-prefixed SVG anchor elements such as svg:a with href or namespaced *:href values, and it does not remove ASCII tab, line-feed, or carriage-return characters before checking URL schemes. Browsers remove those characters before parsing a scheme, allowing an executable link to pass the plugin's check. When an application processes attacker-controlled SVG input and serves the result in an active browser context, a victim who activates the surviving link can execute script in the SVG's origin, expose data, modify content, or perform actions as the victim. This issue is fixed in versions 2.8.4, 3.3.5, and 4.1.0.
- Record
DEBIAN-CVE-2026-84370- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N - Updated
- 2026-11-02
Show 9 moreShow less
OSVGHSA-w27v-7q3p-w38r
8.2
SVGO: removeScripts allows executable links through namespace and control-character bypasses
Summary
SVGO's opt-in removeScripts plugin failed to remove some executable links. Namespace-prefixed SVG anchors and URL schemes containing ASCII tabs or newlines could bypass its checks. Applications that used this plugin as their only protection for untrusted SVG input could expose users to cross-site scripting (XSS).
SVGO is an optimizer rather than a comprehensive sanitization library, but removeScripts is maintained for consumers that already rely on it to remove common script execution paths.
Details
Two related bypasses were present:
- The plugin inspected unprefixed SVG
<a>elements but did not recognize namespace-prefixed SVG anchors such as<svg:a>when the prefix was bound to the SVG namespace. Their executablehrefor namespaced*:hrefvalues remained intact. - The URL check did not account for ASCII tab, line-feed, or carriage-return characters embedded in a scheme. Browsers remove these characters before parsing the scheme, so values such as
java	script:could remain executable after bypassing the plugin'sjavascript:check.
Anchors in unrelated custom namespaces are not executable SVG anchors and remain untouched.
Impact
If an application optimized attacker-controlled SVGs with removeScripts and then served the result in an active browser context, a victim could follow a link that executes script in the SVG's origin. Depending on the embedding and origin configuration, this could expose cookies or local storage, modify content, or perform actions as the victim.
The plugin is opt-in, so consumers that do not enable it are not relying on the affected behavior. Typical local optimization of trusted SVG files is not affected.
Patches
Upgrade to one of the following releases for the maintained release line in use:
| Release line | Patched version | Plugin |
| --- | --- | --- |
| v2 | 2.8.4 | removeScriptElement |
| v3 | 3.3.5 | removeScriptElement |
| v4 | 4.1.0 | removeScripts |
The fix makes SVG anchor handling namespace-aware and strips ASCII tabs, line feeds, and carriage returns before checking executable URL schemes.
SVGO v1 is no longer maintained. Users of v1 should upgrade to a supported release line.
Workarounds
For hostile input, use a dedicated SVG sanitization tool before passing the SVG to SVGO. Applications can also reject links from untrusted SVG input and avoid serving user-controlled SVGs in an active same-origin context.
References
- v4 fix: https://github.com/svg/svgo/pull/2268
- related executable URL hardening: https://github.com/svg/svgo/pull/2263
- v3 backport: https://github.com/svg/svgo/pull/2269
- v2 backport: https://github.com/svg/svgo/pull/2272
- v4.1.0 release: https://github.com/svg/svgo/releases/tag/v4.1.0
- v3.3.5 release: https://github.com/svg/svgo/releases/tag/v3.3.5
- v2.8.4 release: https://github.com/svg/svgo/releases/tag/v2.8.4
- Record
GHSA-w27v-7q3p-w38r- CVSS 3.1
- 8.2 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N - Weakness
- CWE-184, CWE-79
- Updated
- 2026-11-02
OSVCLSA-2026-1788978124 No score
TuxCare security update for svgo (2 CVEs)
TuxCare rebuilt svgo to address 2 CVEs. Fixed in 4.0.2-tuxcare.1.
- Record
CLSA-2026-1788978124- Updated
- 2026-11-02
OSVCLSA-2026-1788978264 No score
TuxCare security update for svgo (2 CVEs)
TuxCare rebuilt svgo to address 2 CVEs. Fixed in 2.8.0-tuxcare.3.
- Record
CLSA-2026-1788978264- Updated
- 2026-11-02
OSVCLSA-2026-1791843793 No score
TuxCare security update for svgo (2 CVEs)
TuxCare rebuilt svgo to address 2 CVEs. Fixed in 1.3.2-tuxcare.2.
- Record
CLSA-2026-1791843793- Updated
- 2026-11-02
OSVCLSA-2026-1792163346 No score
TuxCare security update for svgo (3 CVEs)
TuxCare rebuilt svgo to address 3 CVEs. Fixed in 4.0.1-tuxcare.1.
- Record
CLSA-2026-1792163346- Updated
- 2026-11-02
OSVCLSA-2026-1792183680 No score
TuxCare security update for svgo (3 CVEs)
TuxCare rebuilt svgo to address 3 CVEs. Fixed in 2.8.2-tuxcare.1.
- Record
CLSA-2026-1792183680- Updated
- 2026-11-02
OSVCLSA-2026-1793045772 No score
TuxCare security update for svgo (2 CVEs)
TuxCare rebuilt svgo to address 2 CVEs. Fixed in 2.8.3-tuxcare.1.
- Record
CLSA-2026-1793045772- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:12070-1 No score
velociraptor-0.76.7.0.git145.b60ef1146-1.1 on GA media
These are all security issues fixed in the velociraptor-0.76.7.0.git145.b60ef1146-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:12070-1- Updated
- 2026-11-02
OSVROOT-APP-NPM-CVE-2026-84370 No score
CVE-2026-84370 in svgo - Patched by Root
Root has patched CVE-2026-84370 in the svgo package for Root:npm. Multiple fixed versions available.
- Record
ROOT-APP-NPM-CVE-2026-84370- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
svgonpm |
1.0.0 up to 2.8.4 | 2.8.4 |
svgonpm |
3.0.0 up to 3.3.5 | 3.3.5 |
svgonpm |
4.0.0 up to 4.1.0 | 4.1.0 |
svgoTuxCare:npm From an advisory covering 2 CVEs |
4.0.2-tuxcare.0 up to 4.0.2-tuxcare.1, plus listed versions 4.0.2 |
4.0.2-tuxcare.1 |
svgoTuxCare:npm From an advisory covering 2 CVEs |
2.8.0-tuxcare.0 up to 2.8.0-tuxcare.3, plus listed versions 2.8.02.8.0-tuxcare.12.8.0-tuxcare.2 |
2.8.0-tuxcare.3 |
svgoTuxCare:npm From an advisory covering 2 CVEs |
1.3.2-tuxcare.0 up to 1.3.2-tuxcare.2, plus listed versions 1.3.21.3.2-tuxcare.1 |
1.3.2-tuxcare.2 |
svgoTuxCare:npm From an advisory covering 3 CVEs |
4.0.1-tuxcare.0 up to 4.0.1-tuxcare.1, plus listed versions 4.0.1 |
4.0.1-tuxcare.1 |
svgoTuxCare:npm From an advisory covering 3 CVEs |
2.8.2-tuxcare.0 up to 2.8.2-tuxcare.1, plus listed versions 2.8.2 |
2.8.2-tuxcare.1 |
svgoTuxCare:npm From an advisory covering 2 CVEs |
2.8.3-tuxcare.0 up to 2.8.3-tuxcare.1, plus listed versions 2.8.3 |
2.8.3-tuxcare.1 |
node-svgoDebian:14 |
before 3.3.5+ds-1, plus listed versions 3.3.2+ds-1 |
3.3.5+ds-1 |
svgoRoot:npm |
before 3.3.3-aikido.3 | 3.3.3-aikido.33.3.4-aikido.12.8.0-aikido.53.3.2-aikido.31.3.2-aikido.41.3.0-aikido.32.8.3-aikido.1 |
@rootio/svgoRoot:npm |
before 3.3.3-root.io.3 | 3.3.3-root.io.33.3.4-root.io.12.8.0-root.io.53.3.2-root.io.31.3.2-root.io.41.3.0-root.io.32.8.3-root.io.1 |
velociraptoropenSUSE:Tumbleweed From an advisory covering 40 CVEs |
before 0.76.7.0.git145.b60ef1146-1.1 | 0.76.7.0.git145.b60ef1146-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-84370 is a high vulnerability (CVSS 8.2) in Svg Svgo, published September 1, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.53%, the 44th percentile. Fixed in svgo 2.8.4.
References
github.com/svg/svgo/security/advisories/GHSA-w27v-7q3p-w38r
github.com/svg/svgo/pull/2268
github.com/svg/svgo/pull/2269
github.com/svg/svgo/pull/2272
github.com/svg/svgo/commit/0557385564a5c6c11d76cd934a6cff94451e532c
github.com/svg/svgo/commit/3db3ef33e409a0bc0fdaf255e46c908b00e93bc2
Show 49 moreShow less
github.com/svg/svgo/commit/994a9f00d79ddec68ce19a1ce9eb8ca08d747e4f
github.com/svg/svgo/releases/tag/v2.8.4
github.com/svg/svgo/releases/tag/v3.3.5
github.com/svg/svgo/releases/tag/v4.1.0
nvd.nist.gov/vuln/detail/CVE-2026-84370
github.com/advisories/GHSA-w27v-7q3p-w38r
github.com/CVEProject/cvelistV5/tree/main/cves/2026/84xxx/CVE-2026-84370.json
security-tracker.debian.org/tracker/CVE-2026-84370
github.com/svg/svgo
suse.com/security/cve/CVE-2025-0914
suse.com/security/cve/CVE-2026-12143
suse.com/security/cve/CVE-2026-14257
suse.com/security/cve/CVE-2026-17535
suse.com/security/cve/CVE-2026-18348
suse.com/security/cve/CVE-2026-18636
suse.com/security/cve/CVE-2026-18638
suse.com/security/cve/CVE-2026-18639
suse.com/security/cve/CVE-2026-18860
suse.com/security/cve/CVE-2026-27601
suse.com/security/cve/CVE-2026-29074
suse.com/security/cve/CVE-2026-41650
suse.com/security/cve/CVE-2026-45623
suse.com/security/cve/CVE-2026-49356
suse.com/security/cve/CVE-2026-5329
suse.com/security/cve/CVE-2026-53550
suse.com/security/cve/CVE-2026-55602
suse.com/security/cve/CVE-2026-56852
suse.com/security/cve/CVE-2026-59869
suse.com/security/cve/CVE-2026-6290
suse.com/security/cve/CVE-2026-64951
suse.com/security/cve/CVE-2026-64952
suse.com/security/cve/CVE-2026-64954
suse.com/security/cve/CVE-2026-65903
suse.com/security/cve/CVE-2026-65912
suse.com/security/cve/CVE-2026-65913
suse.com/security/cve/CVE-2026-65914
suse.com/security/cve/CVE-2026-67314
suse.com/security/cve/CVE-2026-67320
suse.com/security/cve/CVE-2026-6863
suse.com/security/cve/CVE-2026-69152
suse.com/security/cve/CVE-2026-69153
suse.com/security/cve/CVE-2026-6948
suse.com/security/cve/CVE-2026-73086
suse.com/security/cve/CVE-2026-73646
suse.com/security/cve/CVE-2026-73650
suse.com/security/cve/CVE-2026-7572
suse.com/security/cve/CVE-2026-7573
suse.com/security/cve/CVE-2026-84369
suse.com/security/cve/CVE-2026-84370