CVE-2024-47875
NoneCVSS
—
EPSS
1.1%
Published
Oct 11, 2024
CISA due date
—
Cloudanix analysis
A web content cleaning tool contained a flaw that could let attackers slip harmful code past its protections on sites that rely on it.
- Exploitation
- Requires User Interaction
- Attacker needs
- None
- Complexity
- Moderate
- Impact
- Data Exposure
- Component
- Library
- Class
- XSS
- Remediation
- Upgrade
- Effort
- Low
- Patch risk
- Low
What it actually does
Bypasses DOMPurify sanitization via nested HTML/MathML/SVG structures, allowing mXSS payload execution after processing.
Why it matters to the business
Applications relying on this sanitizer for user-generated content face risk of script injection that could lead to session hijacking or data exposure, though low exploit likelihood reduces immediate operational urgency.
How an attack unfolds
An attacker supplies crafted nested content that evades the sanitizer's nesting checks; after sanitization the payload executes as script in the browser context of users viewing the processed output.
How to fix it
Upgrade cure53/dompurify to version 2.5.0, 3.1.3, or apply commit 3fe78d7501103832166613bb1452985dd4674008 in all affected packages and rebuild dependent applications.
How to confirm the fix worked
Verify installed package versions against fixed releases, re-run sanitization unit tests with known nesting mXSS vectors, and confirm no bypass occurs on updated instances.
Typical attack path
- Locate web applications or libraries depending on vulnerable DOMPurify versions
- Craft a nesting-based mXSS payload targeting the sanitizer's weaknesses
- Deliver the payload through user-controlled input fields sanitized by the library
- Trigger rendering in a victim's browser to achieve script execution
How to detect it
Review application logs for unexpected script tags or execution events following sanitization calls; examine client-side rendered output for anomalies introduced by user input.
What your security team should do
- Prioritize upgrade of DOMPurify across all codebases due to direct XSS exposure
- Audit all sanitization call sites to ensure only fixed versions are in use
- Add dependency scanning to CI pipelines to prevent reintroduction of vulnerable releases
The record
DOMPurify is a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG. DOMpurify was vulnerable to nesting-based mXSS. This vulnerability is fixed in 2.5.0 and 3.1.3.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | dompurify | 0 | 2.5.0 |
| npm | dompurify | 3.0.0 | 3.1.3 |
| AlmaLinux:8 | grafana | 0 | 9.2.10-20.el8_10 |
| AlmaLinux:8 | grafana-selinux | 0 | 9.2.10-20.el8_10 |
| AlmaLinux:9 | grafana | 0 | 9.2.10-19.el9_4 |
| AlmaLinux:9 | grafana | 0 | 10.2.6-7.el9_5 |
| AlmaLinux:9 | grafana-selinux | 0 | 9.2.10-19.el9_4 |
| AlmaLinux:9 | grafana-selinux | 0 | 10.2.6-7.el9_5 |
| Chainguard | argo-workflow-cli | 0 | 3.6.0-r0 |
| Chainguard | argo-workflow-controller | 0 | 3.6.0-r0 |
| Chainguard | argo-workflow-controller-compat | 0 | 3.6.0-r0 |
| Chainguard | argo-workflow-executor | 0 | 3.6.0-r0 |
| Chainguard | argo-workflow-executor-compat | 0 | 3.6.0-r0 |
| Chainguard | argo-workflows | 0 | 3.6.0-r0 |
| Chainguard | argo-workflows-known-hosts | 0 | 3.6.0-r0 |
| Chainguard | argo-workflows-ui | 0 | 3.6.0-r0 |
| Chainguard | opensearch-dashboards-2-fips | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-alerting-dashboards-plugin | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-anomaly-detection-dashboards-plugin | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-config | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-maps | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-notifications | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-observability | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-query-workbench | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-reporting | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-search-relevance | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-visualizations | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-index-management-dashboards-plugin | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-ml-commons-dashboards | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-security-analytics-dashboards-plugin | 0 | 2.17.1-r0 |
| Chainguard | opensearch-dashboards-2-fips-security-dashboards-plugin | 0 | 2.17.1-r0 |
| Debian:11 | cacti | 0 | No fix |
| Debian:11 | cacti | 0 | 1.2.16+ds1-2+deb11u5 |
| Debian:12 | cacti | 0 | 1.2.24+ds1-1+deb12u2 |
| Debian:12 | node-dompurify | 0 | 2.4.1+dfsg+~2.4.0-2 |
| Debian:13 | cacti | 0 | 1.2.26+ds1-1 |
| Debian:13 | node-dompurify | 0 | No fix |
| Red Hat:enterprise_linux:8::appstream | grafana | 0 | 0:9.2.10-20.el8_10 |
| Red Hat:enterprise_linux:8::appstream | grafana-debuginfo | 0 | 0:9.2.10-20.el8_10 |
| Red Hat:enterprise_linux:8::appstream | grafana-debugsource | 0 | 0:9.2.10-20.el8_10 |
| Red Hat:enterprise_linux:8::appstream | grafana-selinux | 0 | 0:9.2.10-20.el8_10 |
| Red Hat:enterprise_linux:9::appstream | grafana | 0 | 0:9.2.10-19.el9_4 |
| Red Hat:enterprise_linux:9::appstream | grafana | 0 | 0:10.2.6-7.el9_5 |
| Red Hat:enterprise_linux:9::appstream | grafana-debuginfo | 0 | 0:9.2.10-19.el9_4 |
| Red Hat:enterprise_linux:9::appstream | grafana-debuginfo | 0 | 0:10.2.6-7.el9_5 |
| Red Hat:enterprise_linux:9::appstream | grafana-debugsource | 0 | 0:9.2.10-19.el9_4 |
| Red Hat:enterprise_linux:9::appstream | grafana-debugsource | 0 | 0:10.2.6-7.el9_5 |
| Red Hat:enterprise_linux:9::appstream | grafana-selinux | 0 | 0:9.2.10-19.el9_4 |
| Red Hat:enterprise_linux:9::appstream | grafana-selinux | 0 | 0:10.2.6-7.el9_5 |
| Rocky Linux:8 | grafana | 0 | 0:9.2.10-20.el8_10 |
| Rocky Linux:9 | grafana | 0 | 0:9.2.10-19.el9_4 |
| Rocky Linux:9 | grafana | 0 | 0:10.2.6-7.el9_5 |
| Ubuntu:22.04:LTS | node-dompurify | 0 | No fix |
| Ubuntu:24.04:LTS | node-dompurify | 0 | No fix |
| Ubuntu:24.10 | node-dompurify | 0 | No fix |
| Ubuntu:25.04 | node-dompurify | 0 | No fix |
| Ubuntu:25.10 | node-dompurify | 0 | No fix |
| Wolfi | argo-workflow-cli | 0 | 3.6.0-r0 |
| Wolfi | argo-workflow-controller | 0 | 3.6.0-r0 |
| Wolfi | argo-workflow-controller-compat | 0 | 3.6.0-r0 |
| Wolfi | argo-workflow-executor | 0 | 3.6.0-r0 |
| Wolfi | argo-workflow-executor-compat | 0 | 3.6.0-r0 |
| Wolfi | argo-workflows | 0 | 3.6.0-r0 |
| Wolfi | argo-workflows-known-hosts | 0 | 3.6.0-r0 |
| Wolfi | argo-workflows-ui | 0 | 3.6.0-r0 |
| openSUSE:Tumbleweed | velociraptor | 0 | 0.7.0.4.git142.862ef23-1.1 |
Related vulnerabilities
- GHSA-cmwh-pvxp-8882 DOMPurify: Permanent `ALLOWED_ATTR` pollution via `setConfig()` bypassing the hook… Also affects dompurify
- GHSA-vxr8-fq34-vvx9 DOMPurify: Trusted Types policy survives `clearConfig()` and can poison later… Also affects dompurify
- GHSA-gvmj-g25r-r7wr DOMPurify: SAFE_FOR_TEMPLATES bypass - template expressions survive sanitization inside… Also affects dompurify
- GHSA-rp9w-3fw7-7cwq DOMPurify IN_PLACE Sanitization Bypass via Attached Shadow Root Inside .content Also affects dompurify
- GHSA-x4vx-rjvf-j5p4 DOMPurify: `IN_PLACE` mode trusts attacker-controlled `nodeName` on live non-form nodes… Also affects dompurify
- GHSA-76mc-f452-cxcm DOMPurify: Hook mutation of `data.allowedTags` / `data.allowedAttributes` permanently… Also affects dompurify
- GHSA-hpcv-96wg-7vj8 DOMPurify: Cross-realm IN_PLACE sanitization leaves executable markup intact via… Also affects dompurify
- GHSA-r47g-fvhr-h676 DOMPurify: IN_PLACE mode preserves attributes of a clobbered root element, allowing XSS… Also affects dompurify