WordPress Core RCE CVE-2026-119977: race nella finestra di aggiornamento
WordPress Core 4.7–7.1.3: RCE non autenticata nell'aggiornamento (CVE-2026-119977), in CISA KEV e sfruttata. Aggiorna a 7.1.4, blocca wp-content/upgrade/.
Pubblicato da Zero Hunt, un red team AI autonomo su un'appliance on-premise con AI privata: penetration test automatizzato per reti e infrastrutture, in black box o gray box, con una persona che approva ogni passo che conta.
La CISA ha inserito oggi CVE-2026-119977 nel suo catalogo delle vulnerabilità note sfruttate, con scadenza federale fissata al 6 novembre 2026 — tre giorni. È una remote code execution non autenticata in WordPress Core 4.7–7.1.3, il software dietro circa il 40% del web, e vive nell'unica procedura che ogni sito esegue su se stesso: l'aggiornamento del core. La correzione è uscita il 28 ottobre. Il punto scomodo è che installare la correzione esegue il codice vulnerabile un'ultima volta: adesso l'ordine dei passi conta più della patch in sé.
Notizia in evoluzione — pubblicata alle 21:30 (20:30 UTC) del 3 novembre 2026. Aggiornata man mano che vendor e CISA pubblicano.
In breve
| CVE | CVE-2026-119977 |
| Prodotto / versioni colpite | WordPress Core 4.7.0–7.1.3 (per branch; es. 7.1.0–7.1.3 · 7.0.0–7.0.7 · 6.9.0–6.9.10 · … · 4.7.0–4.7.38). 4.6 e precedenti: nessuna correzione |
| Corretta in | 7.1.4 (28 ottobre 2026); backport su 7.0.8 · 6.9.11 · 6.8.12 · 6.7.11 · 6.6.11 · 6.5.14 · 6.4.14 · … · 4.7.39 |
| CVSS | 8.1 HIGH · CVSS 3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H · assegnato da Wordfence (CNA); WordPress la valuta Low |
| Sfruttata attivamente | Sì · CISA KEV; Wordfence riporta oltre 18.500 sonde verso i path dell'installer in staging nelle prime 21 ore |
| CISA KEV | Aggiunta 2026-11-03; scadenza federale 2026-11-06 (BOD 26-04, triage forense richiesto) |
| PoC pubblico | Scansione di massa verso i path setup-config.php in staging; nessun exploit indicato come pubblico al 2026-11-03 |
| Advisory ufficiale | Rilascio WordPress 7.1.4 |
La finestra di aggiornamento di WordPress Core è la vulnerabilità
WordPress si aggiorna allo scoperto. Quando un sito esegue un aggiornamento a pacchetto completo del core — quello che sostituisce l'intera release, non le piccole patch incrementali — scarica l'archivio della nuova versione e lo estrae in una directory di lavoro sotto wp-content/upgrade/. Quella cartella sta dentro la web root. Su moltissime configurazioni di hosting è raggiungibile via HTTP ed esegue PHP.
L'albero estratto è una copia completa del nuovo WordPress, e quella copia include wp-admin/setup-config.php — l'installer che guida la "famosa installazione in cinque minuti". Il punto è che setup-config.php è progettato per girare prima che il sito abbia un wp-config.php valido. Nei pochi secondi tra l'estrazione e la pulizia, un visitatore non autenticato che conosce il path di staging può richiedere direttamente quell'installer e spingerlo verso l'esecuzione di codice sul server.
GET /wp-content/upgrade/core/wordpress/wp-admin/setup-config.php?step=1Nessun login. Nessun nonce. La richiesta deve solo cadere nella finestra, prima che WordPress sposti i file al loro posto ed elimini la copia in staging.
Per questo NVD la classifica come CWE-367, una race condition time-of-check/time-of-use (TOCTOU). La routine di aggiornamento prepara e controlla i file in un istante; il sito live li promuove e li usa in un altro; nel mezzo, la copia in staging è raggiungibile da chiunque. Prima della 7.1.4 il path di staging era prevedibile — wp-content/upgrade/core/… e pochi nomi simili — quindi gli attaccanti non dovevano indovinare. Interrogavano in loop. Come documenta il vendor di sicurezza Rescana nella sua analisi tecnica, l'attacco ha quattro precondizioni: un aggiornamento a pacchetto completo in corso, accesso web e PHP pubblico a wp-content/upgrade/, un path di staging prevedibile o scoperto, e tempo sufficiente prima della pulizia. La complessità è "High" — bisogna cogliere la finestra — ed è il motivo per cui Wordfence la valuta 8.1 mentre WordPress la valuta Low. Gli attaccanti hanno risolto la discordanza empiricamente: Wordfence ha registrato oltre 18.500 richieste verso i path setup-config.php in staging nelle prime 21 ore dalla divulgazione, e l'inserimento in KEV di oggi rende ufficiale il giudizio di "sfruttata".
Il merito è di Umut Bayram di Picus Security, la cui segnalazione ha portato al rilascio di sicurezza WordPress 7.1.4.
Perché installare la patch riapre la finestra
Ecco la trappola. Un sito ancora su una versione vulnerabile usa il proprio codice di aggiornamento — vulnerabile — per scompattare l'update alla 7.1.4. Quindi l'atto stesso di aggiornare esegue un'altra estrazione a pacchetto completo nel path di staging prevedibile, con il vecchio comportamento, proprio mentre gli attaccanti stanno interrogando in loop esattamente quello. La patch chiude la finestra per ogni aggiornamento futuro, ma l'aggiornamento che la consegna è a sua volta esposto. Questo riordina il runbook: la regola di blocco sul web server qui sotto non è un ripiego da "non posso aggiornare adesso", è il passo uno prima di cliccare aggiorna.
Cosa cambia la 7.1.4, secondo la lettura che Rescana fa delle analisi di Wordfence e Patchstack: il nome della directory di staging è randomizzato con 16 caratteri casuali, viene ripristinata una index guard e la configurazione in staging non viene più promossa in modo non sicuro (wp-config.php è aggiunto ai file mai copiati fuori dalla directory di lavoro).
Remediation
1. Sono esposto?
Controlla la versione in esecuzione — l'admin di WordPress la mostra in fondo alla dashboard, oppure da CLI:
wp core version
# oppure, senza wp-cli:
grep "wp_version =" wp-includes/version.php
Sei esposto se giri una qualsiasi build 4.7.0–7.1.3 sotto la point release corretta del tuo branch. I siti su 4.6 o precedenti non ricevono correzioni e vanno migrati a un branch supportato. Attenzione: gli intervalli sono per branch — 7.0.0–7.0.7 è colpito anche se esiste la 7.1.x.
2. Patch — versioni corrette esatte
Aggiorna alla 7.1.4, o alla release di sicurezza in backport per il tuo branch:
| Branch | Versione corretta |
|---|---|
| 7.1 | 7.1.4 |
| 7.0 | 7.0.8 |
| 6.9 / 6.8 / 6.7 / 6.6 / 6.5 / 6.4 | 6.9.11 · 6.8.12 · 6.7.11 · 6.6.11 · 6.5.14 · 6.4.14 |
| 6.3 → 6.0 | 6.3.14 · 6.2.15 · 6.1.16 · 6.0.18 |
| 5.9 → 5.0 | 5.9.20 · 5.8.19 · 5.7.21 · 5.6.23 · 5.5.24 · 5.4.25 · 5.3.27 · 5.2.30 · 5.1.28 · 5.0.31 |
| 4.9 / 4.8 / 4.7 | 4.9.35 · 4.8.34 · 4.7.39 |
La maggior parte dei siti con gli aggiornamenti automatici in background riceverà la release da sola; dopo, verifica che la versione sia davvero cambiata.
3. Blocca wp-content/upgrade/ prima — poi aggiorna
Poiché l'aggiornamento stesso scompatta i file nel path di staging un'ultima volta, blocca l'accesso web a quella cartella prima di applicare la patch, a livello di web server o di site-root — non con un file dentro la cartella di upgrade. La directory viene scritta solo lato server; nessun visitatore legittimo deve scaricarne nulla, quindi la regola è sicura da lasciare in modo permanente.
nginx:
location ^~ /wp-content/upgrade/ {
deny all;
return 403;
}
Apache (.htaccess nella site-root):
RedirectMatch 403 ^/wp-content/upgrade/
Se davanti al sito hai un WAF o una CDN, aggiungi una regola equivalente — blocca ogni richiesta il cui path URI contiene /wp-content/upgrade/. Verifica che funzioni: curl -I https://esempio.it/wp-content/upgrade/index.php deve restituire 403.
4. Caccia alla compromissione
Non sono stati pubblicati IOC di rete (IP o hash); i segnali sono comportamentali. Mappali su MITRE ATT&CK:
- T1190 — Exploit Public-Facing Application. Nei log di accesso del web server, richieste a file PHP sotto l'albero del core in staging — es.
GET /wp-content/upgrade/*/wordpress/wp-admin/setup-config.php— che hanno restituito200o302invece di403/404. (Unwp-content/upgrade/index.phpdi default che risponde 200 è normale; contano l'installer e gli altri PHP sotto l'albero in staging.) Concentrati sui minuti attorno all'esecuzione reale di un aggiornamento del core. - T1505.003 — Web Shell. File PHP sotto la web root che non hai messo tu; esegui
wp core verify-checksumsper segnalare file del core modificati o aggiuntivi. - T1136.001 — Create Account. Amministratori sconosciuti:
wp user list --role=administrator. Task pianificati inattesi:wp cron event list. Plugin o must-use plugin inattesi.
5. Bonifica + verifica
Rimuovi eventuali web shell o PHP sconosciuti; reinstalla il core da checksum noti (wp core download --force --version=<corretta> e poi riverifica). Ruota ogni credenziale amministrativa e rigenera le secret key e i salt in wp-config.php — una compromissione via staged-installer può piantare persistenza che sopravvive a una semplice pulizia dei file. Poi conferma lo stato finale: la regola di blocco restituisce 403, la versione è quella corretta e wp core verify-checksums è pulito.
Cosa non si sa ancora
- Se qualche sito sia stato compromesso con successo (e non solo sondato). Al momento le segnalazioni descrivono scansione di massa dei path dell'installer in staging, non shell confermate.
- L'intero insieme delle varianti di path prevedibili che gli attaccanti stanno interrogando oltre a
core/. - Se gli updater personalizzati o di terze parti che bypassano la routine del core estraggano ancora in path prevedibili sotto
wp-content/— un'esposizione residua plausibile che la correzione al core non raggiunge. - Qualunque legame con ransomware o attori nominati: CISA registra l'uso noto da parte di ransomware come "Unknown".
Chiudere la finestra con una prova, non a tentoni
La domanda difficile che pone questa CVE non è "esiste una patch" — esiste — ma "cosa faccio adesso, e in che ordine, perché aggiornare non diventi l'evento di exploitation". È un problema di sequenza della remediation, ed è esattamente dove l'AI Remediation Advisor di Zero Hunt dà il meglio. L'advisor ordina cosa toccare per sfruttabilità reale — prima CISA KEV, poi exploitation confermata in-the-wild, poi CVSS ed EPSS — così una voce KEV con un orologio BOD 26-04 da tre giorni finisce in cima alla coda invece di competere con finding cosmetici. Per ogni voce produce la correzione esatta con le note di rollout e di rollback e un controllo compensativo, che per questo bug è il punto: nega wp-content/upgrade/ al bordo, poi prendi l'update, e non togliere nulla finché versione e checksum non verificano. E poiché Zero Hunt è un red team autonomo e basato su AI che gira on-premise sui propri modelli privati, con un essere umano nel ciclo per tutto ciò che è intrusivo, riverifica poi la correzione come proverebbe il difetto — un test gray-box, sicuro anche in black-box, contro la tua versione installata, per confermare che il path in staging non è più raggiungibile via web e che la race non vince più. Trovare la finestra sfruttabile prima di un attaccante, e riverificare che sia chiusa, è la metà "generative pentest" dello stesso motore. Se gestisci anche la base WordPress descritta nella nostra analisi della catena RCE pre-auth wp2shell, tratta entrambe come la stessa classe di problema: il path di aggiornamento e il path di richiesta sono superficie d'attacco, e la validazione continua — vedi il penetration testing automatizzato — è il modo di tenerli onesti. Sul perché a un bug così si attacchi ora una scadenza federale di tre giorni, leggi la nostra nota su BOD 26-04 e il patching basato sul rischio. Quando vuoi vederlo girare sui tuoi siti, contattaci.
Tutte le vulnerabilità che CISA segnala come sfruttate, con le scadenze federali: tracker CISA KEV →
Una patch per ogni CVE? Un programma CTEM verifica quali esposizioni sono davvero sfruttabili prima del prossimo advisory: cos'è il CTEM →
È sfruttabile nel tuo ambiente?
Zero Hunt lo verifica sulla tua rete: un red team AI autonomo su un'appliance on-premise, con AI privata, in black box o gray box e con una persona che approva ogni passo che conta. La prova di cosa è sfruttabile, la correzione e le evidenze firmate — nessun dato esce dal tuo perimetro.