CVE-2026-63030: WordPress Core REST API Batch Route Confusion to Remote Code Execution
HERMES THREAT SCORE & ENTERPRISE CMS COMPROMISE
Target:WordPress Core CMS 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.
CVE-2026-63030: WordPress Core REST API Batch Route Confusion to Remote Code ExecutionVULNERABILITY
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.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source: Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Reliability: VERY_HIGH)
1. Technical Context & Affected Software Matrix
Section titled β1. Technical Context & Affected Software Matrixβ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.
| Parameter | Technical Specification | Threat Intelligence Context |
|---|---|---|
| CVE Identifier | CVE-2026-63030 | Official NVD & CISA KEV record |
| Common Weakness Enumeration | CWE-436 (Interpretation Conflict), CWE-94 (Code Injection) | Routing middleware bypass via batch subrequest parsing |
| Network Vector | HTTP/HTTPS (80/TCP, 443/TCP) | Unauthenticated REST API POST to /wp-json/batch/v1 |
| Vulnerable Component | wp-includes/rest-api/class-wp-rest-server.php | Internal subrequest dispatcher in serve_batch_request() |
| Affected Versions | 6.9.0 to 6.9.4, 7.0.0 to 7.0.1 | Modern WordPress Core installations |
| Remediated Versions | 6.9.5, 7.0.2 | Upstream emergency security releases |
2. Vulnerability Mechanism & Root Cause Analysis
Section titled β2. Vulnerability Mechanism & Root Cause AnalysisβRoute Normalization Flaw in serve_batch_request()
Section titled βRoute Normalization Flaw in serve_batch_request()β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.phppublic 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.
3. Threat Actor Weaponization & Attack Chains
Section titled β3. Threat Actor Weaponization & Attack Chainsβ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 ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ4. Detection & Threat Hunting
Section titled β4. Detection & Threat HuntingβSuricata Network Rule
Section titled βSuricata Network Ruleβ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;)SIEM Splunk Hunting Query
Section titled βSIEM Splunk Hunting Queryβindex=web_proxy sourcetype=access_combineduri_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, path5. Remediation Playbook
Section titled β5. Remediation Playbookβ-
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 -
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;}); -
Inspect File Integrity and Active Plugins: Check for unauthorized administrative users or unfamiliar plugins created during exploitation:
Terminal window wp user list --role=administratorwp plugin list --status=active