CVE-2026-58263
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.
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
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 High
CVSS: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 High
CVSS: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.
-
On the value-set path, the
clean-htmlplugin handles:beforeSetNativeEditorValue(src/plugins/clean-html/clean-html.ts:116), parsing the value into an inert document:sandBox.innerHTML = data.value. -
In that parse, the source nesting
math > mtext > table > mglyph > styletriggers 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. -
That value-set sanitizer is
safeHTML(src/core/helpers/html/safe-html.ts:24); it walks the tree but acts on elements only (theDom.isElementgate at:39) and runs against the parse-1sandBox, in which the<img>is rawtext, not an element. SoremoveAllEventAttributes(the fullon*strip atsafe-html.ts:76) has no element to clean and the handler passes through. TheonBeforeSetNativeEditorValuehandler runssafeHTMLon that parse-1 tree both before and after it captures the value, so neither pass ever sees the<img>as an element. -
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]
editor.valuenow carries that live element. The value-set pass (Steps 1-4) only walked the parse-1sandBoxand never sees it; the other sanitizer, the on-change visitor (visitNodeWalkervia aLazyWalker,clean-html.ts:56/:70), does reach the hoisted element, but itssanitizeAttributesfilter callssanitizeHTMLElement(safe-html.ts:139), which stripsonerroronly - it never reads theremoveEventAttributesflagsanitizeAttributespasses it (sanitize-attributes.ts:30), so it never runs the fullon*strip. Soonload,onfocus, and every other non-onerrorhandler is never removed and persists ineditor.valuepermanently. (onerroris 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 High
CVSS: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 High
CVSS: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 High
CVSS: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.
-
On the value-set path, the
clean-htmlplugin handles:beforeSetNativeEditorValue(src/plugins/clean-html/clean-html.ts:116), parsing the value into an inert document:sandBox.innerHTML = data.value. -
In that parse, the source nesting
math > mtext > table > mglyph > styletriggers 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. -
That value-set sanitizer is
safeHTML(src/core/helpers/html/safe-html.ts:24); it walks the tree but acts on elements only (theDom.isElementgate at:39) and runs against the parse-1sandBox, in which the<img>is rawtext, not an element. SoremoveAllEventAttributes(the fullon*strip atsafe-html.ts:76) has no element to clean and the handler passes through. TheonBeforeSetNativeEditorValuehandler runssafeHTMLon that parse-1 tree both before and after it captures the value, so neither pass ever sees the<img>as an element. -
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]
editor.valuenow carries that live element. The value-set pass (Steps 1-4) only walked the parse-1sandBoxand never sees it; the other sanitizer, the on-change visitor (visitNodeWalkervia aLazyWalker,clean-html.ts:56/:70), does reach the hoisted element, but itssanitizeAttributesfilter callssanitizeHTMLElement(safe-html.ts:139), which stripsonerroronly - it never reads theremoveEventAttributesflagsanitizeAttributespasses it (sanitize-attributes.ts:30), so it never runs the fullon*strip. Soonload,onfocus, and every other non-onerrorhandler is never removed and persists ineditor.valuepermanently. (onerroris 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 High
CVSS: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
| Package | Affected | Fixed |
|---|---|---|
joditnpm |
before 4.12.28 | 4.12.28 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE 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
github.com/xdan/jodit/security/advisories/GHSA-rxcw-mc6f-6hr3
nvd.nist.gov/vuln/detail/CVE-2026-58263
github.com/xdan/jodit/commit/0ebb61692cbe84f9abf10ac76dd594dbb6343b90
github.com/xdan/jodit/releases/tag/4.12.28
github.com/advisories/GHSA-rxcw-mc6f-6hr3
github.com/CVEProject/cvelistV5/tree/main/cves/2026/58xxx/CVE-2026-58263.json
github.com/xdan/jodit
Left out here: the rest of 2 source descriptions. The JSON record has them.