Update dependency dompurify to v3 [SECURITY]#36
Open
renovate[bot] wants to merge 1 commit intomasterfrom
Open
Conversation
9191272 to
842f8cf
Compare
842f8cf to
e584b80
Compare
e584b80 to
44be7e0
Compare
44be7e0 to
7685d12
Compare
7685d12 to
7d31167
Compare
7d31167 to
f447b8a
Compare
f447b8a to
a37445f
Compare
a37445f to
07a1428
Compare
07a1428 to
c7fc78c
Compare
c7fc78c to
f53b484
Compare
f53b484 to
4c928b6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^2.0.8→^3.0.0GitHub Vulnerability Alerts
CVE-2024-45801
It has been discovered that malicious HTML using special nesting techniques can bypass the depth checking added to DOMPurify in recent releases. It was also possible to use Prototype Pollution to weaken the depth check.
This renders dompurify unable to avoid XSS attack.
Fixed by cure53/DOMPurify@1e52026 (3.x branch) and cure53/DOMPurify@26e1d69 (2.x branch).
Severity
CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:NCVE-2024-47875
DOMpurify was vulnerable to nesting-based mXSS
fixed by 0ef5e537 (2.x) and
merge 943
Backporter should be aware of GHSA-mmhx-hmjr-r674 (CVE-2024-45801) when cherry-picking
POC is avaible under test
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:H/SA:HCVE-2024-48910
dompurify was vulnerable to prototype pollution
Fixed by cure53/DOMPurify@d1dd037
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:NCVE-2025-26791
DOMPurify before 3.2.4 has an incorrect template literal regular expression when SAFE_FOR_TEMPLATES is set to true, sometimes leading to mutation cross-site scripting (mXSS).
Severity
CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:NGHSA-h8r8-wccr-v5f2
Description
A mutation-XSS (mXSS) condition was confirmed when sanitized HTML is reinserted into a new parsing context using
innerHTMLand special wrappers. The vulnerable wrappers confirmed in browser behavior arescript,xmp,iframe,noembed,noframes, andnoscript. The payload remains seemingly benign afterDOMPurify.sanitize(), but mutates during the second parse into executable markup with an event handler, enabling JavaScript execution in the client (alert(1)in the PoC).Vulnerability
The root cause is context switching after sanitization: sanitized output is treated as trusted and concatenated into a wrapper string (for example,
<xmp> ... </xmp>or other special wrappers) before being reparsed by the browser. In this flow, attacker-controlled text inside an attribute (for example</xmp>or equivalent closing sequences for each wrapper) closes the special parsing context early and reintroduces attacker markup (<img ... onerror=...>) outside the original attribute context. DOMPurify sanitizes the original parse tree, but the application performs a second parse in a different context, reactivating dangerous tokens (classic mXSS pattern).PoC
http://localhost:3001.Wrapper en sinktoxmp.Sanitize + Render.Sanitized responsestill contains the</xmp>sequence insidealt.<img src="x" onerror="alert('expoc')">.alert('expoc')is triggered.{ "name": "expoc", "version": "1.0.0", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node server.js", "dev": "node server.js" }, "keywords": [], "author": "", "license": "ISC", "description": "", "dependencies": { "dompurify": "^3.3.1", "express": "^5.2.1", "jsdom": "^28.1.0" } }Evidence
daft-video.webm
Why This Happens
This is a mutation-XSS pattern caused by a parse-context mismatch:
xmpraw-text behavior).</xmp>) gains structural meaning in parse 2 and alters DOM structure.Sanitization is not a universal guarantee across all future parsing contexts. The sink design reintroduces risk.
Remediation Guidance
innerHTML.textContent,createElement,setAttribute) over string-based HTML composition.xmp,script, etc.).</xmp>,</noscript>, similar parser-breakout markers).Reported by Oscar Uribe, Security Researcher at Fluid Attacks. Camilo Vera and Cristian Vargas from the Fluid Attacks Research Team have identified a mXSS via Re-Contextualization in DomPurify 3.3.1.
Following Fluid Attacks Disclosure Policy, if this report corresponds to a vulnerability and the conditions outlined in the policy are met, this advisory will be published on the website over the next few days (the timeline may vary depending on maintainers' willingness to attend to and respond to this report) at the following URL: https://fluidattacks.com/advisories/daft
Acknowledgements: Camilo Vera and Cristian Vargas.
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:L/SA:NGHSA-cj63-jhhr-wcxv
Summary
When
USE_PROFILESis enabled, DOMPurify rebuildsALLOWED_ATTRas a plain array before populating it with the requested allowlists. Because the sanitizer still looks up attributes viaALLOWED_ATTR[lcName], anyArray.prototypeproperty that is polluted also counts as an allowlisted attribute. An attacker who can setArray.prototype.onclick = true(or a runtime already subject to prototype pollution) can thus force DOMPurify to keep event handlers such asonclickeven when they are normally forbidden. The provided PoC sanitizes<img onclick=...>withUSE_PROFILESand adds the sanitized output to the DOM; the polluted prototype allows the event handler to survive and execute, turning what should be a blocklist into a silent XSS vector.Impact
Prototype pollution makes DOMPurify accept dangerous event handler attributes, which bypasses the sanitizer and results in DOM-based XSS once the sanitized markup is rendered.
Credits
Identified by Cantina’s Apex (https://www.cantina.security).
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:L/VA:N/SC:L/SI:L/SA:NGHSA-cjmm-f4jc-qw8r
Summary
DOMPurify allows
ADD_ATTRto be provided as a predicate function viaEXTRA_ELEMENT_HANDLING.attributeCheck. When the predicate returnstrue,_isValidAttributeshort-circuits the attribute check before URI-safe validation runs. An attacker who supplies a predicate that accepts specific attribute/tag combinations can then sanitize input such as<a href="javascript:alert(document.domain)">and have thejavascript:URL survive, because URI validation is skipped for that attribute while other checks still pass. The provided PoC acceptshreffor anchors and then triggers a click inside an iframe, showing that the sanitized payload executes despite the protocol bypass.Impact
Predicate-based allowlisting bypasses DOMPurify's URI validation, allowing unsafe protocols such as
javascript:to reach the DOM and execute whenever the link is activated, resulting in DOM-based XSS.Credits
Identified by Cantina’s Apex (https://www.cantina.security).
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:NGHSA-39q2-94rc-95cp
Summary
In
src/purify.ts:1117-1123,ADD_TAGSas a function (viaEXTRA_ELEMENT_HANDLING.tagCheck) bypassesFORBID_TAGSdue to short-circuit evaluation.The condition:
When
tagCheck(tagName)returnstrue, the entire condition isfalseand the element is kept —FORBID_TAGS[tagName]is never evaluated.Inconsistency
This contradicts the attribute-side pattern at line 1214 where
FORBID_ATTRexplicitly wins first:For tags, FORBID should also take precedence over ADD.
Impact
Applications using both
ADD_TAGSas a function andFORBID_TAGSsimultaneously get unexpected behavior — forbidden tags are allowed through. Config-dependent but a genuine logic inconsistency.Suggested Fix
Check
FORBID_TAGSbeforetagCheck:Affected Version
v3.3.3 (commit 883ac15)
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:NRelease Notes
cure53/DOMPurify (dompurify)
v3.4.0: DOMPurify 3.4.0Compare Source
Most relevant changes:
FORBID_TAGSnot winning overADD_TAGS, thanks @kodareef5ADD_ATTR/ADD_TAGSfunction leaking into subsequent array-based calls, thanks @1Jesper1SAFE_FOR_TEMPLATESscrub inRETURN_DOMpath, thanks @bencalifCUSTOM_ELEMENT_HANDLING, thanks @trace37labsADD_TAGSfunction form bypassingFORBID_TAGS, thanks @eddieranADD_ATTRpredicates skipping URI validation, thanks @christos-ethUSE_PROFILESprototype pollution, thanks @christos-ethPublished Advisories are here:
https://github.com/cure53/DOMPurify/security/advisories?state=published
v3.3.3: DOMPurify 3.3.3Compare Source
v3.3.2: DOMPurify 3.3.2Compare Source
_isValidAttribute, thanks @christos-ethv3.3.1: DOMPurify 3.3.1Compare Source
ADD_FORBID_CONTENTSsetting to extend default list, thanks @MariusRumpfv3.3.0: DOMPurify 3.3.0Compare Source
mask-typeattribute to default allow-list, thanks @prasadrajandranADD_ATTRandADD_TAGSto accept functions, thanks @nelstromslotelement being in both SVG and HTML allow-list, thanks @Wim-Valgaerenv3.2.7: DOMPurify 3.2.7Compare Source
tagNameparameter to custom elementattributeNameCheck, thanks @nelstromhrefattributes, thanks @llamakkov3.2.6: DOMPurify 3.2.6Compare Source
matrix:as an allowed URI scheme, thanks @kleinesfilmroellchenv3.2.5: DOMPurify 3.2.5Compare Source
ALLOWED_URI_REGEXPusing the 'g' flag, thanks @hhk-pngv3.2.4: DOMPurify 3.2.4Compare Source
v3.2.3: DOMPurify 3.2.3Compare Source
v3.2.2: DOMPurify 3.2.2Compare Source
v3.2.1: DOMPurify 3.2.1Compare Source
v3.2.0: DOMPurify 3.2.0Compare Source
v3.1.7: DOMPurify 3.1.7Compare Source
foreignObjectelement from the list of HTML entry-points, thanks @masatokinugawav3.1.6: DOMPurify 3.1.6Compare Source
v3.1.5: DOMPurify 3.1.5Compare Source
bower.js, thanks @HakumenNCv3.1.4: DOMPurify 3.1.4Compare Source
isNaNchecks, thanks @tulachv3.1.3: DOMPurify 3.1.3Compare Source
nodeTypeproperty, thanks @ssi02014v3.1.2: DOMPurify 3.1.2Compare Source
v3.1.1: DOMPurify 3.1.1Compare Source
Note that this is a security release and should be upgraded to immediately. Please also note that further releases may follow as the underlying vulnerability is apparently new and further variations may be discovered.
v3.1.0: DOMPurify 3.1.0Compare Source
SAFE_FOR_XMLto enable better control over comment scrubbingv3.0.11: DOMPurify 3.0.11Compare Source
v3.0.10: DOMPurify 3.0.10Compare Source
v3.0.9: DOMPurify 3.0.9Compare Source
hasOwnPropertylogic, thanks @ssi02014console.warnmaking HappyDom happier, thanks @HugoPoiv3.0.8: DOMPurify 3.0.8Compare Source
v3.0.7: DOMPurify 3.0.7Compare Source
v3.0.6: DOMPurify 3.0.6Compare Source
v3.0.5: DOMPurify 3.0.5Compare Source
v3.0.4: DOMPurify 3.0.4Compare Source
shadowrootmodwhich should beshadowrootmode, thanks @masatokinugawav3.0.3: DOMPurify 3.0.3Compare Source
TRUSTED_TYPES_POLICYconfiguration option, thanks @dejangfeDropShadowto the SVG filter allow-list, thanks @SelfMadeSystemv3.0.2: DOMPurify 3.0.2Compare Source
ALLOWED_URI_REGEXPnot being reset, thanks @mukilanemprescriptstag to allowed MathML elements, thanks @duyhai94v3.0.1: DOMPurify 3.0.1Compare Source
v3.0.0: DOMPurify 3.0.0Compare Source
ALLOW_SELF_CLOSE_IN_ATTRflag, thanks @edg2s @AndreVirtimoshadowrootmode, thanks @mfreed7NOTE Please use the 2.4.4 release if you still need MSIE support, 3.0.0 comes without the MSIE overhead
v2.5.9: DOMPurify 2.5.9Compare Source
v2.5.8: DOMPurify 2.5.8Compare Source
v2.5.7: DOMPurify 2.5.7Compare Source
foreignObjectelement from the list of HTML entry-points, thanks @masatokinugawav2.5.6: DOMPurify 2.5.6Compare Source
v2.5.5: DOMPurify 2.5.5Compare Source
bower.js, thanks @HakumenNCv2.5.4: DOMPurify 2.5.4Compare Source
isNaNchecks affecting MSIE, thanks @tulachv2.5.3: DOMPurify 2.5.3Compare Source
v2.5.2: DOMPurify 2.5.2Compare Source
v2.5.1: DOMPurify 2.5.1Compare Source
Note that this is a security release and should be upgraded to immediately. Please also note that further releases may follow as the underlying vulnerability is apparently new and further variations may be discovered.
v2.5.0: DOMPurify 2.5.0Compare Source
SAFE_FOR_XMLto enable better control over comment scrubbingv2.4.9: DOMPurify 2.4.9Compare Source
v2.4.8: DOMPurify 2.4.8Compare Source
v2.4.7: DOMPurify 2.4.7Compare Source
v2.4.6: DOMPurify 2.4.6Compare Source
noframeselement is permitted, thanks @leeNv2.4.5: DOMPurify 2.4.5Compare Source
v2.4.4: DOMPurify 2.4.4Compare Source
ALLOW_SELF_CLOSE_IN_ATTRflag, thanks @edg2s @AndreVirtimoshadowrootmode, thanks @mfreed7v2.4.3: DOMPurify 2.4.3Compare Source
v2.4.2: DOMPurify 2.4.2Compare Source
v2.4.1: DOMPurify 2.4.1Compare Source
ALLOWED_NAMESPACESfor better XML handling, thanks @kevin-deyoungster @tosmolkaSAFE_FOR_TEMPLATESistruev2.4.0: DOMPurify 2.4.0Compare Source
v2.3.12: DOMPurify 2.3.12Compare Source
v2.3.11: DOMPurify 2.3.11Compare Source
v2.3.10: DOMPurify 2.3.10Compare Source
v2.3.9: DOMPurify 2.3.9Compare Source
v2.3.8: DOMPurify 2.3.8Compare Source
No other changes compared to 2.3.7 release, which entail:
v2.3.7Compare Source
v2.3.6: DOMPurify 2.3.6Compare Source
v2.3.5: DOMPurify 2.3.5Compare Source
v2.3.4: DOMPurify 2.3.4Compare Source
feImageelements, thanks @ydanivv2.3.3: DOMPurify 2.3.3Compare Source
PARSER_MEDIA_TYPEspotted by @securitum-mbv2.3.2: DOMPurify 2.3.2Compare Source
PARSER_MEDIA_TYPE, thanks @tosmolkav2.3.1: DOMPurify 2.3.1Compare Source
FORBID_CONTENTSsetting configurableroleto URI-safe attributesv2.3.0: DOMPurify 2.3.0Compare Source
v2.2.9: DOMPurify 2.2.9Compare Source
NAMESPACEconfigv2.2.8: DOMPurify 2.2.8Compare Source
NAMESPACEconfig option, thanks @NateScarletv2.2.7: DOMPurify 2.2.7Compare Source
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.