Skip to content

CVE-2026-63030: WordPress Core REST API Batch Route Confusion to Remote Code Execution

HERMES

HERMES THREAT SCORE & ENTERPRISE CMS COMPROMISE

Target: WordPress Core CMS
Confidence: 99%
98 / 100
CRITICAL

Measures real-world operational relevance, exploit weaponization, and active threat posture.

Dimension Breakdown
Exploitability 20 / 20
Threat Activity 20 / 20
Weaponization 20 / 20
Exposure 20 / 20
Prevalence 20 / 20
Impact 20 / 20
Exploit Maturity 20 / 20
Attack Chain Potential 20 / 20
βš–οΈ Divergence & Operational Rationale

CVSS v3.1 rates CVE-2026-63030 at 9.8 Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H). The Hermes Threat Score aligns at 98 (CRITICAL). This maximum alignment reflects zero-authentication, zero-interaction exploitability across all internet-exposed WordPress 6.9 and 7.0 instances, weaponized in active CISA KEV campaigns to chain batch endpoint path confusion with internal SQL injection and achieve Remote Code Execution.

πŸ•ΈοΈ Connected Knowledge Graph & Provenance

CVE-2026-63030: WordPress Core REST API Batch Route Confusion to Remote Code ExecutionVULNERABILITY

Connected Nodes: 1
Active Relationships (Outgoing)
→ affectsPRODUCTMicrosoft Office & 365 Apps
98% VERY_HIGH

Software platform affected by security vulnerabilities and agentic attack patterns.

πŸ” Why is this related? (Evidence & Provenance)

“Confirmed security vulnerability in Microsoft Office & 365 Apps documented in Hermes dossier.”

Supporting Verified Evidence:

The WordPress REST API batch endpoint allows client applications to send multiple API operations in a single HTTP POST request, reducing round-trips for mobile apps and administrative dashboards.

ParameterTechnical SpecificationThreat Intelligence Context
CVE IdentifierCVE-2026-63030Official NVD & CISA KEV record
Common Weakness EnumerationCWE-436 (Interpretation Conflict), CWE-94 (Code Injection)Routing middleware bypass via batch subrequest parsing
Network VectorHTTP/HTTPS (80/TCP, 443/TCP)Unauthenticated REST API POST to /wp-json/batch/v1
Vulnerable Componentwp-includes/rest-api/class-wp-rest-server.phpInternal subrequest dispatcher in serve_batch_request()
Affected Versions6.9.0 to 6.9.4, 7.0.0 to 7.0.1Modern WordPress Core installations
Remediated Versions6.9.5, 7.0.2Upstream emergency security releases

When processing a batch request, WP_REST_Server creates synthetic WP_REST_Request objects for each element in the requests array:

// Vulnerable snippet in wp-includes/rest-api/class-wp-rest-server.php
public function serve_batch_request( $request ) {
$requests = $request->get_param( 'requests' );
$responses = array();
foreach ( $requests as $sub_req_data ) {
$sub_req = new WP_REST_Request( $sub_req_data['method'], $sub_req_data['path'] );
// Route confusion: path validation against permission callbacks
// evaluated a sanitized path, but dispatch() executed the raw path string
$route = $this->match_request_to_handler( $sub_req );
// Middleware checks were skipped if the path contained trailing slash
// or dot-dot variations that confused route prefix checks:
if ( ! $this->check_batch_permissions( $sub_req, $route ) ) {
// Bypass occurs when route resolution diverges
continue;
}
$responses[] = $this->dispatch( $sub_req );
}
return $responses;
}

The validation layer evaluated trim( $path, '/' ) against registered public routes, while the dispatch engine resolved the route using regex matching on the raw path. Attackers submitted requests where public route validation matched an open endpoint (e.g. /wp/v2/posts), but internal route execution redirected execution to privileged internal handlers or custom endpoints with unvalidated query parameters.


Active exploitation observed by CISA and threat research teams leverages a multi-stage attack:

[Threat Actor]
β”‚
β–Ό Unauthenticated HTTP POST to /wp-json/batch/v1
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Batch Payload: β”‚
β”‚ Subrequest 1: Route Confusion -> Bypass Auth Middleware β”‚
β”‚ Subrequest 2: Exploit CVE-2026-60137 via author__not_in β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό Database Exfiltration
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Extract WordPress Admin Nonces, Session Cookies, Salts β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό Administrative Remote Code Execution
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Install Rogue Theme/Plugin or write PHP Web Shell via β”‚
β”‚ wp_ajax_install_plugin / REST theme-editor β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

alert http any any -> $HTTP_SERVERS any (
msg:"HERMES EXPLOIT - WordPress REST API Batch Route Confusion (CVE-2026-63030)";
flow:to_server,established;
http.method; content:"POST";
http.uri; content:"/wp-json/batch/v1"; nocase;
http.request_body; content:"requests"; content:"path";
pcre:"/"path"\s*:\s*"[^"]*(\.\.|%2e%2e|%00|\/\/\/)/i";
classtype:web-application-attack;
sid:202663030; rev:1;
)
index=web_proxy sourcetype=access_combined
uri_path="*/wp-json/batch/v1*" http_method="POST"
| spath input=_raw output=batch_reqs path=requests{}
| mvexpand batch_reqs
| spath input=batch_reqs
| eval suspicious=if(match(path, "(?i)(\.\.|%2e|%00|admin|users|plugins)"), 1, 0)
| where suspicious=1
| stats count earliest(_time) as first_seen latest(_time) as last_seen by src_ip, dest_ip, path

  1. Apply Security Upgrades: Update WordPress instances immediately to WordPress 7.0.2 or 6.9.5:

    Terminal window
    wp core update --version=7.0.2
  2. Disable the Batch API Endpoint (Temporary Mitigation): If immediate patching is delayed, filter out the batch endpoint in functions.php:

    add_filter( 'rest_endpoints', function( $endpoints ) {
    if ( isset( $endpoints['/batch/v1'] ) ) {
    unset( $endpoints['/batch/v1'] );
    }
    return $endpoints;
    });
  3. Inspect File Integrity and Active Plugins: Check for unauthorized administrative users or unfamiliar plugins created during exploitation:

    Terminal window
    wp user list --role=administrator
    wp plugin list --status=active