WordPress 7.1.4 Fixes an Unauthenticated RCE Race During Core Updates
An attacker with no account could run code on a WordPress site by catching the few seconds a core update takes. WordPress 7.1.4 and backports to 4.7.39 fix it, released October 28. Wordfence logged more than 18,500 attack requests in 21 hours but reports no confirmed takeover. No CVE, not in CISA KEV, no public PoC found.
By ThreatWire Desk · Published 30 Oct 2026
On this page
Timing: WordPress released the fix on 28 October 2026. We publish on 30 October, two days later. Attack attempts started within hours of the release.
What happened
An attacker with no account could run PHP code on a WordPress site during a core update. WordPress fixed it in 7.1.4 on 28 October. The same fix shipped for every branch back to 4.7.39.
The release post calls it "a weakness in the WordPress upgrade process which can lead to remote code execution during the upgrade window". Umut Bayram of Picus Security reported it.
There is no CVE. GitHub advisory GHSA-4w3m-c66w-69mg covers it, published on 29 October.
How the attack works
During a core update with a complete package, WordPress unpacks the new files into a folder under wp-content/upgrade/. That folder is served by the web server like any other.
Before 7.1.4:
- The folder name was predictable. It came from the package file name.
- The protective file was deleted. The cleanup step removed the
index.phpthat stops the folder from being listed. - A full WordPress copy sat there. For a few seconds, it included the installer,
wp-admin/setup-config.php.
An attacker who requests that installer in time can run it against a database they control. Wordfence says this leads to PHP code execution. The fix commit also says a wp-config.php "could have been written to the working directory" and then copied into the live site.
What the fix changes
The fix is commit e7b33f536d on the 7.1 branch. It touches two files:
- Random folder name. The working folder gets 16 random characters added.
- index.php stays. The cleanup keeps it, and recreates it if missing.
- No wp-config.php copy. A core update never copies
wp-config.phpout of the working folder.
Severity: two different labels
- Wordfence scores it CVSS 8.1 (High). It stresses high attack complexity.
- Patchstack also rates the attack complexity high (AC:H). It says it "would not call it practical to exploit".
- The GitHub advisory labels it "low", with no CVSS vector.
The impact is code execution. The hard part is the timing.
What attackers are doing
Wordfence deployed a firewall rule on 28 October at 20:30 UTC. The first hit came nine minutes later.
- More than 18,500 requests targeted staged
setup-config.phppaths in the first 21 hours. - Two large sources polled small groups of sites for about 14.5 hours. That fits trying to catch an update window.
- Others tried many variations of folder and version names.
Wordfence notes that not every request used the exact vulnerable path. It does not report a confirmed takeover.
When a site is at risk
All of these must be true:
- A core update with a complete package is running. Automatic background updates count.
wp-content/upgrade/is reachable over the web and runs PHP.- The attacker knows or guesses the folder name.
- The attacker wins the race in a window that lasted seconds in Wordfence's lab.
Sites that set DISALLOW_FILE_MODS do not run the in-place updater. In our reading, they should not be exposed to this bug. WordPress does not say this.
Important: the update to 7.1.4 is still unpacked by your current, unpatched code. That last update can open the window one more time. Block the folder first, then update.
What is confirmed
- The bug and the fix, from WordPress, the GitHub advisory and the commit.
- Affected range 4.7 to 7.1.3, with fixed versions for every branch (table below).
- Attack attempts in the wild, from Wordfence telemetry.
What is not confirmed
- A successful compromise. Nobody has reported one.
- A CVE. None is assigned. The advisory lists
cve_idas empty. - CISA KEV. Not listed. KEV tracks CVEs, and there is none.
- A public PoC. We searched GitHub, X, Exploit-DB, Nuclei templates and Metasploit pull requests on 30 October. We found no public exploit for this bug. The polling shows attackers have automated the hunt for the window. That is not the same as a working public exploit.
Fixed versions
From the WordPress 7.1.4 documentation page. The count is how many of the release's 22 issues affect each branch.
| Branch | Fixed version | Issues that apply |
|---|---|---|
| 7.1 | 7.1.4 | 22 |
| 7.0 | 7.0.8 | 22 |
| 6.9 | 6.9.11 | 22 |
| 6.8 | 6.8.12 | 20 |
| 6.7 | 6.7.11 | 20 |
| 6.6 | 6.6.11 | 19 |
| 6.5 | 6.5.14 | 17 |
| 6.4 | 6.4.14 | 17 |
| 6.3 | 6.3.14 | 9 |
| 6.2 | 6.2.15 | 9 |
| 6.1 | 6.1.16 | 9 |
| 6.0 | 6.0.18 | 9 |
| 5.9 | 5.9.20 | 9 |
| 5.8 | 5.8.19 | 6 |
| 5.7 | 5.7.21 | 6 |
| 5.6 | 5.6.23 | 6 |
| 5.5 | 5.5.24 | 6 |
| 5.4 | 5.4.25 | 6 |
| 5.3 | 5.3.27 | 6 |
| 5.2 | 5.2.30 | 6 |
| 5.1 | 5.1.28 | 6 |
| 5.0 | 5.0.31 | 6 |
| 4.9 | 4.9.35 | 4 |
| 4.8 | 4.8.34 | 2 |
| 4.7 | 4.7.39 | 2 |
WordPress 4.6 and older get no fix. Only the latest version is actively supported.
What to do
- Block
/wp-content/upgrade/at the web server. Do it before you update. WordPress only needs filesystem access to that folder, not web access. - Update. Install 7.1.4 or your branch's fixed version. Then check Dashboard → Updates. Don't assume the auto-update ran.
- Don't rely on a PHP firewall. The staged copy boots from its own files, so plugin firewalls never load. Wordfence users need Extended Protection for its rule to apply. Its free tier gets the rule on 27 November.
Nginx, inside the site's server block. The ^~ prefix makes it win over the PHP location:
location ^~ /wp-content/upgrade/ {
deny all;
}
Apache 2.4, in the virtual host:
<Directory "/var/www/example/wp-content/upgrade">
Require all denied
</Directory>
Adjust the path. Do not put a .htaccess file inside wp-content/upgrade/. The old cleanup step deletes everything in that folder before each unpack. If you can only use .htaccess, put this in the site root, above the WordPress block:
RewriteEngine On RewriteRule ^wp-content/upgrade/ - [F,L]
Then check that https://your-site/wp-content/upgrade/ returns 403.
What to check in logs
If your site ran an update before you patched, look for:
- Requests to
setup-config.phporinstall.phpunder/wp-content/upgrade/. Any200response is a red flag. Note the time and compare it with your update times. - A changed
wp-config.php. CheckDB_HOST,DB_NAMEandDB_USER. A database host you don't recognize points to a takeover. - New administrator accounts you did not create.
- Unexpected plugins or PHP files, including under
wp-content/upgrade/.
The other 21 fixes
The release fixes 22 issues in total. Most of the other 21 need a logged-in user, usually a Contributor or higher. They are mainly stored XSS, many in the Interactivity API and in blocks. One more needs no account: unpublished Customizer changesets could be read by anonymous visitors. The release also updates the bundled root certificates after the eMudhra revocation.
Three weeks earlier, WordPress 7.1.3 fixed seven issues. 7.1.4 includes those fixes too.
ThreatWire did not run any exploit. We do not publish attack payloads.
Sources: the WordPress 7.1.4 release post and documentation page, GitHub advisory GHSA-4w3m-c66w-69mg, commit e7b33f536d, Wordfence and Patchstack. Links are in the references list.
Related on ThreatWire
- NewsWordPress 7.1.3 security release lists seven fixes without CVEs
- NewsCISA adds Node2Shell CVE-2026-111497 to KEV; federal deadline is Nov 10
- NewsPHP2Shell was probed 4 days before disclosure: Amazon logged an attempt on Oct 17
- NewsGitLab CVE-2026-110264: CVSS 10 unauthenticated RCE, fixed on October 21
- NewsPHP2Shell: PHP fixes two critical RCE flaws, CVE-2026-109618 and CVE-2026-109619
- NewsASUS router firmware security update covers four CVEs
- Threat reportCorrection: Unit 42 retracts PHP2Shell link to European government intrusion
- Threat reportBricksforge WordPress plugin flaw CVE-2026-85097 exploited in the wild