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



GHSA-8RQH-VXPR-X77P

GHSA-8RQH-VXPR-X77P: Stored Cross-Site Scripting via MIME Type Spoofing in Plone REST API

Amit Schendel
Amit Schendel
Senior Security Researcher

Jul 18, 2026·7 min read·14 visits

Executive Summary (TL;DR)

A stored XSS vulnerability exists in Plone's REST API and textfield components where attackers can bypass HTML sanitization by spoofing input MIME types as 'text/x-html-safe'. Upgrading plone.restapi and plone.app.textfield is required to mitigate this flaw.

A stored Cross-Site Scripting (XSS) vulnerability exists within plone.restapi, the REST API package for Plone content management system. By supplying a spoofed input MIME type (text/x-html-safe), an attacker can mislead the rendering layer (plone.app.textfield) into assuming that the supplied content is already sanitized. This causes the system to skip the safe_html transform, allowing arbitrary JavaScript to execute in the victim's browser when they view the compromised page.

Vulnerability Overview

Plone is an open-source, Python-based content management system (CMS) widely used in enterprise and public sector environments. The plone.restapi package exposes REST endpoints for content CRUD operations, forming the core data-exchange layer for modern Plone frontends. Within this architecture, rich text fields are managed by the plone.app.textfield library, which handles raw storage, transformation, and output rendering.

A high-impact stored Cross-Site Scripting (XSS) vulnerability exists when deserializing and rendering user-supplied rich text. The core security flaw involves a trust boundary violation where the REST API deserializer blindly accepts client-supplied MIME types. By declaring input data as already sanitized, an attacker can trick the system into skipping the necessary HTML purification steps.

The vulnerability is classified under CWE-80: Improper Neutralization of Script-Related HTML Tags in a Web Page. If an authenticated user with permission to add or modify content submits a crafted JSON request, they can embed arbitrary JavaScript code that executes in the browsers of other users who view the affected page. This can lead to session hijacking, credential theft, and unauthorized actions within the CMS context.

Technical Root Cause Analysis

The root cause of this vulnerability lies in the optimization and serialization architecture of plone.app.textfield. Plone designates the custom MIME type text/x-html-safe to signal that HTML markup has successfully passed through the system's sanitation engine and is safe to render. The rendering pipeline uses the RichTextValue.output_relative_to method to convert the raw stored format into the target output format, relying on an ITransformer adapter.

In vulnerable versions of plone.app.textfield, an optimization check was introduced in value.py. This check compared the declared input mimeType of a field directly against the requested outputMimeType. If these two values matched, the rendering engine assumed that the markup was already in the desired final format and skipped the entire transformation process, returning the raw content unchanged.

This shortcut created a critical security flaw. If a RichTextValue object was initialized with both mimeType and outputMimeType set to text/x-html-safe, the code bypassed the safe_html transform registry completely. Because Plone templates render rich text fields using the Zope Page Templates structure modifier, HTML entity escaping is disabled, allowing raw browser-executable scripts to be rendered directly into the Document Object Model (DOM).

Code-Level Flow and Structural Analysis

The vulnerability requires two distinct components to cooperate: the input deserializer (plone.restapi) and the storage rendering layer (plone.app.textfield). First, when a user posts new content, the REST API deserializer parses the incoming JSON request. In vulnerable versions, the deserializer extracted the user-supplied content-type value directly from the JSON body without validation and used it to construct the internal RichTextValue object.

Once saved in the Zope Object Database (ZODB), the malicious payload is stored permanently. When a standard user requests the page, the rendering engine calls output_relative_to(). Because both the stored mimeType and the requested outputMimeType are evaluated as text/x-html-safe, the comparison evaluates to true, executing the shortcut path and delivering the unsanitized script block directly to the browser.

The following diagram illustrates the vulnerable execution flow where user-supplied content bypasses the safety transforms:

Patch Analysis and Fix Integrity

The vulnerability is resolved via a two-layer defense-in-depth approach. At the input layer, the plone.restapi deserializer was updated to prevent external API requests from declaring the text/x-html-safe MIME type. If an incoming REST API payload attempts to set "content-type": "text/x-html-safe", the deserializer raises a ValueError exception, completely blocking external input spoofing attempts.

However, API-level blocking does not protect against existing database entries or direct programmatic instantiation of RichTextValue objects in custom add-ons. To address this, the second layer of the patch modifies plone.app.textfield's rendering logic in value.py. The comparison shortcut is restricted so that it will never apply if the requested output is safe HTML. If both input and output types are text/x-html-safe, the input type is overwritten to text/html to force the sanitization transform.

The patched implementation also introduces an in-memory cloning mechanism. If both input and output types are declared as safe, the code overrides the input type to text/html and forwards a clone of the value object to the transformer. Since RichTextValue is a ZODB persistent object, using __new__ to clone the object in memory allows the transform parameters to be updated dynamically without triggering unwanted database write operations.

Exploitation and Attack Methodology

An attacker must possess credentials for a low-privileged account that has permissions to create or modify content containing a rich text field, such as a contributor or editor. The attack is carried out over HTTP/HTTPS by interacting directly with the Plone REST API endpoints. Since the vulnerability is stored, it requires zero active user interaction from the target victim beyond navigating to the compromised resource.

To execute the exploit, the attacker first requests an authentication token by posting credentials to the @login endpoint. Once authenticated, they submit a POST or PATCH request targeting a specific content URL. The request payload contains a JSON structure representing the rich text field, where the data parameter holds the malicious payload, and the content-type is explicitly set to the spoofed type.

The payload can leverage various HTML tags and event handlers, such as <img src=x onerror=alert(document.cookie)> or standard inline <script> tags. Once the API accepts the payload, it writes it directly to the backend storage. When administrative users or general site visitors load the affected page, their browsers process the raw, unescaped scripts, allowing the attacker to steal cookies, extract CSRF tokens, or modify site configurations on behalf of the victim.

Remediation and Detection Strategies

Remediation requires upgrading both the plone.restapi and plone.app.textfield packages to their respective patched versions. For deployments running Plone 6.0 or 6.2, administrators must ensure that plone.restapi is updated to at least 9.15.6 or 10.0.1. Concurrently, plone.app.textfield must be upgraded to 2.0.2 (for Plone 6.0), 3.0.2 (for Plone 6.1), or 4.0.1 (for Plone 6.2).

Upgrading the libraries prevents future injection attempts but does not automatically remediate legacy payloads already stored in the Zope Object Database (ZODB). System administrators should run a diagnostic script in the Zope python shell to identify objects containing spoofed RichTextValue fields. The cleanup script locates any persistent field instance where mimeType is set to text/x-html-safe and changes it back to standard text/html to force sanitization on subsequent render requests.

In addition to applying application patches, network security teams can deploy Web Application Firewall (WAF) rules to detect and drop spoofed payloads at the perimeter. Rules should inspect incoming JSON payloads destined for Plone API endpoints and trigger blocks when detecting attempts to set content-type to text/x-html-safe. This provides immediate mitigation while administrators schedule downtime to perform full system updates and ZODB database cleanup.

Official Patches

Plone Foundationplone.app.textfield rendering-level comparison patch
Plone Foundationplone.restapi version 9 deserializer comparison patch
Plone Foundationplone.restapi version 10 deserializer comparison patch

Technical Appendix

CVSS Score
4.3/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N

Affected Systems

Plone CMSplone.restapiplone.app.textfield

Affected Versions Detail

Product
Affected Versions
Fixed Version
plone.restapi
Plone Foundation
< 9.15.69.15.6
plone.restapi
Plone Foundation
== 10.0.010.0.1
plone.app.textfield
Plone Foundation
< 2.0.22.0.2
plone.app.textfield
Plone Foundation
>= 3.0.0, < 3.0.23.0.2
plone.app.textfield
Plone Foundation
== 4.0.04.0.1
AttributeDetail
CWE IDCWE-80 (Improper Neutralization of Script-Related HTML Tags)
Attack VectorNetwork (AV:N)
CVSS v3.1 Score4.3 (Medium)
Attack ComplexityLow (AC:L)
Privileges RequiredLow (PR:L)
User InteractionNone (UI:N)
Exploit StatusPoC (Proof of Concept Available)

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1204.002User Execution: Malicious Link/Content
Execution
CWE-80
Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)

The software does not neutralize or incorrectly neutralizes user-controlled input before rendering it as HTML.

Known Exploits & Detection

GitHub Security Advisory (REST API Layer)Advisory documenting the REST API deserialization bypass mechanism and PoC inputs.
GitHub Security Advisory (Textfield Layer)Advisory covering the underlying rendering bypass in the textfield library.

Vulnerability Timeline

plone.app.textfield v4.0.0 is released.
2026-05-16
plone.restapi v9.15.5 is released.
2026-05-21
Bypass identified and patches drafted by developers Guido A.J. Stevens and Maurits van Rees.
2026-05-30
Patched versions released for plone.app.textfield (2.0.2, 3.0.2, 4.0.1) and plone.restapi (9.15.6, 10.0.1).
2026-06-05
Official security advisories GHSA-8rqh-vxpr-x77p and GHSA-4r4f-gg25-rmg5 are published.
2026-07-17

References & Sources

  • [1]GHSA-8rqh-vxpr-x77p (REST API Advisory)
  • [2]GHSA-4r4f-gg25-rmg5 (Underlying Library Advisory)
  • [3]Public GitHub Advisory Database Entry
Related Vulnerabilities
CVE-2026-54503

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

•about 15 hours ago•CVE-2026-9318
5.4

CVE-2026-9318: Stored Cross-Site Scripting via HTML Export in Jazzband tablib

CVE-2026-9318 is a stored cross-site scripting (XSS) vulnerability affecting Jazzband tablib versions prior to 3.10.0. The flaw is located in the HTML export functionality of multi-sheet Databook objects. Due to raw f-string interpolation, unsanitized sheet titles containing malicious script tags are rendered directly as HTML, allowing arbitrary client-side code execution in a victim's browser.

Amit Schendel
Amit Schendel
5 views•8 min read
•about 16 hours ago•CVE-2026-54917
10.0

CVE-2026-54917: Cross-Bucket Path Traversal and Authorization Bypass in SeaweedFS S3 and Iceberg Gateways

CVE-2026-54917 is a critical path traversal and authorization bypass vulnerability affecting the S3 and Iceberg REST catalog gateways in SeaweedFS. By explicitly disabling canonical path cleaning in the gorilla/mux routing system, relative path segments such as '..' are allowed to bypass routing constraints and access control checks. When these paths are collapsed server-side by the backend filer, they resolve to folders outside the authorized bucket boundary, allowing unauthorized cross-bucket access.

Amit Schendel
Amit Schendel
6 views•5 min read
•about 17 hours ago•GHSA-JWJP-4649-V8JP
7.5

GHSA-jwjp-4649-v8jp: Out-of-Bounds Read in SIPSorcery SCTP SACK Chunk Parsing

An out-of-bounds read vulnerability in the SCTP SACK chunk parser of SIPSorcery leads to Denial of Service (DoS) or silent internal state corruption due to lack of boundary validation on incoming chunk elements.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 18 hours ago•GHSA-PFVM-W89X-94JW
7.5

GHSA-pfvm-w89x-94jw: Uncaught Exception in STUN Parser Causes Complete TurnServer Receive Loop Termination

An uncaught exception vulnerability exists in SIPSorcery's TurnServer component, where unauthenticated malformed UDP packets can crash the core UDP receive loop, resulting in a persistent Denial of Service.

Amit Schendel
Amit Schendel
7 views•6 min read
•1 day ago•CVE-2026-62898
7.5

CVE-2026-62898: Use After Free Information Disclosure in Microsoft QUIC

A critical use-after-free vulnerability in Microsoft QUIC allows unauthenticated remote attackers to disclose sensitive system memory over the network. The vulnerability is caused by a race condition during rapid connection termination and asynchronous packet retransmission.

Alon Barad
Alon Barad
14 views•6 min read
•1 day ago•CVE-2026-62899
5.9

CVE-2026-62899: .NET Security Feature Bypass Vulnerability (HTTP Request Smuggling)

CVE-2026-62899 is a security feature bypass vulnerability in the Microsoft .NET runtime environment on non-Windows platforms. The flaw manifests as an HTTP Request/Response Smuggling vulnerability (CWE-444) within the managed implementation of the System.Net.HttpListener class. This allows unauthenticated remote attackers to desynchronize request boundaries when the backend .NET application is hosted behind an upstream reverse proxy.

Amit Schendel
Amit Schendel
16 views•6 min read