Packages / dompurify / Security
DOMPurify USE_PROFILES prototype pollution allows event handlers
Affected releases · dompurify
- 3.x3.0.0 – 3.3.1Fixed in 3.3.2
- 2.x2.0.0 – 2.5.9No fix on this line yet
- 1.x and older0.4.0 – 1.1.1No fix, no longer updated
On 3.x, the newest line:
npm install dompurify@3.3.2Affected
3.0.0 – 3.3.1
30 releases
Fixed
3.3.2 – 3.4.17
20 releases, latest
Affected
2.0.0 – 2.5.9
63 releases
Affected
1.0.0 – 1.1.1
14 releases
Affected
0.4.0 – 0.9.0
29 releases
Is your project affected?
Paste your package.json, or type the range you declare for dompurify. It is read in your browser and sent nowhere.
What happens
Summary
When USE_PROFILES is enabled, DOMPurify rebuilds ALLOWED_ATTR as a plain array before populating it with the requested allowlists. Because the sanitizer still looks up attributes via ALLOWED_ATTR[lcName], any Array.prototype property that is polluted also counts as an allowlisted attribute. An attacker who can set Array.prototype.onclick = true (or a runtime already subject to prototype pollution) can thus force DOMPurify to keep event handlers such as onclick even when they are normally forbidden. The provided PoC sanitizes <img onclick=...> with USE_PROFILES and 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 (cantina.security).