The bouncer checked your ID at the door but then let you into every VIP room without asking
Royal MCP is a WordPress plugin that exposes the site to LLM agents (Claude, ChatGPT, Gemini) via the Model Context Protocol, publishing up to 126 tools covering posts, users, media, options, WooCommerce, Elementor, and integration surfaces. In versions prior to 1.4.26, the plugin verified the OAuth 2.1 bearer token / API key at the request boundary but then failed to run a per-tool current_user_can() check on the majority of those tools. That means a token issued to a *subscriber*, *customer*, or any low-privileged role could invoke tools gated conceptually behind edit_others_posts, manage_categories, list_users, manage_woocommerce, or even manage_options — the last of which is effective site takeover.
There is no vendor CVSS. Looking at reality: this is a classic broken access control (CWE-862 / CWE-285) bug in a plugin that ships a *huge* exposed capability surface. The vendor's fixed release adds per-tool map_meta_cap object-level checks across content, user, term, comment, and integration tools — the diff confirms the pre-1.4.26 state was effectively unauthorized privilege escalation for anyone holding a token. On sites with open registration or WooCommerce customer accounts, the *authentication* bar is essentially the ground floor.
5 steps from start to impact.
Obtain any authenticated OAuth token or API key
- Royal MCP plugin installed and MCP endpoint reachable
- Any WordPress account (subscriber+) or issued API key
- Sites with closed registration require prior credential compromise
- Some deployments restrict OAuth client registration to admins
Enumerate the MCP tool catalog
tools/list method on /wp-json/royal-mcp/v1/mcp and receives the full 67 core + up to 59 conditional plugin tools. Nothing in this step is unauthorized — it's the intended MCP discovery flow.- Valid bearer token from step 1
- None — this is the designed behavior
Invoke a high-capability tool without holding the capability
wp_update_option, wp_create_user, wp_update_post on another author's post, or any WooCommerce admin tool. Pre-1.4.26 the plugin does not run current_user_can('manage_options') etc. — it dispatches straight to the tool handler. The response confirms success as if the caller were an administrator.- Tool exists in the exposed catalog
- Token authenticated (any role)
- A minority of tools already had checks pre-1.4.26 per the changelog; the *majority* did not
royal_mcp activity log entries where the actor role does not match the capability implied by the tool.Escalate to administrator via options or user tools
wp_update_user, or flips default_role / installs a malicious plugin URL through the settings tools. From this point the site is fully compromised — arbitrary PHP execution via plugin/theme upload is a standard follow-on.- Success in step 3 against a user- or option-touching tool
- Hardened deployments running
DISALLOW_FILE_MODSblock plugin upload but not user creation or options manipulation
Post-compromise: pivot to data or webshell
- Administrator role achieved in step 4
- File-integrity monitoring, hardened
wp-config, and read-only filesystems slow but rarely stop this
The supporting signals.
| In-the-wild exploitation | None observed as of disclosure day (2026-07-01). No KEV entry. |
|---|---|
| Proof-of-concept | No public PoC repo yet; the fix diff in 1.4.26 effectively documents the missing checks and is trivially reversible into an exploit. |
| EPSS | Not yet scored (disclosed today); expect a rapid climb given the trivial exploitability and clear public fix diff. |
| KEV status | Not listed. |
| CVSS vector (noisgate-assessed) | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — network, low complexity, low privileges, no user interaction, full CIA on the WordPress instance. |
| Affected versions | Royal MCP < 1.4.26 (all versions from initial release up to and including 1.4.25). |
| Fixed version | 1.4.26 — adds per-tool current_user_can() / map_meta_cap object-level checks across content, user, term, comment, WooCommerce, and integration tool families. |
| Exposure (Wordfence/WPScan) | Plugin is *new-ish* (published 2026); install base estimated at low-thousands. Elevated interest because MCP-to-WP bridges are a hot 2026 category. |
| Disclosure date | 2026-07-01 — coordinated with vendor patch release. |
| Reporter | Vendor self-disclosed via changelog + WordPress.org security advisory workflow (no external CNA researcher named). |
noisgate verdict.
Assessed HIGH because the single decisive factor is capability-check bypass to full site takeover from any authenticated token holder — on WooCommerce or open-registration sites the auth prerequisite is effectively free, and success grants manage_options-equivalent control. Held below CRITICAL only because blast radius is bounded to the individual WordPress instance rather than fleet identity or supply-chain infrastructure.
Why this verdict
- Trivial exploitation once authenticated: the fix diff is a one-line-per-tool
current_user_can()addition, meaning pre-patch the code path is a direct dispatch. No memory corruption, no race, no oracle — just call the tool. - Authentication bar is often ground-floor: WooCommerce customer accounts and open subscriber registration are common.
PR:Lis the honest privilege rating and often collapses toPR:Nin practice. - Blast radius = full site compromise: the exposed tool set includes user creation and options manipulation, which is a direct path to administrator, which is a direct path to RCE via theme/plugin editor.
- Role multiplier — line-of-business WordPress site (typical role): chain succeeds; blast radius = single site takeover, potential PII/PCI exposure if WooCommerce is present. Not fleet-scale, not identity-plane.
- Role multiplier — WordPress as identity or SSO backend (rare role): chain succeeds; if the site brokers logins to other apps, blast radius extends to those downstream apps. Still not canonical high-value-role territory for this plugin.
- Downward pressure — small install base: Royal MCP is a young plugin (published 2026), estimated low-thousands of installs. This caps aggregate risk vs. a vuln in a plugin with 1M+ installs.
- Downward pressure — not KEV, no PoC yet: as of 2026-07-01 there is no observed exploitation and no weaponized PoC in public repos.
Why not higher?
Not CRITICAL because the affected component is not a canonical identity/hypervisor/backup/PKI/edge role — blast radius stops at the single WordPress instance. Install base is also modest (thousands, not millions), so aggregate fleet exposure is bounded. No KEV, no in-the-wild activity, no supply-chain pivot.
Why not lower?
Not MEDIUM because the exploitation cost after any authentication is essentially zero (single HTTP call to an MCP tool endpoint), and the success outcome is full site takeover — that combination is textbook HIGH. WooCommerce and membership sites collapse the PR:L prerequisite to near-PR:N, and the public fix diff is a roadmap for exploit developers.
What to do — in priority order.
- Upgrade Royal MCP to 1.4.26 or later — This is the actual fix — per-tool capability checks land here. Deploy within 30 days per the noisgate HIGH mitigation SLA; ideally within the week given the public fix diff exposes the missing checks.
- Disable the plugin if not actively used — If your site installed Royal MCP experimentally and is not routing agent traffic through it, deactivate immediately. Zero operational cost, eliminates the attack surface entirely.
- Revoke all existing OAuth tokens and API keys — Assume any pre-patch token may have been used to plant persistence. Rotate tokens after upgrade and audit issued clients for anything you do not recognize. Do this at the same time as the plugin upgrade.
- Close open registration temporarily — If the site accepts self-service subscriber or customer registration, disable that (Settings → General → Membership) until 1.4.26 is deployed. This removes the free authentication path attackers would otherwise use.
- Front the MCP endpoint with a WAF rule blocking /wp-json/royal-mcp/v1/mcp — A Wordfence / Cloudflare / Sucuri rule blocking that path (or restricting it by source IP) removes the attack surface until you can patch. Deploy within 72 hours as an interim control.
- Audit the royal_mcp activity log for anomalous tool invocations — Look for
wp_create_user,wp_update_option,wp_update_user, and any settings-touching tool called by non-admin actors between plugin installation date and patch deployment. Any such entry is presumptive compromise.
- MFA on WordPress login — does not help because OAuth tokens/API keys are issued *after* auth and used out-of-band; the vulnerability is post-authentication.
- Restricting the
administratorrole via a security plugin — the bypass invokes tools directly through MCP, sidestepping role-based UI restrictions. DISALLOW_FILE_MODSin wp-config — blocks theme/plugin editor but does not prevent user creation, options manipulation, or WooCommerce data access via the MCP tools.- Rate limiting — the exploit is a single request per objective; rate limits are not a meaningful throttle here.
Crowdsourced verification payload.
Run this on the WordPress host (or any auditor workstation with wp-cli and SSH to the host). Invoke as ./check_royal_mcp.sh /var/www/html where the argument is the WordPress installation root. Requires read access to wp-content/plugins/royal-mcp/ — no elevated privileges needed beyond that.
#!/usr/bin/env bash
# noisgate — CVE-2026-10750 Royal MCP capability-check bypass
# Usage: ./check_royal_mcp.sh <wordpress-root>
# Exit 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -u
WP_ROOT="${1:-/var/www/html}"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/royal-mcp"
FIXED_VER="1.4.26"
if [[ ! -d "$PLUGIN_DIR" ]]; then
echo "UNKNOWN: royal-mcp plugin directory not found under $WP_ROOT"
exit 2
fi
HEADER_FILE="$PLUGIN_DIR/royal-mcp.php"
if [[ ! -f "$HEADER_FILE" ]]; then
HEADER_FILE=$(grep -lE '^\s*\*\s*Plugin Name:\s*Royal MCP' "$PLUGIN_DIR"/*.php 2>/dev/null | head -n1)
fi
if [[ -z "${HEADER_FILE:-}" || ! -f "$HEADER_FILE" ]]; then
echo "UNKNOWN: could not locate plugin header PHP file"
exit 2
fi
INSTALLED=$(grep -iE '^\s*\*\s*Version:' "$HEADER_FILE" | head -n1 | awk -F: '{print $2}' | tr -d ' \t\r')
if [[ -z "$INSTALLED" ]]; then
echo "UNKNOWN: could not parse Version from $HEADER_FILE"
exit 2
fi
# semver compare: returns 0 if $1 >= $2
ver_ge() {
[[ "$(printf '%s\n%s\n' "$2" "$1" | sort -V | head -n1)" == "$2" ]]
}
if ver_ge "$INSTALLED" "$FIXED_VER"; then
echo "PATCHED: Royal MCP $INSTALLED (>= $FIXED_VER)"
exit 0
else
echo "VULNERABLE: Royal MCP $INSTALLED (< $FIXED_VER) — CVE-2026-10750"
echo " Action: upgrade to $FIXED_VER, revoke all OAuth tokens, audit royal_mcp activity log"
exit 1
fi
If you remember one thing.
/wp-json/royal-mcp/v1/mcp (or plugin deactivation) as a within-72-hours action, not a 30-day one. Per the noisgate remediation SLA, the vendor patch itself must be fully deployed within 180 days, but there is zero reason to wait — the patch is a version bump with no breaking changes. On WooCommerce or open-registration sites, temporarily close self-service registration until the upgrade lands, and grep the royal_mcp activity log for non-admin actors invoking user, option, or settings tools between the plugin's install date and the patch — anything found there is a presumptive compromise investigation.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.