CVE-2026-9125 Overview
CVE-2026-9125 is a Stored Cross-Site Scripting [CWE-79] vulnerability in the Presto Player plugin for WordPress, affecting all versions up to and including 4.2.0. The flaw resides in the getOverlays() function, which copies the link_url attribute of the [presto_player_overlay] shortcode into overlay configuration without validating the URI scheme. Authenticated attackers with contributor-level access or higher can inject javascript: URIs that render as href values on clickable anchor elements produced by the presto-dynamic-overlay-ui web component. The payload executes whenever a visitor clicks the rendered overlay link.
Critical Impact
Authenticated contributors can plant persistent JavaScript in published pages, enabling session hijacking, credential theft, and admin-account takeover via stored XSS.
Affected Products
- Presto Player plugin for WordPress, versions ≤ 4.2.0
- WordPress sites permitting Contributor-level or higher accounts
- Pages and posts rendering the [presto_player_overlay] shortcode
Discovery Timeline
- 2026-06-12 - CVE-2026-9125 published to NVD
- 2026-06-17 - Last updated in NVD database
Technical Details for CVE-2026-9125
Vulnerability Analysis
The vulnerability stems from insufficient input sanitization and output escaping inside the getOverlays() function defined in inc/Services/Shortcodes.php. When the [presto_player_overlay] shortcode is parsed, the link_url attribute is read directly from user-supplied content and placed into the overlay configuration object. That configuration is later consumed by the presto-dynamic-overlay-ui web component, which assigns the value to the href attribute of an anchor element without verifying that the URI uses a safe scheme such as http: or https:.
Because the shortcode runs inside post content, any contributor who can author posts can save a javascript: URI that survives storage and renders unescaped at display time. When a visitor — including site administrators — clicks the overlay link, the browser evaluates the attacker-controlled JavaScript in the context of the WordPress origin.
Root Cause
The getOverlays() function lacks scheme validation and HTML attribute escaping for the link_url shortcode attribute. WordPress functions such as esc_url() or wp_kses() that normally strip dangerous schemes are not applied before the value reaches the front-end web component. Trust in client-side rendering, combined with the absence of server-side allow-listing, allows persistent script payloads to flow end-to-end.
Attack Vector
An authenticated contributor creates or edits a post containing a [presto_player_overlay] shortcode and supplies a link_url attribute set to a javascript: URI carrying an arbitrary payload. After the post is submitted for review or published, any user who triggers the overlay link executes the payload in their browser session. Because the script runs under the site's origin, it can issue authenticated requests, exfiltrate cookies that are not HttpOnly, or pivot to administrative actions if an admin clicks the link.
No verified public proof-of-concept code is published; refer to the Wordfence Vulnerability Report and the Presto Player Changeset #3553268 for the upstream fix details.
Detection Methods for CVE-2026-9125
Indicators of Compromise
- Post or page content containing [presto_player_overlay ... link_url="javascript:..."] shortcode patterns.
- Anchor elements rendered by presto-dynamic-overlay-ui whose href begins with javascript:, data:, or vbscript:.
- Unexpected outbound requests from administrator browsers immediately after viewing posts that embed Presto Player overlays.
- New administrative users, modified user roles, or unexpected plugin installations following contributor activity.
Detection Strategies
- Scan the WordPress wp_posts table for shortcode attributes containing javascript:, data:text/html, or other non-HTTP schemes inside link_url values.
- Inspect rendered HTML for anchor tags emitted by Presto Player whose href attribute fails an allow-list check restricted to http(s) and relative URLs.
- Audit contributor and author accounts for recently submitted posts that include the [presto_player_overlay] shortcode prior to applying the patch.
Monitoring Recommendations
- Forward WordPress access and audit logs to a centralized analytics platform and alert on post edits by low-privilege users that introduce overlay shortcodes.
- Enable a Content Security Policy (CSP) with reporting to detect inline script execution originating from anchor javascript: URIs.
- Monitor administrator session activity for anomalous API calls to /wp-json/wp/v2/users or /wp-admin/admin-ajax.php shortly after viewing overlay-containing pages.
How to Mitigate CVE-2026-9125
Immediate Actions Required
- Update Presto Player to a version newer than 4.2.0 that includes the fix from Changeset #3553268.
- Review all posts and pages authored by contributor-level or higher users for [presto_player_overlay] shortcodes with suspicious link_url values and remove malicious entries.
- Rotate session tokens and force password resets for administrators who may have clicked overlay links since the plugin was deployed.
Patch Information
The vendor addressed the issue in the Presto Player release following 4.2.0. The fix introduces scheme validation on the link_url attribute in inc/Services/Shortcodes.php so that only safe URI schemes are passed to the presto-dynamic-overlay-ui component. See the Wordfence Vulnerability Report for upgrade guidance.
Workarounds
- Restrict contributor, author, and editor accounts until the plugin is updated, and require administrators to approve all submitted content.
- Deploy a web application firewall rule that blocks POST requests to /wp-admin/post.php containing link_url="javascript: or similar non-HTTP scheme patterns inside Presto Player shortcodes.
- Enforce a strict Content Security Policy that disallows inline script execution and javascript: URIs site-wide.
# Example CSP header to block javascript: URI execution
Header set Content-Security-Policy "default-src 'self'; script-src 'self'; \
object-src 'none'; base-uri 'self'; frame-ancestors 'self'; \
navigate-to 'self' https:; require-trusted-types-for 'script'"
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

