
Toolkit WordPress CVE-2026-87902 LFI-to-RCE con una catena di exploit weaponized (PEAR RCE, webshell, creazione admin, loot) e una versione SafeChecker non intrusiva e un risk auditor.

SOLO USO ETICO – TEST DI SICUREZZA AUTORIZZATI
Questo repository fornisce strumenti esclusivamente per professionisti della sicurezza autorizzati, blue team e penetration tester.
L'accesso non autorizzato a sistemi informatici è illegale ai sensi del CFAA (USA), Computer Misuse Act (Regno Unito), TCK 243/244 (Turchia) e leggi simili in tutto il mondo.
CVE‑2026‑87902 è una vulnerabilità critica di path traversal e local file inclusion (LFI) non autenticata in WordPress Core (versioni dalla 4.7.0 alla 7.1.1) che consente a un attaccante non autenticato di includere file .php locali arbitrari tramite il parametro di query pagename e, in specifiche condizioni del server, di escalare a remote code execution (RCE) concatenando il file PEAR pearcmd.php. Punteggio CVSS: 9.2 (Critico). Divulgata da Robert Ressl attraverso il programma HackerOne di WordPress nel luglio 2026. Corretta nella 7.1.2 il 22 settembre 2026, con backport fino alla 4.7.
La falla interessa ogni release di WordPress dal 2016 — un decennio di versioni che hanno superato la revisione del codice senza essere rilevate. La causa principale è una singola chiamata di validazione mancante in uno dei percorsi di codice più utilizzati del CMS.
Risoluzione del template non sanificata – get_page_template() in wp-includes/template.php costruisce i candidati template dalla variabile di query pagename. Un percorso di codice adiacente nella stessa funzione applica validate_file() per bloccare le sequenze ../, ma il ramo $pagename non la chiama. Qualsiasi traversal in pagename passa senza controlli.
Bypass del traversal con doppia codifica – WordPress applica sanitize_title_for_query() a pagename, che sostituisce i punti letterali (.) con trattini per prevenire il traversal. Ma la funzione opera su input già decodificato e non decodifica ricorsivamente. Un attaccante invia %252e%252e%252f; il web server lo decodifica una volta in %2e%2e%2f; il sanitizer non vede punti letterali e lo lascia passare; poi get_page_template() chiama di nuovo urldecode() all'interno della funzione, producendo ../.
Precondizione della directory del tema – Il tema attivo deve contenere una directory di primo livello il cui nome inizia con page- (ad esempio page-templates/). Il nome file costruito page-{pagename}.php sfugge quindi dalla root del tema tramite il traversal. I vecchi temi predefiniti (Twenty Twelve, Twenty Fourteen) e i popolari temi di terze parti (Neve, Hestia, Sydney) includono questa directory. Anche i temi child che ereditano da tali parent soddisfano la precondizione.
Sink LFI in locate_template() – Il percorso candidato viene passato a locate_template(), che cerca nelle directory del tema. Poiché il traversal risolve in un file al di fuori di quelle directory, e la funzione controlla solo file_exists(), qualsiasi file .php leggibile viene incluso con pieni privilegi del web server. Questo rende la LFI incondizionata su qualsiasi sito non patchato che soddisfi la precondizione del tema — incluso wp-config.php con le sue credenziali del database e i salt di autenticazione.
Escalation RCE tramite PEAR pearcmd.php – PEAR è incluso in molte installazioni PHP. Il suo pearcmd.php è normalmente solo CLI, ma quando register_argc_argv=On, PHP popola $_SERVER['argv'] dalla query string dell'URL. L'attaccante include pearcmd.php tramite la LFI, passa config-create come argomento e fornisce codice PHP più un percorso di output (/tmp/shell.php). PEAR scrive il codice dell'attaccante su disco; un secondo include lo esegue.
Seconda via di sfruttamento – Una richiesta che combina name (slug della front-page), page_id (ID della pagina dei post), preview=true e un payload pagename devia WP_Query nel suo ramo post_name, che non riscrive mai pagename attraverso sanitize_title_for_query(). Questo consente punti letterali nel traversal. Richiede un tema senza single.php.
Requisiti di configurazione del server – La RCE dipende da due condizioni comuni nelle distribuzioni reali: pearcmd.php presente/leggibile (frequente su hosting condiviso, cPanel, immagini Docker ufficiali di PHP) e register_argc_argv=On (predefinito in PHP sotto la 8.5). PHP 8.5 ha cambiato il default in Off. Su un server moderno PHP 8.5+ senza PEAR, lo sfruttamento si ferma alla LFI.
La patch – WordPress 7.1.2 aggiunge due livelli di difesa: (a) la chiamata mancante a validate_file() nel ramo pagename, e (b) una nuova funzione _wp_is_template_path_allowed() chiamata da locate_template() per ogni template risolto. La funzione rifiuta i percorsi contenenti .., poi risolve il percorso reale tramite realpath() e verifica che si trovi all'interno di una delle directory del tema consentite. Questa difesa in profondità chiude il sink, non solo una via verso di esso.
Sfruttamento attivo in the wild – Prime richieste malevole osservate 5 ore dopo il rilascio della patch (17:44 UTC, 22 settembre 2026). Il traffico è aumentato di dieci volte nel giorno successivo. Osservate tre fasi: ricognizione config-show → rilevamento file core → weaponization config-create. I nomi file dei payload includevano wp-pear-rce-flag.php, poc87902.php, luci_*.php, zeta_*.php, scritti in /tmp e /var/tmp. IP attaccanti: 169.58.48.193, 169.58.48.195, 2001:df1:e8c0::106b.
Impatto – Esecuzione di codice con privilegi del web server. Takeover completo del sito, furto di credenziali da wp-config.php, esfiltrazione di dati, installazione di webshell, creazione di utenti admin, reverse shell, attacchi supply-chain tramite plugin/temi modificati e movimento laterale verso servizi connessi. Il punteggio CVSS 9.2 riflette l'exploitabilità di rete, l'assenza di autenticazione e l'impatto elevato su riservatezza/integrità/disponibilità. L'elevata complessità di attacco riflette le precondizioni del tema e del server, ma su tipico hosting condiviso tali condizioni sono frequentemente soddisfatte.