Wednesday, November 4, 2026
Vulnerabilities

CISA KEV: WordPress Core Upgrade Race Under Active Attack

CVE-2026-119977 lets unauthenticated attackers hijack WordPress updates via predictable, web-accessible staging paths; patching is the exposure window.

Illustration of a temporary bridge plank being crossed before it is removed, symbolizing a race window.
The upgrade window is a temporary bridge — cross it at the wrong moment and someone else crosses with you.

Here's a genuinely nasty one. CISA has added CVE-2026-119977 — a time-of-check time-of-use (TOCTOU) race condition in WordPress Core — to its Known Exploited Vulnerabilities catalog, citing evidence of active exploitation. The flaw carries a CVSS score of 8.1 and, per CISA's advisory, could let unauthenticated attackers execute code on the server during the upgrade window. The root cause: predictable, web-accessible staging paths used during full-package core upgrades.

Read that again. The vulnerability doesn't live in a plugin, a theme, or an ancient default. It lives in the update mechanism itself — meaning the act of patching a vulnerable site is exactly when it's most exposed. It's the security equivalent of a speedrun trick where the only way past the boss is to clip through a wall that's briefly intangible: if an attacker's request lands inside that window, they get arbitrary code execution on your box. Federal Civilian Executive Branch agencies have until November 6, 2026 to remediate under Binding Operational Directive 26-04. Everyone else should treat that date as their own deadline too.

How the TOCTOU primitive works here

TOCTOU bugs are a classic genre: a program checks a condition (the time of check), then acts on it later (the time of use) — and an attacker who can change the state in between wins. Think filesystem races with symlink swaps, except here the filesystem is your web root and the timer is a core upgrade.

According to reporting by The Hacker News, Wordfence disclosed details of the flaw last week. Exploitation doesn't require an account on the site. What it does require is timing: the attacker has to hit a brief window during a complete Core update, when the upgrade process stages files at predictable paths that are reachable over the web. CISA's KEV entry specifically names "predictable, web-accessible staging paths used during full-package core upgrades" as the underlying issue, and points to staged setup-config.php installer paths as the observable target.

The attack flow, conceptually:

  1. WordPress begins a full-package core upgrade and unpacks the new release into a staging path with a predictable name, reachable via HTTP.
  2. Before the upgrade finalizes and the staging area is cleaned up or locked down, the attacker sends requests to the staged installer — e.g. a staged setup-config.php — effectively racing the cleanup step.
  3. If the request lands in the window, the attacker drives the staged code with attacker-controlled input and achieves code execution as the web server user.
  4. Post-exploitation: webshell, credential theft from wp-config.php, lateral movement — the usual buffet.

"WordPress Core contains a time-of-check time-of-use (TOCTOU) race condition vulnerability that could allow unauthenticated attackers to execute code on the server during the upgrade window," CISA said.

What's confirmed, what's claimed, what's unknown

Confirmed: CISA lists CVE-2026-119977 in the KEV based on evidence of active exploitation, and the KEV's own bar for inclusion is a CVE ID, evidence of exploitation, and clear mitigation guidance. Patches were released late last month, per The Hacker News.

Telemetry paints a busy picture. Wordfence said it recorded more than 18,500 requests targeting staged "setup-config.php" installer paths in the first 21 hours after public disclosure, and was blocking 12,632 exploit attempts in the most recent 24-hour period at the time of reporting. Separately, honeypot operator Previdian recorded three exploitation attempts from an IP geolocated in the U.K., observed on October 30, 2026. That's scanner-plus-attacker volume consistent with a bug that just went public and is trivial to spray.

Unknown: no source has attributed the exploitation to a named group, and neither CISA nor the reporting states how many sites have actually been compromised versus merely probed. Treat the 18,500 figure as attack traffic, not confirmed breaches. Also unconfirmed in the sources: exactly which core versions are affected, so the safe assumption is any install that hasn't applied the late-October patched release.

Abstract radar visualization showing thousands of probes and a few highlighted exploitation attempts.
Mass scanning hit staged installer paths within hours of disclosure; honeypots caught real exploit attempts.

Exposure check: are you in the blast radius?

Step one is boring and essential: enumerate. WordPress runs a huge share of the public web, and in any mid-size org the real risk isn't the marketing site you know about — it's the blog a product team spun up in 2023 and forgot. Pull CMS fingerprints from your external attack-surface data, your hosting accounts, and your CDN configs. Every self-hosted WordPress instance that isn't on the patched core release is in scope.

Step two: figure out which of those instances perform full-package core upgrades over the public web. Sites behind maintenance-mode gates, sites updated via WP-CLI by deployment automation, and managed-hosting customers whose provider handles core updates all have a meaningfully smaller window. The nightmare case is a public site where someone clicks "Update Now" in wp-admin while the internet watches.

Detection: the requests tell the story

The beautiful thing about this bug, from a defender's seat, is that exploitation is loud in the logs. Attackers must request the staged installer path while it exists, and setup-config.php simply should not be getting external traffic on a mature site. Grep your access logs retroactively around any recent upgrade windows:

# Find requests hitting staged installer paths
grep -E 'setup-config\.php' /var/log/nginx/access.log* | grep -v ' 404 '
# Correlate with your upgrade windows: who requested it, and did they POST?
awk '$7 ~ /setup-config/ {print $1, $4, $6, $7, $9}' /var/log/nginx/access.log*

A GET that 404s is background noise — the internet scans everything. A POST to that path that returned 200, from an IP that isn't yours, during a window when you were mid-upgrade? That's your incident. Follow the thread: check for newly created PHP files under the web root, unexpected admin users, modified wp-config.php, and outbound connections from the web server after the timestamp. This is the same post-patch compromise check that BOD 26-04 now explicitly expects agencies to perform — patch first, then verify the patch wasn't applied to an already-owned box.

Mitigation: shrink the window, then close it

The definitive fix is the patched core release, and that comes first — CISA's KEV guidance is to prioritize remediation of listed vulnerabilities, full stop. But because this bug turns the update into the attack surface, how you patch matters:

  • Patch immediately to the late-October core release — but do it deliberately, not via a casual click on a busy public site.
  • Update out-of-band where possible: use WP-CLI from the server (wp core update) or your CI/CD pipeline instead of the web-triggered upgrader. No web window, no web race.
  • Take the site off the public path during upgrades: enable maintenance mode that returns 503 to everyone except your admin IPs, or temporarily restrict access at the load balancer.
  • Deny web access to staging/installer paths at the WAF or server level as a compensating control — a staged setup-config.php that returns 403 is a dead end for the race.
  • Hunt after patching: review logs for prior hits to staged installer paths, and inspect for webshells and rogue accounts before declaring done.

The bigger lesson for CMS operations

The deeper issue is architectural: an upgrade process that unpacks executable code into a web-accessible, predictable location is a standing invitation. The right long-term posture is to treat updates as deploys, not clicks — pull the release, stage it outside the web root, swap atomically, and never let the installer be reachable by strangers. That's table stakes for the PHP ecosystem problems we've covered before, like the pre-auth PHP flaws that put most of the web on the clock.

Kudos to Wordfence for the disclosure and the telemetry, and to Previdian for honeypot confirmation. Now go patch — carefully — and check the logs while the updater runs.

Sources

This article draws on reporting and advisories from: