WordPress has patched wp2shell, a pre-authentication remote code execution flaw that an anonymous HTTP request can trigger against a default install with zero plugins. The project shipped 6.9.5 and 7.0.2 on July 17, 2026, and enabled forced updates through its auto-update system to push the fix out.
Because the flaw is in core, a bare WordPress install is exploitable. The researcher who found it says the attack has no preconditions and works for an anonymous user, so patch speed is your only real defense before technical details surface.
Key takeaways
- A pre-auth RCE in WordPress core, named wp2shell, was fixed in 6.9.5 and 7.0.2 on July 17, 2026.
- Affected ranges are 6.9.0 through 6.9.4 and 7.0.0 through 7.0.1.
- WordPress describes it as a REST API batch-route confusion and SQL injection issue leading to RCE.
- No CVE ID or CVSS score had been assigned as of July 18; track it by version number.
- No exploitation had been reported as of July 18, but the code diff is public in the release archive.
Affected
What is the wp2shell WordPress core RCE?
wp2shell is a pre-authentication remote code execution flaw in WordPress core. An anonymous HTTP request can trigger it against a default install with no plugins. WordPress released 6.9.5 and 7.0.2 on July 17, 2026 to close it, and turned on forced updates through its auto-update system to push the patch to affected sites.
Adam Kues at Assetnote, the attack surface management arm of Searchlight Cyber, found the bug and reported it through WordPress's HackerOne program. The firm's writeup, published under the name wp2shell, states the attack has "no preconditions and can be exploited by an anonymous user." Assetnote is holding back the technical details for now. Instead it posted a checker at wp2shell.com so owners can test their own instance.
WordPress describes Kues's finding as "a REST API batch-route confusion and SQL injection issue leading to Remote Code Execution." The release closes one critical and one high severity flaw, and the project has not said which is which.
- Fixed in WordPress 6.9.5 and 7.0.2 on July 17, 2026
- Reported via WordPress's HackerOne program by Assetnote
Which WordPress versions are affected?
Two release ranges are in scope. The vulnerable code only exists from 6.9 onward, which shipped on December 2, 2025, so every affected site is running a release less than eight months old.
- 6.9.0 through 6.9.4, fixed in 6.9.5
- 7.0.0 through 7.0.1, fixed in 7.0.2
- 7.1 beta2 carries the same fix
Sites still on 6.8 have an update waiting too, but 6.8.6 addresses a separate SQL injection bug reported by a different team in the same round. Searchlight's post cites the common estimate that over 500 million websites run WordPress. That is the total install base, not the vulnerable population. Neither advisory says how many sites the affected ranges cover.
Auto-update status is unclear
WordPress has not said whether the forced push reaches sites that turned auto-updates off. Check what version you're actually running rather than assume the patch landed.
- Vulnerable code was introduced in 6.9 (December 2, 2025)
What is known about the batch endpoint?
The version page lists three files that 7.0.2 touched, covering both fixes in the round: /wp-includes/rest-api/class-wp-rest-server.php, /wp-includes/class-wp-query.php, and /wp-includes/rest-api.php.
The batch endpoint itself isn't new. WordPress has shipped it since 5.6 in November 2020 and documented the request format publicly ever since. Nothing published so far explains what changed in 6.9 to open the flaw. The two accessible routes are /wp-json/batch/v1 and rest_route=/batch/v1, and both matter for mitigation.
- 7.0.2 modified three core files across both fixes
How do you mitigate it before updating?
Updating to 6.9.5 or 7.0.2 is the fix. If you can't update immediately, every mitigation Searchlight offers comes down to keeping anonymous callers off the batch endpoint. All three are stopgaps, and all can break legitimate integrations.
- At a WAF, block both /wp-json/batch/v1 and rest_route=/batch/v1. The firm is explicit that both must go; a rule covering only the /wp-json path leaves the query-string route open.
- Disable the WP REST API, which kills unauthenticated REST access wholesale.
- Deploy a short drop-in plugin that hooks rest_pre_dispatch and rejects anonymous /batch/v1 requests.
Verify the version
There's no CVE to tag and no public signature to match, so track this one by version number and confirm the running build after any forced update.
Why the missing CVE makes this harder to track
Neither advisory carries a CVE ID or a CVSS score, and no CVE record had appeared by July 18. That has practical consequences. CVE-keyed scanners and inventories won't flag this one, and CISA needs a CVE before it can add anything to its Known Exploited Vulnerabilities catalog.
No exploitation attempt had been reported as of July 18. With no CVE and no public signature, detection depends on watching traffic against the batch/v1 routes and on WordPress's own version statistics.
- No CVE record existed as of July 18, 2026
The open-source patch dilemma
Mass exploitation of WordPress is now an industry. Before its server leaked in June, the WP-SHELLSTORM crew got into more than 17,000 sites by its own count via a single caching-plugin flaw. That bug was already public, already patched, and only worked on a non-default setting.
When Drupal patched an anonymous SQL injection in its own core in May, Searchlight turned that public fix into a same-day teardown with two working proofs of concept. WordPress core is open source, and 7.0.1 and 7.0.2 both sit in the public release archive, so the diff is available to anyone who wants it. That's the bind for open-source projects: you can't ship the fix without shipping a map to the bug. The only lever left is how fast the patch reaches sites before someone reads it.
What to watch next
Two numbers will tell the story. Traffic against the batch/v1 routes shows when attackers arrive, and WordPress's version statistics show whether the forced update got there first. Watch for a CVE assignment, any public proof of concept, and Assetnote releasing the withheld technical writeup.
Timeline
Impact & actions
A default WordPress install on an affected version can be compromised by an unauthenticated attacker sending a single crafted request to the REST batch endpoint.
Security: Pre-auth RCE against a default install means no plugin, credential or configuration barrier stands between an anonymous request and execution.
Privacy: Site and user data stored in the WordPress database could be exposed following compromise.
Recommended actions · Immediate urgency
- 1Confirm the site runs WordPress 6.9.5 or 7.0.2 (or 7.1 beta2)
- 2If you cannot update, block both /wp-json/batch/v1 and rest_route=/batch/v1 at the WAF
- 3Monitor traffic against the batch/v1 routes for anomalous anonymous requests
Technical details
- Attack vector
- Network: unauthenticated HTTP request to the REST API batch endpoint
- Affected versions
- 6.9.0, 6.9.1, 6.9.2, 6.9.3, 6.9.4, 7.0.0, 7.0.1
- Patched versions
- 6.9.5, 7.0.2, 7.1 beta2
Mitigations
- Update to WordPress 6.9.5 or 7.0.2
- Block both /wp-json/batch/v1 and rest_route=/batch/v1 at a WAF
- Disable the WP REST API to remove unauthenticated REST access
- Deploy a drop-in plugin rejecting anonymous /batch/v1 requests at rest_pre_dispatch
Response
Vendor
Customer guidance
WordPress shipped 6.9.5 and 7.0.2 and enabled forced updates. Owners should confirm their running version rather than assume the auto-update landed, especially where auto-updates were disabled.
FAQ
Which WordPress versions are affected by wp2shell?
Versions 6.9.0 through 6.9.4 and 7.0.0 through 7.0.1. The fixes landed in 6.9.5 and 7.0.2, and 7.1 beta2 carries the same fix.
Do I need plugins installed to be vulnerable?
No. The flaw is in WordPress core, so a default install with zero plugins is exploitable by an anonymous HTTP request.
Is there a CVE for this vulnerability?
As of July 18, 2026, no CVE ID or CVSS score had been assigned. Track the issue by version number instead of relying on CVE-keyed scanners.
How do I mitigate it if I cannot update right now?
Block both /wp-json/batch/v1 and rest_route=/batch/v1 at a WAF, disable the WP REST API, or deploy a drop-in plugin that rejects anonymous /batch/v1 requests. All are temporary stopgaps.
Has wp2shell been exploited in the wild?
No exploitation attempt had been reported as of July 18, 2026, but the fix is public in the WordPress release archive, so the diff is available to anyone.
The bottom line
WordPress patched a pre-auth core RCE named wp2shell in 6.9.5 and 7.0.2 on July 17, 2026, affecting 6.9.0-6.9.4 and 7.0.0-7.0.1.
What happens next
What to do






