Every CVE Search/ Get API key

CVE-2026-58263

Jodit Editor: Mutation XSS in jodit clean-html via a MathML/style rawtext carrier

7.2 HighFix available

Jodit Editor is a WYSIWYG editor with a built-in file browser & image editor. In versions prior to 4.12.28, the built-in clean-html sanitizer can be bypassed by a MathML/<style> carrier that hides a dangerous element from the sanitizer's element walk, so a no-interaction event handler survives into the editor value, potentially causing Mutation XSS. When an application supplies attacker-influenced HTML to the editor's value-set or insertion paths, the sanitized output still contains a live <img ... onload=...> (or another non-onerror handler such as onfocus). A consumer that renders that output (element.innerHTML = editor.value) executes the handler with no user interaction. This issue has been fixed in version 4.12.28.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
Low
Integrity
Low
Availability
None

Exploit likelihood

0.22%Unchanged since Jul 2, 2026
90%50%10%1%

What each source reports

CVE List Score used 7.2

Jodit Editor: Mutation XSS in jodit clean-html via a MathML/style rawtext carrier

Jodit Editor is a WYSIWYG editor with a built-in file browser & image editor. In versions prior to 4.12.28, the built-in clean-html sanitizer can be bypassed by a MathML/<style> carrier that hides a dangerous element from the sanitizer's element walk, so a no-interaction event handler survives into the editor value, potentially causing Mutation XSS. When an application supplies attacker-influenced HTML to the editor's value-set or insertion paths, the sanitized output still contains a live <img ... onload=...> (or another non-onerror handler such as onfocus). A consumer that renders that output (element.innerHTML = editor.value) executes the handler with no user interaction. This issue has been fixed in version 4.12.28.

Record
CVE-2026-58263
CVSS 3.1
7.2 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
Weakness
CWE-79, CWE-83
Updated
2026-11-02
EUVDEUVD-2026-41140 7.2

Jodit Editor is a WYSIWYG editor with a built-in file browser & image editor. In versions prior to 4.12.28, the built-in clean-html sanitizer can be bypassed by a MathML/<style> carrier that hides a dangerous element from the sanitizer's element walk, so a no-interaction event handler survives into the editor value, potentially causing Mutation XSS. When an application supplies attacker-influenced HTML to the editor's value-set or insertion paths, the sanitized output still contains a live <img ... onload=...> (or another non-onerror handler such as onfocus). A consumer that renders that output (element.innerHTML = editor.value) executes the handler with no user interaction. This issue has been fixed in version 4.12.28.

Record
EUVD-2026-41140
CVSS 3.1
7.2 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-rxcw-mc6f-6hr3 7.2

Jodit Editor: Mutation XSS in jodit clean-html via a MathML/style rawtext carrier

Summary

jodit's built-in clean-html sanitizer can be bypassed by a MathML/<style> carrier that hides a dangerous element from the sanitizer's element walk, so a no-interaction event handler survives into the editor value. When an application supplies attacker-influenced HTML to the editor's value-set or insertion paths, the sanitized output still contains a live <img ... onload=...> (or another non-onerror handler such as onfocus). A consumer that renders that output (element.innerHTML = editor.value) executes the handler with no user interaction. This is a stored cross-site scripting vulnerability, confirmed live on the shipped es2021/jodit.min.js for 4.12.25 and the latest 4.12.27 (in Chromium via a client-side innerHTML consumer, and in Firefox via server-rendered / document-context output; see the cross-browser note under Proof of concept).

Details

The bypass exploits the order in which clean-html parses, walks, and re-serializes the value.

  1. On the value-set path, the clean-html plugin handles :beforeSetNativeEditorValue (src/plugins/clean-html/clean-html.ts:116), parsing the value into an inert document: sandBox.innerHTML = data.value.

  2. In that parse, the source nesting math > mtext > table > mglyph > style triggers MathML text-integration-point and foster-parenting rules: the <img> is parsed as text inside <style> (rawtext), not as an element. The <table> is foster-parented out, and the <mglyph> MathML text-integration point governs the namespace, so the <img> never becomes an element node in this parse.

  3. That value-set sanitizer is safeHTML (src/core/helpers/html/safe-html.ts:24); it walks the tree but acts on elements only (the Dom.isElement gate at :39) and runs against the parse-1 sandBox, in which the <img> is rawtext, not an element. So removeAllEventAttributes (the full on* strip at safe-html.ts:76) has no element to clean and the handler passes through. The onBeforeSetNativeEditorValue handler runs safeHTML on that parse-1 tree both before and after it captures the value, so neither pass ever sees the <img> as an element.

  4. The captured value (data.value = sandBox.innerHTML) is then assigned to the editable, a second parse, which hoists the <img> out of <style> and into the HTML namespace as a live element with its handler intact. The serialize-reparse moves the element across the tree and across namespaces:

BEFORE - parse 1 (sandBox): the <img> is <style> text
  <math>          [MathML]
    <mtext>       [MathML]
      <mglyph>    [HTML]      integration point: content parses as HTML
        <style>   [HTML]      text "<img ... onload=...>"   <-- <img> is RAWTEXT, not an element
      <table>     [HTML]

AFTER - editor.value (re-parsed): the <img> is hoisted OUT of <style>, live
  <p>             [HTML]
    <math>        [MathML]
      <mtext>     [MathML]
        <mglyph>  [MathML]
          <style> [MathML]    (now empty)
        <img>     [HTML]      <-- hoisted out, HTML namespace, LIVE -> its handler fires
        <table>   [HTML]
  1. editor.value now carries that live element. The value-set pass (Steps 1-4) only walked the parse-1 sandBox and never sees it; the other sanitizer, the on-change visitor (visitNodeWalker via a LazyWalker, clean-html.ts:56/:70), does reach the hoisted element, but its sanitizeAttributes filter calls sanitizeHTMLElement (safe-html.ts:139), which strips onerror only - it never reads the removeEventAttributes flag sanitizeAttributes passes it (sanitize-attributes.ts:30), so it never runs the full on* strip. So onload, onfocus, and every other non-onerror handler is never removed and persists in editor.value permanently. (onerror is the one handler the cleaner removes, but only after a ~300ms window in which it too fires.)

The two code points (jodit 4.12.27):

// 1. clean-html.ts onBeforeSetNativeEditorValue - the SYNCHRONOUS value-set pass…
Record
GHSA-rxcw-mc6f-6hr3
CVSS 3.1
7.2 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
Weakness
CWE-79, CWE-83
Updated
2026-11-02
NVD 7.2

Jodit Editor is a WYSIWYG editor with a built-in file browser & image editor. In versions prior to 4.12.28, the built-in clean-html sanitizer can be bypassed by a MathML/<style> carrier that hides a dangerous element from the sanitizer's element walk, so a no-interaction event handler survives into the editor value, potentially causing Mutation XSS. When an application supplies attacker-influenced HTML to the editor's value-set or insertion paths, the sanitized output still contains a live <img ... onload=...> (or another non-onerror handler such as onfocus). A consumer that renders that output (element.innerHTML = editor.value) executes the handler with no user interaction. This issue has been fixed in version 4.12.28.

Record
CVE-2026-58263
CVSS 3.1
7.2 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
Weakness
CWE-79, CWE-83
Updated
2026-11-02
OSV 7.2

Jodit Editor: Mutation XSS in jodit clean-html via a MathML/style rawtext carrier

Jodit Editor is a WYSIWYG editor with a built-in file browser & image editor. In versions prior to 4.12.28, the built-in clean-html sanitizer can be bypassed by a MathML/<style> carrier that hides a dangerous element from the sanitizer's element walk, so a no-interaction event handler survives into the editor value, potentially causing Mutation XSS. When an application supplies attacker-influenced HTML to the editor's value-set or insertion paths, the sanitized output still contains a live <img ... onload=...> (or another non-onerror handler such as onfocus). A consumer that renders that output (element.innerHTML = editor.value) executes the handler with no user interaction. This issue has been fixed in version 4.12.28.

Record
CVE-2026-58263
CVSS 3.1
7.2 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
Weakness
CWE-79, CWE-83
Updated
2026-11-02
OSVGHSA-rxcw-mc6f-6hr3 7.2

Jodit Editor: Mutation XSS in jodit clean-html via a MathML/style rawtext carrier

Summary

jodit's built-in clean-html sanitizer can be bypassed by a MathML/<style> carrier that hides a dangerous element from the sanitizer's element walk, so a no-interaction event handler survives into the editor value. When an application supplies attacker-influenced HTML to the editor's value-set or insertion paths, the sanitized output still contains a live <img ... onload=...> (or another non-onerror handler such as onfocus). A consumer that renders that output (element.innerHTML = editor.value) executes the handler with no user interaction. This is a stored cross-site scripting vulnerability, confirmed live on the shipped es2021/jodit.min.js for 4.12.25 and the latest 4.12.27 (in Chromium via a client-side innerHTML consumer, and in Firefox via server-rendered / document-context output; see the cross-browser note under Proof of concept).

Details

The bypass exploits the order in which clean-html parses, walks, and re-serializes the value.

  1. On the value-set path, the clean-html plugin handles :beforeSetNativeEditorValue (src/plugins/clean-html/clean-html.ts:116), parsing the value into an inert document: sandBox.innerHTML = data.value.

  2. In that parse, the source nesting math > mtext > table > mglyph > style triggers MathML text-integration-point and foster-parenting rules: the <img> is parsed as text inside <style> (rawtext), not as an element. The <table> is foster-parented out, and the <mglyph> MathML text-integration point governs the namespace, so the <img> never becomes an element node in this parse.

  3. That value-set sanitizer is safeHTML (src/core/helpers/html/safe-html.ts:24); it walks the tree but acts on elements only (the Dom.isElement gate at :39) and runs against the parse-1 sandBox, in which the <img> is rawtext, not an element. So removeAllEventAttributes (the full on* strip at safe-html.ts:76) has no element to clean and the handler passes through. The onBeforeSetNativeEditorValue handler runs safeHTML on that parse-1 tree both before and after it captures the value, so neither pass ever sees the <img> as an element.

  4. The captured value (data.value = sandBox.innerHTML) is then assigned to the editable, a second parse, which hoists the <img> out of <style> and into the HTML namespace as a live element with its handler intact. The serialize-reparse moves the element across the tree and across namespaces:

BEFORE - parse 1 (sandBox): the <img> is <style> text
  <math>          [MathML]
    <mtext>       [MathML]
      <mglyph>    [HTML]      integration point: content parses as HTML
        <style>   [HTML]      text "<img ... onload=...>"   <-- <img> is RAWTEXT, not an element
      <table>     [HTML]

AFTER - editor.value (re-parsed): the <img> is hoisted OUT of <style>, live
  <p>             [HTML]
    <math>        [MathML]
      <mtext>     [MathML]
        <mglyph>  [MathML]
          <style> [MathML]    (now empty)
        <img>     [HTML]      <-- hoisted out, HTML namespace, LIVE -> its handler fires
        <table>   [HTML]
  1. editor.value now carries that live element. The value-set pass (Steps 1-4) only walked the parse-1 sandBox and never sees it; the other sanitizer, the on-change visitor (visitNodeWalker via a LazyWalker, clean-html.ts:56/:70), does reach the hoisted element, but its sanitizeAttributes filter calls sanitizeHTMLElement (safe-html.ts:139), which strips onerror only - it never reads the removeEventAttributes flag sanitizeAttributes passes it (sanitize-attributes.ts:30), so it never runs the full on* strip. So onload, onfocus, and every other non-onerror handler is never removed and persists in editor.value permanently. (onerror is the one handler the cleaner removes, but only after a ~300ms window in which it too fires.)

The two code points (jodit 4.12.27):

// 1. clean-html.ts onBeforeSetNativeEditorValue - the SYNCHRONOUS value-set pass…
Record
GHSA-rxcw-mc6f-6hr3
CVSS 3.1
7.2 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
Weakness
CWE-79, CWE-83
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
jodit
npm
before 4.12.28
4.12.28

History

History
RecordedChangedSources
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-58263 is a high vulnerability (CVSS 7.2) in Xdan Jodit, published July 1, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.22%, the 12th percentile. Fixed in jodit 4.12.28.

References

This page doesn't list everything

Left out here: the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open