CVE-2025-11749 vulnerability and BitFire protection

How BitFire RASP Stops CVE-2025-11749 Administrator Account Creation

WordPress vulnerability research

AI Engine exposes its MCP bearer token in public REST API discovery data, while BitFire PRO RASP prevents an MCP request authenticated only by that plugin token from creating a new administrator account.

Unauthenticated Critical Severity Privilege Escalation Risk Sensitive Information Exposure
BitFire · Vulnerability advisoryResearch published
AdvisoryCVE-2025-11749
ComponentAI Engine – The Chatbot, AI Framework & MCP for WordPress
Relevant sourcelabs/mcp.php: Meow_MWAI_Labs_MCP::rest_api_init(), auth_via_bearer_token(), and handle_noauth_access(); labs/mcp-core.php: wp_create_user tool
Executive summary

What WordPress administrators need to know

CVE-2025-11749 is a critical sensitive-information exposure vulnerability in AI Engine – The Chatbot, AI Framework & MCP for WordPress through version 3.1.3. When an administrator enables MCP's `No-Auth URL` option and configures a bearer token, the plugin embeds that secret in registered `/mcp/v1/` route paths and exposes those paths through WordPress REST API discovery data. An unauthenticated attacker can recover the token and present it to AI Engine to obtain privileged MCP access. The available tools include `wp_create_user`, which can request an administrator role and lead to privilege escalation. BitFire PRO RASP provides an independent runtime boundary: its login and authentication protection does not treat a custom plugin API token as valid WordPress login credentials, so the resulting unauthorized administrator-account insertion is denied.

At a glance

Key facts

  • AI Engine versions up to and including 3.1.3 are affected
  • Exposure requires MCP's `No-Auth URL` setting and a configured bearer token
  • No WordPress account is required to retrieve the token from REST API discovery data
  • The disclosed token can make AI Engine set the current request user to an administrator
  • The MCP `wp_create_user` tool accepts a requested role and calls `wp_insert_user()`
  • BitFire PRO RASP rejects administrator creation not backed by valid WordPress login credentials
01
Vulnerability overview

Understand the exposure

The affected component, attack path, and practical risk for WordPress websites.

Affected componentAI Engine – The Chatbot, AI Framework & MCP for WordPress
Potential reach100,000+ installations
Attack techniquesensitive information exposure
Published2025-11-04
BitFire PRO RASP follows authentication provenance to the database, so an exposed AI Engine bearer token cannot authorize creation of a new WordPress administrator.
02
Technical analysis

How the vulnerability works

Research details, affected versions, exploitation behavior, and remediation guidance.

CVE-2025-11749 Exposes a Privileged MCP Credential

AI Engine provides a Model Context Protocol server that allows AI clients to call WordPress-management tools. CVE-2025-11749 affects every release through 3.1.3 and carries a critical CVSS score of 9.8. The vulnerable configuration is conditional: MCP's `No-Auth URL` option must be enabled and a bearer token must be set. Under those conditions, an unauthenticated visitor can obtain the token from the public REST API route index. The disclosure alone does not create a WordPress account, but it gives the attacker the credential needed to enter the plugin's privileged MCP path and attempt high-impact actions without supplying WordPress login credentials. AI Engine has more than 100,000 active installations, although only sites using the affected MCP configuration expose this attack path.

The Secret Is Embedded in Publicly Listed Route Names

Version 3.1.3 reads `mcp_bearer_token` and, when `mcp_noauth_url` is enabled, concatenates the token into REST paths for SSE and message traffic. The resulting paths follow `/mcp/v1/{bearer-token}/sse` and `/mcp/v1/{bearer-token}/messages`. A token in a URL can serve as a credential only while that URL remains secret, but the vulnerable route registrations use WordPress's default index behavior. REST API discovery therefore publishes the complete registered path, including the bearer token, to unauthenticated visitors. This is sensitive-information exposure rather than a token-guessing attack: WordPress reveals the value through metadata generated from the plugin's own route definitions.

AI Engine Converts the Token Into Administrator Context

After recovering the token, an attacker can use the token-bearing routes or send it in an authorization header. `auth_via_bearer_token()` compares the supplied value with the configured secret and calls `wp_set_current_user()` with an administrator selected by the plugin. The No-Auth route takes a similar path: `handle_noauth_access()` checks that the route contains the token and then sets the current user to that administrator. From there, an MCP client can enumerate tools and submit a `tools/call` request. One registered tool is `wp_create_user`; its role is derived from the caller's arguments and passed to `wp_insert_user()`. Requesting the `administrator` role can therefore create an attacker-controlled privileged account, after which the attacker may establish an ordinary WordPress session and take administrative actions.

Version 3.1.4 Hides Token-Bearing Routes From REST Discovery

AI Engine 3.1.4 adds `'show_in_index' => false` to each token-bearing SSE and message route. WordPress can still route a client that already knows the complete No-Auth URL, preserving the feature's intended behavior, but it no longer advertises that secret URL in public REST API discovery data. The plugin's changelog describes the release as REST API security hardening, and the source diff confirms the index-visibility change. Administrators assessing exposure should treat any token published by an affected release as disclosed: install a corrected release, replace the MCP bearer token, disable No-Auth URL when it is unnecessary, and review MCP, user-account, and authentication activity for unexpected access.

BitFire RASP Blocks Unauthorized Administrator Creation

BitFire PRO RASP protects the database outcome where this privilege-escalation chain must succeed. Its login and authentication controls track whether the request's identity was established through valid WordPress login credentials. A custom API token invented by a plugin does not satisfy that requirement, even when vulnerable plugin code calls `wp_set_current_user()` and proceeds as though an administrator were authenticated. When the compromised MCP path reaches `wp_insert_user()` with the `administrator` role, RASP denies the unauthorized administrator-account creation. This control does not claim to conceal the leaked token or authorize AI Engine correctly; it supplies a separate final boundary against the specific account-creation outcome described by the CVE.

Conclusion: Privileged Operations Need Independent Access Controls

CVE-2025-11749 shows why application-managed bearer tokens cannot be the only boundary around powerful WordPress operations. A route-discovery mistake exposed the token, and the plugin then translated that token into administrator context capable of invoking user-management tools. Site administrators need a security solution with built-in access controls and zero-day protection for sensitive operations such as administrator creation. BitFire PRO RASP enforces that boundary from authentication through the database: its policy is already active before a CVE-specific signature exists, requires valid login credentials for administrator-account creation, and refuses to accept a custom plugin API token as a substitute.

03
Source review

Vulnerable and fixed code

The relevant source is located in labs/mcp.php: Meow_MWAI_Labs_MCP::rest_api_init(), auth_via_bearer_token(), and handle_noauth_access(); labs/mcp-core.php: wp_create_user tool.

BeforeVulnerable behavior
register_rest_route( $this->namespace, '/' . $this->bearer_token . '/sse', [
  'methods' => 'GET',
  'callback' => [ $this, 'handle_sse' ],
  'permission_callback' => function ( $request ) {
    return $this->handle_noauth_access( $request );
  },
] );
AfterCorrected behavior
register_rest_route( $this->namespace, '/' . $this->bearer_token . '/sse', [
  'methods' => 'GET',
  'callback' => [ $this, 'handle_sse' ],
  'permission_callback' => function ( $request ) {
    return $this->handle_noauth_access( $request );
  },
  'show_in_index' => false,
] );
04
Zero-day protection

Protection from the first exploit request

BitFire protects WordPress servers on day zero—before a vulnerability is publicly known and before other vendors have time to develop signatures or patches.

01 · VerifyStop unknown clients

Bot controls and browser verification stop untrusted automated clients before previously unknown exploit code reaches WordPress.

02 · DetectBlock malicious behavior

General WAF protections identify dangerous request behavior and hostile payloads without waiting for a vulnerability-specific signature.

03 · PreventContain attacks at runtime

RASP follows execution inside PHP and prevents unauthorized changes to protected files, accounts, and database content.

BitFire · WordPress protectionZero-day ready
BitFire zero-day WordPress vulnerability protection
BitFire combines verified-client controls, behavior-based WAF detection, and runtime RASP enforcement to protect WordPress before an exploit has a name, CVE, signature, or vendor patch.
About the author

Cory Marsh

Cory has more than 20 years of internet security experience and is a lead developer on the BitFire project.

Read BitFire security research →
Protect your WordPress website

Add protection before the next exploit arrives.

BitFire combines bot controls, request inspection, malware detection, and runtime protection in one WordPress security platform.

Protect my site free →