Patch Now: WordPress 7.0.2 Fixes Unauthenticated RCE Chain

On July 17, 2026, WordPress released version 7.0.2 to patch two chained vulnerabilities that allow unauthenticated remote code execution on any affected installation. The update also backports fixes to 6.9.5 and 6.8.6. If you're running WordPress 6.8, 6.9, or 7.0 and haven't updated, your site is exploitable by anyone on the internet.

Security firm PatchStack reported exploitation attempts within hours of disclosure. A working proof-of-concept exploit is now public. Treat this as an active attack.

The Vulnerabilities: CVE-2026-60137 and CVE-2026-63030

The chain, dubbed "WP2Shell" by researchers, combines an SQL injection in WP_Query with a REST API batch route confusion to achieve full RCE.

CVE-2026-60137: SQL Injection in WP_Query

  • Severity: High
  • Affected: WordPress 6.8 through 7.0.1
  • Fixed in: 6.8.6, 6.9.5, 7.0.2

The author__not_in parameter in WP_Query lacks proper escaping, allowing unauthenticated SQL injection. Attackers can read arbitrary database records (user credentials, post content, configuration) and modify or delete data. Alone, this is a serious information-disclosure bug. Chained with the next vulnerability, it becomes a stepping stone to full compromise.

CVE-2026-63030: REST API Batch Route Confusion → RCE

  • Severity: Critical
  • Affected: WordPress 6.9.0 through 6.9.4, 7.0.0 through 7.0.1
  • Fixed in: 6.9.5, 7.0.2
  • CVSS: 7.5 (official), 9.8 (Wordfence full chain)
  • Discoverer: Adam Kues at Assetnote / Searchlight Cyber

This vulnerability resides in the /wp-json/batch/v1 endpoint. An unauthenticated attacker can confuse the routing mechanism and chain it with the SQL injection to execute arbitrary PHP code. No plugins, themes, or special configuration required.

Impact: From HTTP Request to Full Server Control

Neither vulnerability alone is as dangerous as the chain. The SQL injection gives database access. The batch route confusion gives code execution. Together, they provide a complete compromise path from a single unauthenticated HTTP request to full server control.

Affected Versions

VersionCVE-2026-60137 (SQLi)CVE-2026-63030 (RCE)Fix Version
6.8.x (prior to 6.8.6)6.8.6
6.9.0 – 6.9.46.9.5
7.0.0 – 7.0.17.0.2
7.1 beta7.1 Beta 2
Prior to 6.8N/A

What to Do Right Now

Step 1: Check Your Version

Via admin: Dashboard → Updates.

Via SSH:

grep '\$wp_version =' wp-includes/version.php

Step 2: Update Immediately

  • WordPress 7.0.x → 7.0.2: Dashboard → Updates, click "Update Now"
  • WordPress 6.9.x → 6.9.5: same
  • WordPress 6.8.x → 6.8.6: same

Via WP-CLI:

wp core update
wp core update-db

Via SSH (backup first):

wp db export backup-$(date +%Y%m%d).sql
wp core update
wp core update-db

Step 3: Verify

Check version again; you should see 6.8.6, 6.9.5, or 7.0.2.

Step 4: If You Can't Update Immediately

Block the batch API at your WAF:

  • Block /wp-json/batch/v1
  • Block ?rest_route=/batch/v1

Or install a plugin that blocks anonymous REST API access. These are temporary measures — update as soon as possible. Cloudflare released an emergency WAF rule on July 17; verify it's active under Security → WAF → Managed Rules.

Check for Compromise

  1. New admin accounts:
    wp user list --role=administrator
    
  2. Suspicious PHP files:
    find /path/to/wordpress -name "*.php" -mtime -7 -type f
    
  3. Database injections:
    wp db query "SELECT user_login, user_email, user_registered FROM wp_users WHERE user_registered > '2026-07-01'"
    
  4. Access logs: Look for unusual POST requests to /wp-json/batch/v1 from July 17 onward.
  5. Scan with Wordfence: Premium users got firewall protection on July 17; free users will get it around August 16.

Why This Is Different

Most WordPress vulnerabilities affect plugins or themes. This one is in core. Every default installation is a potential target. No authentication required. Exploit code is public. This is one of the most significant WordPress security events in recent years.

Bottom Line

Update now. Check your version, patch manually, and verify. This isn't a "wait and see" situation. It's a "patch tonight" situation.