CVE-2026-65900
DOMPurify before 3.4.8 Template Expression Injection via RETURN_DOM
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside <template> element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Active
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used 5.1
DOMPurify before 3.4.8 Template Expression Injection via RETURN_DOM
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside <template> element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
- Record
CVE-2026-65900- CVSS 4.0
- 5.1 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
EUVDEUVD-2026-48269 5.1
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside <template> element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
- Record
EUVD-2026-48269- CVSS 4.0
- 5.1 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-gvmj-g25r-r7wr 2.0
DOMPurify: SAFE_FOR_TEMPLATES bypass - template expressions survive sanitization inside <template> content when using DOM output modes
Summary
When DOMPurify is configured with both SAFE_FOR_TEMPLATES: true and RETURN_DOM: true (or IN_PLACE: true), an attacker can inject template expressions, such as ${evil}, {{evil}}, or <%evil%>, that survive the sanitization pass inside <template> element content. This bypasses the explicit purpose of SAFE_FOR_TEMPLATES, which is to prevent template engine evaluation of user-supplied content.
Note: The string output path is not affected. Only the DOM return paths (
RETURN_DOM: true,RETURN_DOM_FRAGMENT: true,IN_PLACE: true) are vulnerable.
Description
Background
SAFE_FOR_TEMPLATES is designed to strip {{ }}, ${ }, and <% %> expressions from sanitized output so that downstream template engines do not evaluate user-controlled content. The feature operates through two mechanisms:
- Per-node scrubbing (
_sanitizeElements,src/purify.ts:1403), scrubs individual text nodes during the main sanitization walk. - Final normalization pass (
_scrubTemplateExpressions,src/purify.ts:1115), callsnode.normalize()to merge adjacent text nodes, then walks the merged nodes and strips any expressions that only appeared after merging.
The Gap
_scrubTemplateExpressions uses a standard NodeIterator rooted at the output body:
// src/purify.ts:1117
const walker = createNodeIterator.call(
node.ownerDocument || node,
node,
NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | ...,
null
);
Per the DOM specification, a NodeIterator does not descend into <template>.content. The template element's content is a separate DocumentFragment that lives outside the normal child-node tree. For the same reason, node.normalize() (called on line 1116) also does not normalize text nodes inside <template>.content.
This means the final normalization and scrub pass, the only pass that catches expressions formed by merging split text nodes, never runs on <template> content.
How Split Text Nodes Are Created
When DOMPurify removes a disallowed element with KEEP_CONTENT: true (the default), it moves the element's text children into the parent node. This is the standard code path at src/purify.ts:1361–1373:
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
const parentNode = getParentNode(currentNode);
const childNodes = getChildNodes(currentNode);
if (childNodes && parentNode) {
for (let i = childCount - 1; i >= 0; --i) {
const childClone = cloneNode(childNodes[i], true);
parentNode.insertBefore(childClone, getNextSibling(currentNode));
}
}
}
If the removed elements were adjacent siblings inside <template> content, their extracted text nodes end up as adjacent text nodes in the template content fragment. Each individual text node is scrubbed by _sanitizeElements, but since $ and {evil} do not match any expression regex on their own, neither is modified.
The code comment at src/purify.ts:1100 explicitly acknowledges the threat class:
"which only form after text-node normalization (e.g. fragments split across stripped elements) cannot survive into a template-evaluating framework."
The implementation guards against this on the main body, but the guard is not applied to <template> content.
Proof of Concept
Why the Split Works
The bypass relies on splitting ${...} across two adjacent custom elements so that neither fragment matches any DOMPurify regex on its own:
| Fragment | Against TMPLIT_EXPR /\${[\w\W]*/g | Against MUSTACHE_EXPR /{{[\w\W]*\|^[\w\W]*}}/g | Result |
|---|---|---|---|
| $ | Requires ${ - no { follows | No {{ or }} | Survives |
| {alert(document.domain)} | Requires leading $ - absent | No {{, ends with single } not }} | Survives |
| ${alert(document.domain)} | Full match - would be stripped | - | Stripped if seen whole |
DOMPurify only sees each fragment in isolation. It never merges them before…
- Record
GHSA-gvmj-g25r-r7wr- CVSS 4.0
- 2.0 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N/E:P - Weakness
- CWE-79
- Updated
- 2026-11-02
NVD 5.1
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside <template> element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
- Record
CVE-2026-65900- CVSS 4.0
- 5.1 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/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 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
OSV 5.1
DOMPurify before 3.4.8 Template Expression Injection via RETURN_DOM
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside <template> element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
- Record
CVE-2026-65900- CVSS 4.0
- 5.1 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N - Weakness
- CWE-79
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-65900 5.1
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside <template> element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
- Record
DEBIAN-CVE-2026-65900- CVSS 4.0
- 5.1 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/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 - Updated
- 2026-11-02
Show 33 moreShow less
OSVGHSA-gvmj-g25r-r7wr 2.0
DOMPurify: SAFE_FOR_TEMPLATES bypass - template expressions survive sanitization inside <template> content when using DOM output modes
Summary
When DOMPurify is configured with both SAFE_FOR_TEMPLATES: true and RETURN_DOM: true (or IN_PLACE: true), an attacker can inject template expressions, such as ${evil}, {{evil}}, or <%evil%>, that survive the sanitization pass inside <template> element content. This bypasses the explicit purpose of SAFE_FOR_TEMPLATES, which is to prevent template engine evaluation of user-supplied content.
Note: The string output path is not affected. Only the DOM return paths (
RETURN_DOM: true,RETURN_DOM_FRAGMENT: true,IN_PLACE: true) are vulnerable.
Description
Background
SAFE_FOR_TEMPLATES is designed to strip {{ }}, ${ }, and <% %> expressions from sanitized output so that downstream template engines do not evaluate user-controlled content. The feature operates through two mechanisms:
- Per-node scrubbing (
_sanitizeElements,src/purify.ts:1403), scrubs individual text nodes during the main sanitization walk. - Final normalization pass (
_scrubTemplateExpressions,src/purify.ts:1115), callsnode.normalize()to merge adjacent text nodes, then walks the merged nodes and strips any expressions that only appeared after merging.
The Gap
_scrubTemplateExpressions uses a standard NodeIterator rooted at the output body:
// src/purify.ts:1117
const walker = createNodeIterator.call(
node.ownerDocument || node,
node,
NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | ...,
null
);
Per the DOM specification, a NodeIterator does not descend into <template>.content. The template element's content is a separate DocumentFragment that lives outside the normal child-node tree. For the same reason, node.normalize() (called on line 1116) also does not normalize text nodes inside <template>.content.
This means the final normalization and scrub pass, the only pass that catches expressions formed by merging split text nodes, never runs on <template> content.
How Split Text Nodes Are Created
When DOMPurify removes a disallowed element with KEEP_CONTENT: true (the default), it moves the element's text children into the parent node. This is the standard code path at src/purify.ts:1361–1373:
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
const parentNode = getParentNode(currentNode);
const childNodes = getChildNodes(currentNode);
if (childNodes && parentNode) {
for (let i = childCount - 1; i >= 0; --i) {
const childClone = cloneNode(childNodes[i], true);
parentNode.insertBefore(childClone, getNextSibling(currentNode));
}
}
}
If the removed elements were adjacent siblings inside <template> content, their extracted text nodes end up as adjacent text nodes in the template content fragment. Each individual text node is scrubbed by _sanitizeElements, but since $ and {evil} do not match any expression regex on their own, neither is modified.
The code comment at src/purify.ts:1100 explicitly acknowledges the threat class:
"which only form after text-node normalization (e.g. fragments split across stripped elements) cannot survive into a template-evaluating framework."
The implementation guards against this on the main body, but the guard is not applied to <template> content.
Proof of Concept
Why the Split Works
The bypass relies on splitting ${...} across two adjacent custom elements so that neither fragment matches any DOMPurify regex on its own:
| Fragment | Against TMPLIT_EXPR /\${[\w\W]*/g | Against MUSTACHE_EXPR /{{[\w\W]*\|^[\w\W]*}}/g | Result |
|---|---|---|---|
| $ | Requires ${ - no { follows | No {{ or }} | Survives |
| {alert(document.domain)} | Requires leading $ - absent | No {{, ends with single } not }} | Survives |
| ${alert(document.domain)} | Full match - would be stripped | - | Stripped if seen whole |
DOMPurify only sees each fragment in isolation. It never merges them before…
- Record
GHSA-gvmj-g25r-r7wr- CVSS 4.0
- 2.0 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N/E:P - Weakness
- CWE-79
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-65900 5.1
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside <template> element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
- Record
UBUNTU-CVE-2026-65900- CVSS 4.0
- 5.1 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Updated
- 2026-11-02
OSVCLSA-2026-1784596279No score
TuxCare security update for dompurify (7 CVEs)
TuxCare rebuilt dompurify to address 7 CVEs. Fixed in 3.0.3-tuxcare.2.
- Record
CLSA-2026-1784596279- Updated
- 2026-11-02
OSVCLSA-2026-1784682987No score
TuxCare security update for dompurify (8 CVEs)
TuxCare rebuilt dompurify to address 8 CVEs. Fixed in 3.2.3-tuxcare.2.
- Record
CLSA-2026-1784682987- Updated
- 2026-11-02
OSVCLSA-2026-1786731853No score
TuxCare security update for dompurify (10 CVEs)
TuxCare rebuilt dompurify to address 10 CVEs. Fixed in 3.2.3-tuxcare.3.
- Record
CLSA-2026-1786731853- Updated
- 2026-11-02
OSVCLSA-2026-1786731971No score
TuxCare security update for dompurify (7 CVEs)
TuxCare rebuilt dompurify to address 7 CVEs. Fixed in 3.1.6-tuxcare.7.
- Record
CLSA-2026-1786731971- Updated
- 2026-11-02
OSVCLSA-2026-1787602198No score
TuxCare security update for dompurify (10 CVEs)
TuxCare rebuilt dompurify to address 10 CVEs. Fixed in 3.2.7-tuxcare.1.
- Record
CLSA-2026-1787602198- Updated
- 2026-11-02
OSVCLSA-2026-1789154068No score
TuxCare security update for dompurify (12 CVEs)
TuxCare rebuilt dompurify to address 12 CVEs. Fixed in 3.0.3-tuxcare.5.
- Record
CLSA-2026-1789154068- Updated
- 2026-11-02
OSVCLSA-2026-1792155851No score
TuxCare security update for dompurify (12 CVEs)
TuxCare rebuilt dompurify to address 12 CVEs. Fixed in 3.1.3-tuxcare.2.
- Record
CLSA-2026-1792155851- Updated
- 2026-11-02
OSVCLSA-2026-1792156267No score
TuxCare security update for dompurify (9 CVEs)
TuxCare rebuilt dompurify to address 9 CVEs. Fixed in 3.1.2-tuxcare.2.
- Record
CLSA-2026-1792156267- Updated
- 2026-11-02
OSVCLSA-2026-1792156282No score
TuxCare security update for dompurify (11 CVEs)
TuxCare rebuilt dompurify to address 11 CVEs. Fixed in 3.1.4-tuxcare.2.
- Record
CLSA-2026-1792156282- Updated
- 2026-11-02
OSVCLSA-2026-1792156382No score
TuxCare security update for dompurify (9 CVEs)
TuxCare rebuilt dompurify to address 9 CVEs. Fixed in 3.0.2-tuxcare.2.
- Record
CLSA-2026-1792156382- Updated
- 2026-11-02
OSVCLSA-2026-1792156589No score
TuxCare security update for dompurify (10 CVEs)
TuxCare rebuilt dompurify to address 10 CVEs. Fixed in 3.0.9-tuxcare.2.
- Record
CLSA-2026-1792156589- Updated
- 2026-11-02
OSVCLSA-2026-1792156694No score
TuxCare security update for dompurify (11 CVEs)
TuxCare rebuilt dompurify to address 11 CVEs. Fixed in 3.0.8-tuxcare.2.
- Record
CLSA-2026-1792156694- Updated
- 2026-11-02
OSVCLSA-2026-1792156909No score
TuxCare security update for dompurify (10 CVEs)
TuxCare rebuilt dompurify to address 10 CVEs. Fixed in 3.0.1-tuxcare.2.
- Record
CLSA-2026-1792156909- Updated
- 2026-11-02
OSVCLSA-2026-1792157013No score
TuxCare security update for dompurify (13 CVEs)
TuxCare rebuilt dompurify to address 13 CVEs. Fixed in 3.1.0-tuxcare.2.
- Record
CLSA-2026-1792157013- Updated
- 2026-11-02
OSVCLSA-2026-1792157113No score
TuxCare security update for dompurify (12 CVEs)
TuxCare rebuilt dompurify to address 12 CVEs. Fixed in 3.0.11-tuxcare.2.
- Record
CLSA-2026-1792157113- Updated
- 2026-11-02
OSVCLSA-2026-1792369062No score
TuxCare security update for dompurify (1 CVE)
TuxCare rebuilt dompurify to address 1 CVE. Fixed in 2.5.9-tuxcare.9.
- Record
CLSA-2026-1792369062- Updated
- 2026-11-02
OSVCLSA-2026-1792369452No score
TuxCare security update for dompurify (6 CVEs)
TuxCare rebuilt dompurify to address 6 CVEs. Fixed in 3.0.6-tuxcare.3.
- Record
CLSA-2026-1792369452- Updated
- 2026-11-02
OSVCLSA-2026-1792424561No score
TuxCare security update for dompurify (9 CVEs)
TuxCare rebuilt dompurify to address 9 CVEs. Fixed in 3.3.3-tuxcare.3.
- Record
CLSA-2026-1792424561- Updated
- 2026-11-02
OSVCLSA-2026-1792424669No score
TuxCare security update for dompurify (9 CVEs)
TuxCare rebuilt dompurify to address 9 CVEs. Fixed in 3.2.6-tuxcare.3.
- Record
CLSA-2026-1792424669- Updated
- 2026-11-02
OSVCLSA-2026-1792453557No score
TuxCare security update for dompurify (5 CVEs)
TuxCare rebuilt dompurify to address 5 CVEs. Fixed in 3.0.5-tuxcare.2.
- Record
CLSA-2026-1792453557- Updated
- 2026-11-02
OSVCLSA-2026-1792473150No score
TuxCare security update for dompurify (1 CVE)
TuxCare rebuilt dompurify to address 1 CVE. Fixed in 2.4.3-tuxcare.9.
- Record
CLSA-2026-1792473150- Updated
- 2026-11-02
OSVCLSA-2026-1792479087No score
TuxCare security update for dompurify (5 CVEs)
TuxCare rebuilt dompurify to address 5 CVEs. Fixed in 3.0.4-tuxcare.2.
- Record
CLSA-2026-1792479087- Updated
- 2026-11-02
OSVCLSA-2026-1792486389No score
TuxCare security update for dompurify (1 CVE)
TuxCare rebuilt dompurify to address 1 CVE. Fixed in 2.3.0-tuxcare.7.
- Record
CLSA-2026-1792486389- Updated
- 2026-11-02
OSVCLSA-2026-1792486395No score
TuxCare security update for dompurify (4 CVEs)
TuxCare rebuilt dompurify to address 4 CVEs. Fixed in 3.4.5-tuxcare.3.
- Record
CLSA-2026-1792486395- Updated
- 2026-11-02
OSVCLSA-2026-1792495764No score
TuxCare security update for dompurify (4 CVEs)
TuxCare rebuilt dompurify to address 4 CVEs. Fixed in 3.4.6-tuxcare.3.
- Record
CLSA-2026-1792495764- Updated
- 2026-11-02
OSVCLSA-2026-1792496892No score
TuxCare security update for dompurify (2 CVEs)
TuxCare rebuilt dompurify to address 2 CVEs. Fixed in 3.4.7-tuxcare.3.
- Record
CLSA-2026-1792496892- Updated
- 2026-11-02
OSVCLSA-2026-1792594075No score
TuxCare security update for dompurify (11 CVEs)
TuxCare rebuilt dompurify to address 11 CVEs. Fixed in 3.1.1-tuxcare.3.
- Record
CLSA-2026-1792594075- Updated
- 2026-11-02
OSVCLSA-2026-1792761229No score
TuxCare security update for dompurify (1 CVE)
TuxCare rebuilt dompurify to address 1 CVE. Fixed in 2.4.7-tuxcare.7.
- Record
CLSA-2026-1792761229- Updated
- 2026-11-02
OSVCLSA-2026-1792933945No score
TuxCare security update for dompurify (12 CVEs)
TuxCare rebuilt dompurify to address 12 CVEs. Fixed in 3.4.0-tuxcare.1.
- Record
CLSA-2026-1792933945- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11723-1No score
python313-comfyui-frontend-package-1.52.7-1.1 on GA media
These are all security issues fixed in the python313-comfyui-frontend-package-1.52.7-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11723-1- Updated
- 2026-11-02
OSVROOT-APP-NPM-CVE-2026-65900No score
CVE-2026-65900 in @rootio/dompurify - Patched by Root
Root has patched CVE-2026-65900 in the @rootio/dompurify package for Root:npm. Multiple fixed versions available.
- Record
ROOT-APP-NPM-CVE-2026-65900- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
dompurifynpm | 3.0.0 to 3.4.7 | 3.4.8 |
dompurifyTuxCare:npm From an advisory covering 2 CVEs | 3.0.3-tuxcare.0 up to 3.0.3-tuxcare.2, plus listed versions 3.0.33.0.3-tuxcare.1 | 3.0.3-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 2 CVEs | 3.2.3-tuxcare.0 up to 3.2.3-tuxcare.2, plus listed versions 3.2.33.2.3-tuxcare.1 | 3.2.3-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 9 CVEs | 3.2.3-tuxcare.0 up to 3.2.3-tuxcare.3, plus listed versions 3.2.33.2.3-tuxcare.13.2.3-tuxcare.2 | 3.2.3-tuxcare.3 |
dompurifyTuxCare:npm From an advisory covering 6 CVEs | 3.1.6-tuxcare.0 up to 3.1.6-tuxcare.7, plus listed versions 3.1.63.1.6-tuxcare.13.1.6-tuxcare.23.1.6-tuxcare.33.1.6-tuxcare.43.1.6-tuxcare.53.1.6-tuxcare.6 | 3.1.6-tuxcare.7 |
dompurifyTuxCare:npm From an advisory covering 8 CVEs | 3.2.7-tuxcare.0 up to 3.2.7-tuxcare.1, plus listed versions 3.2.7 | 3.2.7-tuxcare.1 |
dompurifyTuxCare:npm From an advisory covering 11 CVEs | 3.0.3-tuxcare.0 up to 3.0.3-tuxcare.5, plus listed versions 3.0.33.0.3-tuxcare.13.0.3-tuxcare.23.0.3-tuxcare.33.0.3-tuxcare.4 | 3.0.3-tuxcare.5 |
dompurifyTuxCare:npm From an advisory covering 12 CVEs | 3.1.3-tuxcare.0 up to 3.1.3-tuxcare.2, plus listed versions 3.1.33.1.3-tuxcare.1 | 3.1.3-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 9 CVEs | 3.1.2-tuxcare.0 up to 3.1.2-tuxcare.2, plus listed versions 3.1.23.1.2-tuxcare.1 | 3.1.2-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 11 CVEs | 3.1.4-tuxcare.0 up to 3.1.4-tuxcare.2, plus listed versions 3.1.43.1.4-tuxcare.1 | 3.1.4-tuxcare.2 |
Show 28 moreShow less
| Package | Affected | Fixed |
|---|---|---|
dompurifyTuxCare:npm From an advisory covering 9 CVEs | 3.0.2-tuxcare.0 up to 3.0.2-tuxcare.2, plus listed versions 3.0.23.0.2-tuxcare.1 | 3.0.2-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 10 CVEs | 3.0.9-tuxcare.0 up to 3.0.9-tuxcare.2, plus listed versions 3.0.93.0.9-tuxcare.1 | 3.0.9-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 11 CVEs | 3.0.8-tuxcare.0 up to 3.0.8-tuxcare.2, plus listed versions 3.0.83.0.8-tuxcare.1 | 3.0.8-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 10 CVEs | 3.0.1-tuxcare.0 up to 3.0.1-tuxcare.2, plus listed versions 3.0.13.0.1-tuxcare.1 | 3.0.1-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 13 CVEs | 3.1.0-tuxcare.0 up to 3.1.0-tuxcare.2, plus listed versions 3.1.03.1.0-tuxcare.1 | 3.1.0-tuxcare.2 |
dompurifyTuxCare:npm From an advisory covering 12 CVEs | 3.0.11-tuxcare.0 up to 3.0.11-tuxcare.2, plus listed versions 3.0.113.0.11-tuxcare.1 | 3.0.11-tuxcare.2 |
dompurifyTuxCare:npm | 2.5.9-tuxcare.0 up to 2.5.9-tuxcare.9, plus listed versions 2.5.92.5.9-tuxcare.12.5.9-tuxcare.22.5.9-tuxcare.32.5.9-tuxcare.4 Show 4 moreShow less2.5.9-tuxcare.52.5.9-tuxcare.62.5.9-tuxcare.72.5.9-tuxcare.8 | 2.5.9-tuxcare.9 |
dompurifyTuxCare:npm From an advisory covering 6 CVEs | 3.0.6-tuxcare.0 up to 3.0.6-tuxcare.3, plus listed versions 3.0.63.0.6-tuxcare.13.0.6-tuxcare.2 | 3.0.6-tuxcare.3 |
dompurifyTuxCare:npm From an advisory covering 9 CVEs | 3.3.3-tuxcare.0 up to 3.3.3-tuxcare.3, plus listed versions 3.3.33.3.3-tuxcare.13.3.3-tuxcare.2 | 3.3.3-tuxcare.3 |
dompurifyTuxCare:npm From an advisory covering 9 CVEs | 3.2.6-tuxcare.0 up to 3.2.6-tuxcare.3, plus listed versions 3.2.63.2.6-tuxcare.13.2.6-tuxcare.2 | 3.2.6-tuxcare.3 |
dompurifyTuxCare:npm From an advisory covering 5 CVEs | 3.0.5-tuxcare.0 up to 3.0.5-tuxcare.2, plus listed versions 3.0.53.0.5-tuxcare.1 | 3.0.5-tuxcare.2 |
dompurifyTuxCare:npm | 2.4.3-tuxcare.0 up to 2.4.3-tuxcare.9, plus listed versions 2.4.32.4.3-tuxcare.12.4.3-tuxcare.22.4.3-tuxcare.32.4.3-tuxcare.4 Show 4 moreShow less2.4.3-tuxcare.52.4.3-tuxcare.62.4.3-tuxcare.72.4.3-tuxcare.8 | 2.4.3-tuxcare.9 |
dompurifyTuxCare:npm From an advisory covering 5 CVEs | 3.0.4-tuxcare.0 up to 3.0.4-tuxcare.2, plus listed versions 3.0.43.0.4-tuxcare.1 | 3.0.4-tuxcare.2 |
dompurifyTuxCare:npm | 2.3.0-tuxcare.0 up to 2.3.0-tuxcare.7, plus listed versions 2.3.02.3.0-tuxcare.12.3.0-tuxcare.22.3.0-tuxcare.32.3.0-tuxcare.42.3.0-tuxcare.52.3.0-tuxcare.6 | 2.3.0-tuxcare.7 |
dompurifyTuxCare:npm From an advisory covering 4 CVEs | 3.4.5-tuxcare.0 up to 3.4.5-tuxcare.3, plus listed versions 3.4.53.4.5-tuxcare.13.4.5-tuxcare.2 | 3.4.5-tuxcare.3 |
dompurifyTuxCare:npm From an advisory covering 4 CVEs | 3.4.6-tuxcare.0 up to 3.4.6-tuxcare.3, plus listed versions 3.4.63.4.6-tuxcare.13.4.6-tuxcare.2 | 3.4.6-tuxcare.3 |
dompurifyTuxCare:npm From an advisory covering 2 CVEs | 3.4.7-tuxcare.0 up to 3.4.7-tuxcare.3, plus listed versions 3.4.73.4.7-tuxcare.13.4.7-tuxcare.2 | 3.4.7-tuxcare.3 |
dompurifyTuxCare:npm From an advisory covering 11 CVEs | 3.1.1-tuxcare.0 up to 3.1.1-tuxcare.3, plus listed versions 3.1.13.1.1-tuxcare.13.1.1-tuxcare.2 | 3.1.1-tuxcare.3 |
dompurifyTuxCare:npm | 2.4.7-tuxcare.0 up to 2.4.7-tuxcare.7, plus listed versions 2.4.72.4.7-tuxcare.12.4.7-tuxcare.22.4.7-tuxcare.32.4.7-tuxcare.42.4.7-tuxcare.52.4.7-tuxcare.6 | 2.4.7-tuxcare.7 |
dompurifyTuxCare:npm From an advisory covering 9 CVEs | 3.4.0-tuxcare.0 up to 3.4.0-tuxcare.1, plus listed versions 3.4.0 | 3.4.0-tuxcare.1 |
node-dompurifyDebian:12 | All versions, plus listed versions 2.4.1+dfsg+~2.4.0-12.4.1+dfsg+~2.4.0-22.4.1+dfsg+~2.4.0-2+deb12u13.0.9+dfsg+~3.0.5-13.1.6+dfsg+~3.0.5-1 Show 13 moreShow less3.1.7+dfsg+~3.0.5-13.1.7+dfsg+~3.0.5-23.2.5+dfsg-13.3.2+dfsg-13.3.3+dfsg-13.3.3+dfsg-23.4.1+dfsg-13.4.12+dfsg-13.4.13+dfsg-13.4.13+dfsg-23.4.16+dfsg-13.4.2+dfsg-13.4.5+dfsg-1 | None known |
node-dompurifyDebian:13 | All versions, plus listed versions 3.1.7+dfsg+~3.0.5-23.2.5+dfsg-13.3.2+dfsg-13.3.3+dfsg-13.3.3+dfsg-2 Show 7 moreShow less3.4.1+dfsg-13.4.12+dfsg-13.4.13+dfsg-13.4.13+dfsg-23.4.16+dfsg-13.4.2+dfsg-13.4.5+dfsg-1 | None known |
node-dompurifyDebian:14 | before 3.4.12+dfsg-1, plus listed versions 3.1.7+dfsg+~3.0.5-23.2.5+dfsg-13.3.2+dfsg-13.3.3+dfsg-13.3.3+dfsg-23.4.1+dfsg-13.4.2+dfsg-13.4.5+dfsg-1 | 3.4.12+dfsg-1 |
dompurifynpm | 3.0.0 up to 3.4.8 | 3.4.8 |
node-dompurifyUbuntu:22.04:LTS | All versions, plus listed versions 2.3.0+dfsg-22.3.3+dfsg-1 | None known |
node-dompurifyUbuntu:24.04:LTS | All versions, plus listed versions 2.4.1+dfsg+~2.4.0-13.0.9+dfsg+~3.0.5-1 | None known |
node-dompurifyUbuntu:26.04:LTS | All versions, plus listed versions 3.1.7+dfsg+~3.0.5-23.3.3+dfsg-1 | None known |
python-comfyui-frontend-packageopenSUSE:Tumbleweed From an advisory covering 3 CVEs | before 1.52.7-1.1 | 1.52.7-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, aliases, published, references | ||
| affected | ||
| facts | ||
| affected | ||
| first indexed | CVE List, EUVD, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-65900 is a medium vulnerability (CVSS 5.1) in Cure53 Dompurify, published June 15, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.31%, the 24th percentile. Fixed in dompurify 3.4.8.
References
github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr
vulncheck.com/advisories/dompurify-before-template-expression-injection-via-return-dom
github.com/advisories/GHSA-gvmj-g25r-r7wr
github.com/CVEProject/cvelistV5/tree/main/cves/2026/65xxx/CVE-2026-65900.json
nvd.nist.gov/vuln/detail/CVE-2026-65900
security-tracker.debian.org/tracker/CVE-2026-65900
Left out here: the rest of 2 source descriptions. The JSON record has them.