Friday at a quarter to six in the evening

WordPress shipped a security release on 17 July 2026 covering two vulnerabilities in core. Searchlight Cyber's research team, which found the more serious of the two, gave it the name wp2shell. The tracked identifiers are CVE-2026-63030, a route confusion issue in the REST API batch endpoint combined with SQL injection, and CVE-2026-60137, a SQL injection reachable through the author__not_in parameter of WP_Query.

At 5:45 in the evening Eastern time on the day of the patch, Rapid7 published its analysis and recorded two things. Technical exploit details had not yet been published, and it was not aware of publicly confirmed exploitation in the wild. If you read that assessment on Friday, you had every reason to believe you had a normal working week to schedule the update.

You did not. PatchStack began reporting exploitation of both CVEs shortly before 7 PM Eastern the same evening, roughly an hour after Rapid7's snapshot. By Sunday 19 July, VulnCheck had verified more than two dozen unique proof-of-concept exploits targeting the flaw.

Two bugs, and your version has two different answers

Most of the coverage treats this as one event with one name. It is two vulnerabilities with different reach, and that difference decides what you actually have to do. Getting it wrong in either direction wastes a weekend or leaves a hole open.

CVE-2026-63030, the remote code execution chain, affects WordPress 6.9.0 through 6.9.4 and 7.0.0 through 7.0.1. It is fixed in 6.9.5 and 7.0.2, and in the 7.1 beta line in Beta 2. CVE-2026-60137, the WP_Query SQL injection, reaches further back. It affects 6.8.0 through 6.8.5 as well as the same 6.9 and 7.0 ranges, and the fix for the older branch is 6.8.6.

The practical consequence is that a site sitting on 6.8.x reads the wp2shell headlines, checks whether it is in the 6.9 or 7.0 range, concludes it is not affected, and stops. That site is not exposed to the full unauthenticated code execution chain, but it is exposed to the SQL injection, and it still needs to move to 6.8.6. Version checks done against the wrong CVE are the most likely way an organisation gets this wrong this week.

The safety net covers the sites that matter least

WordPress maintainers responded by forcing updates onto affected installations that had automatic updates enabled. That is the right call and it will have protected a very large number of sites over the weekend without anyone touching them.

Look at which sites it did not protect. Automatic updates get switched off deliberately, and the reasons are always the same: a change-control process, a plugin that broke on a previous minor release, a staging-to-production pipeline, an agency contract that assigns update responsibility to a human, a compliance regime that forbids unreviewed changes to production. Every one of those reasons is a marker of an install that someone considers important enough to manage.

So the automatic safety net is inversely correlated with business criticality. The hobby blog updated itself on Friday night. The customer portal, the booking system and the site that takes payments sat on the vulnerable version through a weekend in which working exploit code went from none to more than two dozen. If your organisation disabled auto-updates as a maturity measure, this is the weekend that decision cost you.

What the weekend curve actually measures

The useful number here is not a CVSS score, and the vendors do not fully agree on severity anyway. Rapid7 records CVSS 7.5 for the RCE chain while the corresponding advisory treats it as critical, and VulnCheck ranks the SQL injection as the critical one of the pair. Arguing about which figure to put in the ticket is a poor use of the time you have.

The number that matters is the interval between patch and weaponisation. Here it was measured in hours for the first exploitation reports and in about two days for broad public exploit availability. That is the real service level your patching process has to meet, and almost no organisation's stated policy meets it. A thirty-day remediation window, common in compliance frameworks, is not a patching policy for a bug like this. It is a description of how long you were exposed.

There is a second detail in the later exploits that closes off the usual fallback. VulnCheck reports that by Sunday, additional remote code execution implementations had emerged that bypass administrator authentication entirely. Teams that were planning to lean on hardened admin accounts, restricted login pages or two-factor on wp-admin as a compensating control should understand that those measures do not sit in the path of this attack.

Four things worth doing today

First, inventory before you patch. Find every WordPress install your organisation actually owns, including the marketing microsites, the campaign landing pages, the conference site from two years ago and anything a departed agency built. The vulnerable install is almost never the one on the asset register. It is the one nobody remembered was still serving traffic.

Second, check each one against the correct CVE. Anything on 6.8.x goes to 6.8.6. Anything on 6.9.x goes to 6.9.5. Anything on 7.0.x goes to 7.0.2. Do not let a single version-range assumption cover the whole estate.

Third, treat any unpatched install that faced the internet across the weekend as potentially compromised rather than merely vulnerable, and look for the evidence rather than assuming its absence. Patching closes the door. It does not remove anyone already inside. Fourth, and this is the durable one, write down what your organisation's actual time-to-patch was for this event and compare it to the policy number you publish. The gap between those two figures is the thing to fix, because the next core vulnerability will run on the same clock.