CVE-2026-96531
Executive Summary
CVE-2026-96531 is a stored cross-site scripting (XSS) vulnerability in the Optimole WordPress plugin affecting all versions before 4.2.13. The plugin fails to escape unrecognized attributes of its video-player block before rendering them onto the block's wrapper element, allowing users with the Author role and above to persist an event-handler attribute. When a higher-privileged user—such as an administrator—views the affected post, attacker-controlled JavaScript executes in their browser session.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The vulnerability resides in the video-player block rendering logic of the Optimole plugin. Per the NVD description, the plugin "does not escape unrecognized attributes of its video-player block before rendering them onto the block's wrapper element." This is a classic stored XSS condition rooted in insufficient output encoding (CWE-79): user-supplied attributes that the plugin does not explicitly recognize are written into the DOM as raw HTML attribute text rather than being sanitized or escaped.
The attack surface is the WordPress block editor and post-rendering pipeline. WordPress block content is stored as serialized block markup, and attributes passed to a block are persisted in post content. Because Optimole renders block attributes directly onto the wrapper element without an allow-list or escaping routine, an author who supplies an unrecognized attribute such as an event handler gains persistent script injection. The privilege boundary is meaningful: the Author role can create and publish posts but normally cannot inject unfiltered HTML. WordPress's unfiltered_html capability is restricted to administrators (and editors on single-site installs), so this flaw constitutes a privilege-escalation vector from Author to higher-privileged sessions.
The primary victim class is any user who views the malicious post, explicitly including administrators. Because the payload is stored in post content, no user interaction beyond viewing the page is required to trigger execution; the injected script runs in the origin of the WordPress site, inheriting the victim's authenticated session context. The stored nature also makes this persistent and reusable across every visitor until the post is cleaned.
Two technical caveats must be stated plainly. First, the provided data does not disclose the specific attribute names, JavaScript event handlers, or code paths involved; the analysis above is limited to the vulnerability class and mechanism described. Second, no CVSS score or vector was supplied with this CVE. The vector shown in METADATA is an analytical estimate derived from the described mechanism (network-reachable, low complexity, low privileges required, user interaction needed for the victim to view the post, scope change due to privilege boundary crossing, low confidentiality and integrity impact) and should be treated as provisional, not authoritative.
Exploitation Scenarios
No public PoC, Nuclei template, or exploit code is available for this CVE. The attack chain below is inferred from the vulnerability class described in the NVD description; no specific implementation details beyond the description are asserted.
Reconnaissance and target identification. The attacker identifies a WordPress installation running the Optimole plugin at a version below 4.2.13. This can be done by enumerating plugin asset paths (e.g., requests to
/wp-content/plugins/optimole-wp/and reading version strings) or via passive fingerprinting. Sites that allow self-registration or that grant Author-level accounts are the most attractive, since the flaw requires Author role or above.Triggering the flaw class. The attacker authenticates with an Author-level account and creates or edits a post containing Optimole's video-player block. Rather than only supplying recognized block attributes, the attacker includes an unrecognized attribute carrying an event-handler value. Because the plugin does not escape attributes it fails to recognize, that value is emitted onto the block's wrapper element. The exact attribute names and payload syntax are not disclosed in the available data and are not fabricated here; operationally, the injection primitive is any attacker-supplied attribute value that survives to the rendered wrapper without escaping.
Payload execution. The attacker publishes the post. When any user loads the affected post—most critically an administrator—the browser parses the wrapper element and the injected event handler fires as part of normal page rendering. Because the payload is stored server-side, no crafted link or social engineering beyond a single page view is needed for the script to run.
Post-exploitation impact. Script execution runs in the context of the victim's authenticated WordPress session and origin. Typical outcomes for this class include session/cookie theft, performing authenticated actions on the victim's behalf through the WordPress REST API or admin-ajax endpoints, injecting additional malicious content, or pivoting toward full site compromise via administrator-only functionality. An Author who successfully targets an administrator can effectively escalate to site control.
Impact Assessment
The vulnerability is a stored XSS with a privilege-boundary crossing effect: a low-privileged Author account can execute JavaScript in the session of a far more privileged user. Business impact includes compromise of administrator sessions, unauthorized content or configuration changes, potential site defacement, and lateral movement into hosting or connected third-party services accessible from the WordPress admin. The blast radius is the entire site and its user base: every visitor who views the poisoned post is exposed, but the highest-value target is an administrator viewing it in the dashboard or front end.
Blast radius also extends to brand and compliance exposure—a compromised WordPress origin can be used to serve malicious script to all visitors, which may constitute a breach notification event depending on jurisdiction and collected data. On the confidentiality, integrity, and availability axes, the described mechanism primarily affects confidentiality and integrity of the victim session (subject to an estimate of low impact each); availability impact is not implied by the description. No EPSS score is available, CISA has not added this CVE to the KEV catalog, and no exploit-in-the-wild evidence is provided.
Detection Guidance
Detection should focus on malicious or unexpected attributes appearing in Optimole video-player block markup in WordPress post content, and on anomalous JavaScript execution and outbound requests originating from authenticated WordPress sessions. All rules below are written at the vulnerability-class level because no specific attribute names, endpoints, or payload strings are disclosed in the source data.
Sigma Rule
title: Optimole Video-Player Block Attribute Injection (CVE-2026-96531)
id: 8f2c1d47-9b6e-4a3f-8c21-optimole96531
status: experimental
description: Detects WordPress post content writes containing event-handler style attributes inside Optimole video-player block markup, consistent with stored XSS via unescaped unrecognized block attributes.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-96531
author: valtersit.com
date: 2026/01/01
logsource:
product: wordpress
service: audit
detection:
selection_plugin:
message|contains:
- 'optimole'
- 'video-player'
selection_payload:
message|contains:
- 'onerror='
- 'onload='
- 'onclick='
- 'onmouseover='
- 'onfocus='
- 'javascript:'
selection_block:
message|contains:
- 'wp-block-optimole'
condition: selection_plugin and selection_block and selection_payload
falsepositives:
- Legitimate content editors pasting rich HTML that includes benign inline handlers
level: high
tags:
- attack.t1059.007
- cve.2026.96531
YARA Rule
rule CVE_2026_96531_Optimole_Block_XSS
{
meta:
description = "Detects Optimole video-player block markup carrying unescaped event-handler attributes (CVE-2026-96531 stored XSS)"
author = "valtersit.com"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-96531"
date = "2026-01-01"
severity = "high"
strings:
$block = "optimole" nocase
$video = "video-player" nocase
$wpblock = "wp-block-optimole" nocase
$ev1 = "onerror=" nocase
$ev2 = "onload=" nocase
$ev3 = "onclick=" nocase
$ev4 = "onmouseover=" nocase
$ev5 = "javascript:" nocase
condition:
filesize < 2MB and
(($block or $wpblock) and $video) and
any of ($ev*)
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-96531 Optimole Video-Player Block Stored XSS Attribute Injection"; flow:established,to_server; http.method; content:"POST"; http.uri; content:"/wp-json/"; http.request_body; content:"optimole"; nocase; http.request_body; content:"video-player"; nocase; http.request_body; pcre:"/on(error|load|click|mouseover|focus)\s*=/i"; reference:cve,2026-96531; reference:url,nvd.nist.gov/vuln/detail/CVE-2026-96531; classtype:web-application-attack; sid:2026965310; rev:1;)
Elastic Detection
sequence by user.name, source.ip with maxspan=5m
[network where process.name : "php" and url.path : ("*/wp-json/wp/v2/posts*", "*/wp-admin/post.php*")]
[http where url.path : "*/wp-json/wp/v2/posts*" and http.request.body.text : ("*optimole*", "*video-player*") and http.request.body.text : ("*onerror=*", "*onload=*", "*onclick=*", "*onmouseover=*")]
Splunk SPL Query
index=web OR index=wordpress sourcetype=access_combined OR sourcetype=wordpress_audit
| eval payload=lower(_raw)
| where (match(payload, "optimole") AND match(payload, "video-player"))
| where match(payload, "onerror%3d") OR match(payload, "onload%3d") OR match(payload, "onclick%3d") OR match(payload, "onmouseover%3d") OR match(payload, "javascript%3a") OR match(payload, "onerror=") OR match(payload, "onload=")
| stats count min(_time) as first_seen max(_time) as last_seen values(uri) as uris by src_ip, user, status
| convert ctime(first_seen) ctime(last_seen)
| sort - count
Wazuh OSSEC Rule
<group name="wordpress,cve-2026-96531,">
<rule id="2026531" level="12">
<decoded_as>json</decoded_as>
<field name="plugin">optimole</field>
<regex type="pcre2">(?i)(onerror|onload|onclick|onmouseover|onfocus|javascript\s*):?</regex>
<description>CVE-2026-96531: Possible Optimole video-player block stored XSS attribute injection</description>
<mitre>
<id>T1059.007</id>
</mitre>
<group>web_attack,xss,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source).
Immediate mitigations. Because no vendor advisory, patch commit, or workaround is tracked, treat compensating controls as the primary defense. Restrict the Author role to fully trusted individuals and review role assignments; if the plugin's video-player block is not operationally required, disable or remove the Optimole plugin until a verified fix is available. Enforce a strict Content Security Policy to reduce the practical impact of inline handler execution, and ensure WordPress users with high privilege avoid viewing untrusted or recently edited posts in session. Apply WordPress-side output escaping at theme/template level where block output is rendered, and monitor for
unfiltered_htmlgaps in custom roles.Patch/upgrade steps. The NVD description states the issue is fixed in Optimole 4.2.13. No patch reference is available from any tracked source, so this version should be independently verified against the official Optimole release notes before relying on it. Recommended workflow: stage 4.2.13 (or later) in a non-production environment, confirm the video-player block output no longer emits unrecognized attributes unescaped, audit stored posts for injected event-handler attributes and sanitize or remove them, then deploy to production and re-scan.
Long-term hardening. Maintain a plugin inventory with version tracking and automated vulnerability alerting; standardize on least-privilege roles and periodically recertify Author/Editor accounts; deploy WAF coverage for stored-XSS patterns in block-editor and REST API writes; and run periodic content scans for persisted script in post bodies. Given the stored nature of the flaw, remediation is incomplete until historical post content is cleaned, not just the plugin upgraded.
References
- NVD — CVE-2026-96531: https://nvd.nist.gov/vuln/detail/CVE-2026-96531
- CWE-79 — Improper Neutralization of Input During Web Page Generation (Cross-site Scripting): https://cwe.mitre.org/data/definitions/79.html
- MITRE ATT&CK T1059.007 — Command and Scripting Interpreter: JavaScript: https://attack.mitre.org/techniques/T1059/007/
- WordPress Plugin Security / hardening guidance: https://wordpress.org/documentation/article/hardening-wordpress/
- Optimole plugin (official distribution for version verification): https://wordpress.org/plugins/optimole-wp/
No threat actor campaigns, exploit-in-the-wild evidence, or public PoC were identified in the provided data. CISA KEV status: not listed.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.