← Back to Feed CACHED · 2026-07-01 11:47:52 · CACHE_KEY CVE-2026-10750
CVE-2026-10750 · CWE-862 · Disclosed 2026-07-01

The Royal MCP WordPress plugin before 1

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Any subscriber-tier OAuth token becomes de-facto admin across 126 MCP tools — site takeover for anyone who can log in."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Obtain any authenticated OAuth token or API key

Attacker needs a bearer credential the plugin will accept. On WooCommerce or membership sites this is trivially met via self-registration as a *customer* or *subscriber*, then walking the OAuth 2.1 authorization-code flow the plugin exposes. On closed sites the attacker needs a compromised low-privilege account or a leaked token.
Conditions required:
  • Royal MCP plugin installed and MCP endpoint reachable
  • Any WordPress account (subscriber+) or issued API key
Where this breaks in practice:
  • Sites with closed registration require prior credential compromise
  • Some deployments restrict OAuth client registration to admins
Detection/coverage: Wordfence and Patchstack both track this plugin; auth logs show OAuth token issuance but not tool invocation on pre-1.4.26.
STEP 02

Enumerate the MCP tool catalog

Attacker calls the standard MCP 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.
Conditions required:
  • Valid bearer token from step 1
Where this breaks in practice:
  • None — this is the designed behavior
Detection/coverage: Activity log will show tools/list; benign-looking.
STEP 03

Invoke a high-capability tool without holding the capability

Attacker calls a write-tier tool such as 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.
Conditions required:
  • Tool exists in the exposed catalog
  • Token authenticated (any role)
Where this breaks in practice:
  • A minority of tools already had checks pre-1.4.26 per the changelog; the *majority* did not
Detection/coverage: Post-hoc: audit royal_mcp activity log entries where the actor role does not match the capability implied by the tool.
STEP 04

Escalate to administrator via options or user tools

Attacker either creates a new administrator user, promotes their own account via 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.
Conditions required:
  • Success in step 3 against a user- or option-touching tool
Where this breaks in practice:
  • Hardened deployments running DISALLOW_FILE_MODS block plugin upload but not user creation or options manipulation
Detection/coverage: New admin user creation is a strong signal — SIEM/Wordfence should already alert on this.
STEP 05

Post-compromise: pivot to data or webshell

With admin the attacker can exfiltrate WooCommerce PII/orders, plant a webshell via theme editor, or exfil DB dumps. Standard post-WordPress-admin playbook — nothing novel to this CVE.
Conditions required:
  • Administrator role achieved in step 4
Where this breaks in practice:
  • File-integrity monitoring, hardened wp-config, and read-only filesystems slow but rarely stop this
Detection/coverage: EDR on the LAMP host, file-integrity monitoring, and outbound egress anomalies all apply.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed as of disclosure day (2026-07-01). No KEV entry.
Proof-of-conceptNo public PoC repo yet; the fix diff in 1.4.26 effectively documents the missing checks and is trivially reversible into an exploit.
EPSSNot yet scored (disclosed today); expect a rapid climb given the trivial exploitability and clear public fix diff.
KEV statusNot 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 versionsRoyal MCP < 1.4.26 (all versions from initial release up to and including 1.4.25).
Fixed version1.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 date2026-07-01 — coordinated with vendor patch release.
ReporterVendor self-disclosed via changelog + WordPress.org security advisory workflow (no external CNA researcher named).
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (8.1/10)

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.

HIGH Root-cause classification (broken access control, CWE-862)
HIGH Impact ceiling (site takeover) given the tool catalog includes `manage_options` writes
MEDIUM Real-world exposure — install base is small but growing fast
LOW Exploitation-in-the-wild — disclosed today, no telemetry yet

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:L is the honest privilege rating and often collapses to PR:N in 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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
What doesn't work
  • 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 administrator role via a security plugin — the bypass invokes tools directly through MCP, sidestepping role-based UI restrictions.
  • DISALLOW_FILE_MODS in 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: identify every WordPress site running Royal MCP, upgrade to 1.4.26 or later, and revoke every OAuth token / API key the plugin issued. Per the noisgate mitigation SLA for HIGH, you have 30 days to get a compensating control in place — but because the fix diff publicly telegraphs the missing capability checks, treat the interim WAF block of /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

  1. Royal MCP plugin on WordPress.org
  2. royalplugins/royal-mcp on GitHub
  3. Royal MCP official product page
  4. Royal MCP documentation
  5. Royal MCP troubleshooting thread (WordPress.org support)
  6. Model Context Protocol specification
  7. CWE-862: Missing Authorization
  8. Wordfence Intelligence — WordPress plugin vulnerabilities
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.