CVE-2026-14472: Kubio AI Page Builder <= 2.8.4 - Authenticated (Contributor+) Stored Cross-Site Scripting via kubio/copyright Block Content
The Kubio AI Page Builder plugin for WordPress is vulnerable to Stored Cross-Site Scripting via kubio/copyright Block Content in all versions up to, and including, 2.8.4 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. This bypasses both the WordPress core kses-on-save filter and the plugin's own wpksespost() call, because entity-encoded script tags are treated as inert text by kses but are decoded into live HTML by the subsequent htmlentitydecode() call in CopyrightBlock::rendertemplate().
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
WordPress plugin: Kubio AI Page Builderto a version that resolves this vulnerability.Fixed in 2.8.4 - Compensating control
Restrict contributor-level (authenticated) accounts’ ability to edit pages that use Kubio AI Page Builder (e.g., limit the Contributor+ role or access to the page builder) until the plugin is remediated to reduce risk of stored XSS payloads executing for users.
Event History
Frequently Asked Questions
Who can exploit this issue?
An attacker needs an authenticated WordPress account with Contributor-level permissions or higher. They must be able to add malicious content to a page using the kubio/copyright block.
When does the injected script execute?
The malicious script is stored in page content and executes when a user accesses the affected page. No additional interaction is required beyond viewing that page.
Why do normal WordPress content filters not prevent this payload?
Entity-encoded script tags pass the WordPress kses-on-save filtering and the plugin's wp_kses_post() processing as inert text. The plugin later decodes those entities with html_entity_decode() during CopyrightBlock::render_template(), turning them into executable HTML.