
Temporary WordPress plugin requiring authentication for the Core REST Batch API endpoint to mitigate the wp2shell vulnerability chain (CVE-2026-63030). Includes optional audit log and settings page.
A focused, temporary mitigation for unauthenticated access to WordPress Core’s REST Batch API endpoint.
SkelerSecurity Core Security Plugin requires authentication before WordPress processes requests to the Core REST Batch API route:
/wp-json/batch/v1/?rest_route=/batch/v1It is designed as a narrowly scoped defense-in-depth control for the WordPress REST Batch API vulnerability chain commonly referred to as wp2shell. The plugin uses WordPress’s rest_pre_dispatch filter to reject anonymous batch requests with HTTP 401 Unauthorized, while preserving access for authenticated WordPress and REST API users.
[!IMPORTANT] This plugin is a temporary mitigation, not a replacement for WordPress Core updates. Apply the latest WordPress security release immediately and verify that the update completed successfully.
Public reporting describes a critical WordPress Core vulnerability chain involving REST Batch API route confusion (CVE-2026-63030) and a related SQL-injection issue (CVE-2026-60137). The affected endpoint can be reached in both pretty-permalink and query-string REST routing forms.
Reported affected Core releases include:
| Branch | Affected releases | Fixed release |
|---|---|---|
| WordPress 6.9 | 6.9.0–6.9.4 | 6.9.5 |
| WordPress 7.0 | 7.0.0–7.0.1 | 7.0.2 |
The WordPress 6.8 branch also received related hardening in 6.8.6. Use the newest available supported WordPress release for your environment rather than treating version ranges as a reason to delay updating.
/batch/v1 REST route./wp-json/batch/v1 and ?rest_route=/batch/v1, because WordPress resolves both to the same REST route.401 for anonymous requests.rest_pre_dispatch priority -1000).For strongest temporary coverage, pair this plugin with a WAF or reverse-proxy rule that blocks anonymous requests to both endpoint forms listed above.
Copy the skelersecurity-core-security directory into:
wp-content/plugins/
Activate the plugin in Plugins → Installed Plugins.
Review the plugin status at Tools → SkelerSecurity Core.
wp plugin activate skelersecurity-core-security
The plugin is enabled immediately after activation. Visit Tools → SkelerSecurity Core to manage:
| Setting | Default | Description |
|---|---|---|
| Batch API protection | Enabled | Requires authentication for the Core REST Batch API route. |
| Minimal audit log |
The optional audit log stores only:
/batch/v1)It intentionally does not record IP addresses, cookies, authorization headers, request bodies, usernames, or other sensitive request data.
| Request type | Expected result while protection is enabled |
|---|
An anonymous blocked response uses the error code:
rest_batch_authentication_required
/wp-json/batch/v1rest_route=/batch/v1The Batch API may be used by WordPress administration workflows, plugins, themes, mobile clients, or external integrations. Authenticated requests remain permitted, but test business-critical functions after enabling the plugin.
Potential impacts can include integrations that intentionally submit unauthenticated requests to the Core Batch API. If that behavior is required, assess the risk carefully and implement a properly authenticated integration rather than broadly exposing the endpoint.
A network-layer mitigation should cover both routing styles. Blocking only /wp-json/batch/v1 is insufficient because WordPress can also route the request through the rest_route query parameter.
Recommended rule logic:
/wp-json/batch/v1 (allow optional trailing slash).rest_route=/batch/v1.Test the rule in your environment. This plugin is useful if a WAF change cannot be deployed immediately, but it should not prevent you from patching WordPress Core.
Please do not report security vulnerabilities through public GitHub issues.
Report suspected vulnerabilities privately to your security contact or the repository owner. Include a clear description, affected version, reproducible proof of concept, and impact assessment. Do not include credentials, personal data, or destructive payloads.
This project is licensed under the GNU General Public License v2.0 or later.
| Enabled |
| Records when an anonymous Batch API request is blocked. |
| Entries to retain | 50 | Retention limit for local audit entries; configurable from 10 to 200. |
Anonymous request to /wp-json/batch/v1 | Blocked with HTTP 401 |
Anonymous request to /?rest_route=/batch/v1 | Blocked with HTTP 401 |
Authenticated WordPress/REST request to /batch/v1 | Allowed for normal WordPress authorization processing |
| Request to another REST route | Not changed by this plugin |