CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-47759

CVE-2026-47759: Stored Cross-Site Scripting (XSS) via Unsanitized data-mce-* Serialization Bypass in TinyMCE

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 6, 2026·7 min read·36 visits

Executive Summary (TL;DR)

Unsanitized data-mce-* attributes in TinyMCE allow attackers to bypass HTML sanitization filters, injecting stored XSS payloads that execute during output serialization.

CVE-2026-47759 is a critical stored Cross-Site Scripting (XSS) vulnerability affecting multiple active branches of the TinyMCE rich text editor. The flaw resides in the editor's handling of user-controlled, prefixed internal attributes, such as data-mce-href, data-mce-src, and data-mce-style. When processing raw HTML inputs, TinyMCE's internal validation schema neglects to inspect these custom prefixed attributes. During HTML serialization, the editor's engine extracts these unsanitized values and copies them back into standard executable attributes, overwriting any previously sanitized standard values and leading to execution of arbitrary code.

Vulnerability Overview

TinyMCE is an industry-standard, platform-independent rich text editor implemented in JavaScript. It relies on a modular architecture that parses raw HTML input, maps it to an editable Document Object Model (DOM) container within the browser, and serializes the modified DOM back into a clean HTML string. Because browsers dynamically resolve paths and execute script blocks, the editor must strictly enforce input validation, protocol sanitization, and output encoding to prevent security regressions.

This vulnerability, classified under CWE-79 (Improper Neutralization of Input During Web Page Generation), represents a stored Cross-Site Scripting (XSS) flow. The attack surface is exposed whenever an application integrates TinyMCE to accept structured user input and subsequently stores or renders the resulting HTML without server-side validation. The vulnerability relies on a fundamental logical disconnect between the input parser's schema validation filters and the output serializer's reconstruction mechanisms.

By leveraging custom-prefixed attributes, an attacker can smuggle active JavaScript payloads past standard client-side filters. The impact is significant because the malicious payload bypasses typical validation layers during initial ingestion and only manifests as an active script vector after serialization is finalized. This behavior allows the exploit to bypass standard detection signatures that only inspect common script-bearing attributes during HTTP submission.

Root Cause Analysis

To understand the root cause of CVE-2026-47759, it is necessary to examine how TinyMCE handles path preservation and styling attributes during editing. When a user inputs a relative URL into a rich text editor, the underlying browser engine automatically resolves it to an absolute URL based on the document's host environment. To prevent this behavior and preserve original relative paths for storage, TinyMCE tracks the user's raw intended input using custom attributes, specifically data-mce-href, data-mce-src, and data-mce-style.

During active editing, these attributes operate alongside their standard counterparts. However, during the final HTML generation phase, which is triggered by invoking editor.getContent(), the serialization subsystem uses the tracked values in these data-mce-* attributes to overwrite the standard href, src, and style attributes. This design assumes that the internal attributes are identical to or safer than the standard attributes, or that they have undergone equivalent sanitization.

The vulnerability is introduced because TinyMCE's parser treats custom data-mce-* attributes as harmless data attributes, excluding them from schema-level protocol validation rules. While the parser strictly validates standard href and src attributes (stripping protocols like javascript: or data:), it ignores the custom-prefixed equivalents. Consequently, when the serialization engine executes its overwrite routine, it copies the unchecked, raw payload from the data-mce-* attribute directly into the standard attribute, effectively neutralizing previous sanitization steps.

Code Path and Patch Analysis

An analysis of the vulnerability mechanics highlights the logical gap in the serialization pipeline. Prior to the patch, the serialization logic extracted the values of internal attributes and bound them directly to standard elements without validating their protocol or structure. The vulnerable code pathway operated similarly to the following simulation:

// Vulnerable Serialization Routine
function serializeElement(node) {
  const dataMceHref = node.getAttribute('data-mce-href');
  if (dataMceHref) {
    // Vulnerability: Direct assignment without protocol validation
    node.setAttribute('href', dataMceHref);
    node.removeAttribute('data-mce-href');
  }
  
  const dataMceSrc = node.getAttribute('data-mce-src');
  if (dataMceSrc) {
    node.setAttribute('src', dataMceSrc);
    node.removeAttribute('data-mce-src');
  }
}

The official vendor patches released for versions 5.11.1, 7.9.3, and 8.5.1 address this structural issue by forcing validation of the tracking attributes before mapping them back to standard attributes. The patch ensures that if a tracking attribute contains a restricted protocol, it is either neutralized or stripped entirely during serialization.

// Patched Serialization Routine
function serializeElementPatched(node, schema) {
  const dataMceHref = node.getAttribute('data-mce-href');
  if (dataMceHref) {
    // Patch: Validate the tracking attribute's protocol before assignment
    if (schema.isValidUri(dataMceHref, 'href')) {
      node.setAttribute('href', dataMceHref);
    } else {
      // Fallback or stripping mechanism
      node.removeAttribute('href');
    }
    node.removeAttribute('data-mce-href');
  }
}

While the fix successfully addresses the direct bypass vector in supported versions, users running TinyMCE 6.x are left exposed. Because the 6.x branch has reached its End-of-Life (EOL) milestone, no official patch has been backported to this version range. Organizations using 6.x must manually implement mitigation patterns or complete a structural upgrade to the 7.x or 8.x branches.

Exploitation Methodology

To exploit this vulnerability, an attacker must inject structured HTML containing custom data-mce-* attributes. This can be achieved through multiple attack vectors, such as direct API submission, intercepting HTTP POST requests, or exploiting clipboard paste actions if the editor is configured to accept arbitrary HTML formats.

A typical exploit payload targets the hyperlink node. The attacker defines a standard, benign link destination in the href attribute to satisfy basic input-filtering mechanisms, while embedding the malicious scripting instructions inside the data-mce-href attribute:

<a href="https://trusted-site.com" data-mce-href="javascript:alert(document.cookie)">Click here to continue</a>

When this markup is initially supplied to the editor, the internal parsing engine validates href and confirms that https://trusted-site.com is a safe, HTTP-based destination. It permits the document to load. When the document is saved or submitted, the backend or client-side wrapper invokes tinymce.activeEditor.getContent(). The serialization process reads data-mce-href and overwrites the existing href value, resulting in the following serialized output:

<a href="javascript:alert(document.cookie)">Click here to continue</a>

Once stored in the host application's database, this markup is served to subsequent users. When a victim clicks the link, the browser executes the script in the context of the vulnerable application.

Impact Assessment

The impact of successful exploitation is stored Cross-Site Scripting, which carries a CVSS 3.1 base score of 8.7. Because the payload is persistent, the execution of arbitrary JavaScript occurs automatically whenever an end-user loads and interacts with the compromised page. This eliminates the need for complex phishing campaigns or social engineering beyond encouraging a user to view a standard page.

The scope of the vulnerability is classified as Changed (S:C) because execution occurs within the host application's domain context rather than the isolated editor iframe. An attacker can access document cookies, session storage tokens, and authorization headers, potentially leading to complete account takeover if session identifiers lack the HttpOnly flag.

Additionally, the scripting context allows attackers to perform actions on behalf of the victim. This includes executing state-changing transactions, modifying profile details, or launching targeted drive-by download operations against administrators. In highly privileged administrative consoles, this execution flow can lead to total application compromise.

Remediation and Defense-in-Depth

The primary remediation for CVE-2026-47759 is updating the TinyMCE library to a patched version. Development teams must identify the active major release branch in use and deploy the corresponding update: version 5.11.1 for 5.x systems, version 7.9.3 for 7.x systems, and version 8.5.1 for 8.x systems. Because the 6.x release branch is EOL, systems on this version must be upgraded to a supported active branch.

To establish a defense-in-depth posture, server-side HTML sanitization should be implemented for all rich text payloads before they are persisted to a database. Server-side sanitization libraries, such as DOMPurify, must be configured to strip custom data-mce-* attributes explicitly to neutralize any client-side parser bypasses.

// Secure Server-Side Sanitization Configuration using DOMPurify
const DOMPurify = require('dompurify');
const { JSDOM } = require('jsdom');
const window = new JSDOM('').window;
const purify = DOMPurify(window);
 
const cleanHTML = purify.sanitize(userInput, {
  FORBID_ATTR: ['data-mce-href', 'data-mce-src', 'data-mce-style']
});

Furthermore, organizations should enforce a robust Content Security Policy (CSP) that restricts script execution. Omitting the 'unsafe-inline' directive and implementing script nonces or hashes prevents unauthorized inline script executions, mitigating the impact of any successfully injected XSS payloads.

Official Patches

TinyMCE Security AdvisoryOfficial GitHub Advisory detailing CVE-2026-47759.
TinyMCE Release Notes v7TinyMCE v7.9.3 Release Notes detailing the patch.
TinyMCE Release Notes v8TinyMCE v8.5.1 Release Notes detailing the patch.

Technical Appendix

CVSS Score
8.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
EPSS Probability
0.03%
Top 90% most exploited

Affected Systems

Web applications incorporating TinyMCE rich text editor

Affected Versions Detail

Product
Affected Versions
Fixed Version
TinyMCE
Tiny
< 5.11.15.11.1
TinyMCE
Tiny
>= 6.0.0, <= 6.8.6None (Upgrade to 7.9.3 / 8.5.1)
TinyMCE
Tiny
>= 7.0.0, < 7.9.37.9.3
TinyMCE
Tiny
>= 8.0.0, < 8.5.18.5.1
AttributeDetail
CWE IDCWE-79 (Improper Neutralization of Input During Web Page Generation)
Attack VectorNetwork (AV:N)
CVSS Base Score8.7
Exploit StatusProof-of-Concept (PoC) Feasible
ImpactStored Cross-Site Scripting (XSS) / Execution of Arbitrary Script
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1185Browser Session Hijacking
Collection
CWE-79
Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

The application does not neutralize or incorrectly neutralizes user-controlled input before it is placed in output that is used as a web page that is served to other users.

Vulnerability Timeline

Vulnerability officially published
2026-05-28
Security Advisory and official patches released
2026-05-28
Vulnerability entry last modified
2026-05-30

References & Sources

  • [1]GitHub Security Advisory GHSA-q742-qvgc-gc2f
  • [2]TinyMCE 7.9.3 Release Notes
  • [3]TinyMCE 8.5.1 Release Notes
  • [4]CVE-2026-47759 CVE Record
  • [5]Wiz Vulnerability Database - CVE-2026-47759

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•27 minutes ago•CVE-2026-59205
7.5

CVE-2026-59205: Heap-Based Buffer Overflow in Pillow ImageCms Module

CVE-2026-59205 is a high-severity heap-based out-of-bounds write vulnerability affecting Pillow prior to version 12.3.0. The flaw stems from a validation omission in the ImageCmsTransform class where source and destination image modes are not checked against the configurations defined during the creation of the transform. An attacker can exploit this discrepancy to trigger a heap buffer overflow or an out-of-bounds read by supplying an under-allocated target image buffer.

Amit Schendel
Amit Schendel
2 views•5 min read
•about 1 hour ago•CVE-2026-12590
3.7

CVE-2026-12590: Fail-Open Limit Enforcement Vulnerability in body-parser

A vulnerability in the 'body-parser' Node.js middleware allows unauthenticated attackers to trigger a Denial of Service. When the 'limit' configuration option is misconfigured with an unparseable type or empty value, size limits fail open. This leads to unrestricted heap memory allocation and process crash via Out of Memory (OOM).

Amit Schendel
Amit Schendel
5 views•6 min read
•about 2 hours ago•GHSA-HP3V-MFQW-H74C
3.7

GHSA-hp3v-mfqw-h74c: Missing Character Escaping in @astrojs/netlify Remote Image Pattern Configuration

A security vulnerability in @astrojs/netlify allows attackers to bypass remote image path restrictions by leveraging unescaped regular expression metacharacters. The integration adapter fails to sanitize developer-defined pathnames before interpolating them into a configuration JSON file consumed by Netlify's Edge Image CDN. This results in overly permissive matching behavior at the edge routing layer, enabling path-traversal and filter bypasses.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 3 hours ago•GHSA-2G6R-C272-W58R
3.7

CVE-2026-26013: Server-Side Request Forgery in LangChain Image Token Counting

Prior to version 1.2.11, the LangChain LLM framework is affected by a Server-Side Request Forgery (SSRF) vulnerability inside its image token counting mechanism. Specifically, the ChatOpenAI.get_num_tokens_from_messages() method retrieves arbitrary image_url values from user prompts without validating the destination host or IP address. Attackers can exploit this issue to scan internal infrastructure, access local services, or harvest credentials from cloud metadata services.

Alon Barad
Alon Barad
4 views•6 min read
•about 3 hours ago•GHSA-8MV7-9C27-98VC
5.1

GHSA-8mv7-9c27-98vc: Cross-Site Request Forgery (CSRF) Bypass in Astro/Hono Composable Pipeline

A security vulnerability was identified in the Astro web framework's composable integration pipeline with Hono. Due to the structural coupling of CSRF origin validation exclusively within the `middleware()` primitive, applications assembling their routing pipeline manually could execute state-mutating actions before or entirely without origin validation. This flaw allows attackers to execute blind, write-only Cross-Site Request Forgery (CSRF) attacks against state-mutating Astro Actions or endpoints on behalf of authenticated users.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 4 hours ago•CVE-2008-4128
9.3

CVE-2008-4128: Multiple Cross-Site Request Forgery Vulnerabilities in Cisco IOS HTTP Administration

Multiple cross-site request forgery (CSRF) vulnerabilities in the HTTP Administration component in Cisco IOS 12.4 on the 871 Integrated Services Router allow remote attackers to execute arbitrary commands via crafted HTTP requests. This occurs because the web administrative server fails to validate request origins or use anti-CSRF tokens, allowing an attacker to abuse an active administrative session.

Alon Barad
Alon Barad
5 views•7 min read