
Una falla nel caricamento dei file di Elementor Pro consente agli aggressori di eseguire codice
Un bug di caricamento file non autenticato in Elementor Pro fino alla versione 4.2.1 consente a chiunque di eseguire codice su un sito WordPress. La versione 4.2.2 lo corregge.
Elementor Pro, l'estensione a pagamento del diffusissimo page builder Elementor per WordPress, presentava una falla critica nel caricamento dei file che permetteva a chiunque di collocare un programma funzionante su un sito web e di eseguirlo. Il bug è tracciato come CVE-2026-32475 e ha ottenuto un punteggio di 9.0 sulla scala CVSS, un sistema standard di valutazione da 0 a 10 dove un numero più alto indica una falla più pericolosa. Colpisce Elementor Pro versione 4.2.1 e precedenti, e la versione corretta, la 4.2.2, è stata rilasciata il 19 agosto 2026. La vulnerabilità è stata scoperta e segnalata a Patchstack da Tin Pham, noto come TF1T, e Patchstack ha pubblicato il suo resoconto tecnico del problema lo stesso giorno in cui afferma che la patch è stata distribuita. Patchstack dichiara di aver emesso regole di mitigazione per proteggere dallo sfruttamento della falla.
Per chi non lavora quotidianamente con i siti web: WordPress è il software che alimenta una grandissima parte dei siti mondiali, e un page builder è un plugin, cioè un componente software aggiuntivo, che consente a un proprietario di comporre pagine visivamente invece di scrivere codice. Elementor è uno dei page builder più popolari, ed Elementor Pro è la sua edizione commerciale. Tra le funzionalità che Elementor Pro aggiunge c'è un widget Forms, che permette al proprietario del sito di creare moduli di contatto, moduli di candidatura per offerte di lavoro e moduli per ticket di supporto all'interno dell'editor, incluso un campo File Upload per consentire a un visitatore di allegare un documento. È proprio in quel campo che risiede la falla, all'interno del modulo Forms del plugin.
L'analisi di Patchstack descrive il bug come una discrepanza tra due cicli nel file modules/forms/fields/upload.php. Quando un modulo viene inviato, due passaggi separati leggono lo stesso elenco di voci di file caricati. Il primo, un metodo chiamato validation(), controlla l'estensione di ogni voce rispetto a un elenco di tipi consentiti e a una blocklist di quelli non consentiti. Il secondo, un metodo chiamato process_field(), prende ogni voce valida e sposta il file in una directory pubblica. I due passaggi non concordano su cosa significhi una voce di file vuota. Una voce vuota è una parte di caricamento con un nome file vuoto, che PHP segnala come UPLOAD_ERR_NO_FILE. PHP è il linguaggio di programmazione con cui è scritto WordPress stesso.
Nel ciclo di validazione, una voce vuota incontrata mentre il campo non è contrassegnato come obbligatorio fa sì che l'intero metodo si fermi e restituisca un risultato, così ogni voce successiva in quella stessa sottomissione non viene controllata. Nel ciclo di elaborazione, la stessa voce vuota viene semplicemente saltata e il ciclo continua. Un aggressore può quindi inviare due parti di file per lo stesso campo: una prima voce vuota con un nome file vuoto, seguita da un file .php. La validazione smette di leggere alla prima voce e segnala un invio pulito. Il mover salta quella prima voce e sposta comunque il file .php. La distanza tra una difesa funzionante e questo bug, come lo definisce Patchstack, è una parola chiave.
La protezione prevista è una funzione chiamata is_file_type_valid(), che richiede che l'estensione di un file caricato compaia in un elenco consentito e la rifiuta se compare anche in una blocklist codificata. Quella blocklist elenca esplicitamente php, php3, php4, php5, php6, phps, php7, phtml, shtml, pht, swf, html, asp, aspx, cmd, csh, bat, htm, hta, jar, exe e com, tra gli altri. Patchstack osserva che il controllo in sé è valido. Semplicemente non viene mai eseguito.
Il passaggio di spostamento è dove avviene il danno. process_field() legge l'estensione dal nome file inviato, costruisce un nuovo nome con la funzione uniqid() di PHP e sposta il file nella directory pubblica dei moduli del plugin. Il nome file inviato viene completamente scartato. Solo l'estensione sopravvive nel nome memorizzato. Questo dettaglio esclude diversi altri trucchi. Una doppia estensione come shell.php.jpg è innocua in questo caso, perché il file verrebbe salvato con un nome casuale che termina in .jpg. Un file .htaccess caricato è altrettanto inerte, perché diventa un file .htaccess con nome casuale anziché un file di configurazione della directory. Conta solo l'estensione finale, e la discrepanza tra i cicli è sufficiente per farla passare oltre il controllo. Il risultato è un file .php che si trova in wp-content/uploads/elementor/forms/, una cartella pubblicamente raggiungibile via web. Chiunque può quindi richiedere direttamente quell'indirizzo e far eseguire il file al server. Questo è remote code execution: il codice dell'aggressore eseguito sul server del sito.
I requisiti per un attacco sono minimi. Il sito preso di mira deve avere almeno una pagina pubblicata contenente un modulo Elementor con un campo File Upload, che Patchstack descrive come una configurazione estremamente comune e quotidiana. Moduli di candidatura per offerte di lavoro, moduli che richiedono una foto, un documento d'identità o una ricevuta, e allegati per ticket di supporto usano tutti questo campo. L'interruttore Obbligatorio del campo è disattivato per impostazione predefinita, quindi non è necessaria alcuna impostazione rafforzata o insolita. Tutto ciò che serve all'aggressore per costruire la richiesta, il post_id, il form_id (l'identificatore interno di Elementor per il widget del modulo) e il nome dell'input del campo di caricamento, è visibile nell'HTML pubblico della pagina a qualsiasi visitatore. Il caricamento viene gestito tramite l'azione AJAX elementor_pro_forms_send_form, senza cookie e senza nonce richiesto. Un nonce è un token di sicurezza monouso che WordPress usa normalmente per verificare che una richiesta provenga da una pagina legittima.
Un dettaglio complica l'attacco: la risposta di caricamento non restituisce il percorso del file, quindi il nome deve essere calcolato. È più economico di quanto sembri, perché uniqid() non è casuale ma basato sul tempo. Produce 13 caratteri esadecimali, di cui otto codificano il timestamp Unix in secondi interi e cinque codificano i microsecondi. Poiché l'header di risposta Date del server fornisce direttamente i secondi, solo i cinque caratteri dei microsecondi devono essere indovinati, e Patchstack osserva che persino quello spazio può essere ristretto alla finestra attorno alla richiesta di exploit stessa. Esiste anche una via che non richiede alcuna congettura. Il modello di notifica predefinito di Elementor Pro, [all-fields], mostra ogni campo inviato, inclusa una riga con l'URL esatto del file caricato. Dove un modulo ha anche una seconda azione email di autoresponder abilitata, che Patchstack dice essere comune proprio nei moduli di candidatura e ticket di supporto che contengono campi di caricamento file, quell'email viene inviata all'indirizzo che l'aggressore ha inserito, rivelando l'URL preciso del caricamento.
La correzione nella versione 4.2.2 fa sì che i due cicli concordino su cosa significhi una voce di file vuota, così una voce non può più essere ignorata dal validatore mentre viene comunque raccolta dal mover. Patchstack aggiunge che le versioni attuali ricontrollano anche l'estensione all'interno di process_field() stesso, immediatamente prima che il file venga spostato, così la blocklist ora protegge direttamente la destinazione invece che solo il passaggio di validazione.
Poiché questa falla non è autenticata e lascia un file sul disco, l'aggiornamento chiude il buco ma non annulla un tentativo già riuscito. I siti che hanno eseguito una versione vulnerabile con un modulo pubblico contenente un campo File Upload dovrebbero anche controllare in wp-content/uploads/elementor/forms/ la presenza di qualsiasi cosa che non sia uno dei tipi di documento o immagine che i loro moduli accettano effettivamente, e in particolare di file che terminano in .php. Per i proprietari che preferiscono non occuparsi personalmente del rilascio dei plugin, un servizio di hosting WordPress gestito come AEU Hosting mette la piattaforma e la sua regolare manutenzione di sicurezza nelle mani di un fornitore invece che del proprietario del sito.
Patchstack definisce questa una classica falla di desincronizzazione: il codice che decide se un caricamento è consentito e il codice che agisce sul caricamento percorrono gli stessi dati con regole diverse. Nessuno dei due cicli è sbagliato di per sé, e leggere l'uno o l'altro isolatamente non mostra nulla di allarmante. Il bug esiste solo nel divario tra loro. Una parte di file vuota è sufficiente per far discordare validatore e mover, e quella discordanza trasforma un campo di caricamento file limitato in un modo per far eseguire codice a un estraneo sul server. La correzione alla radice consiste nel far condividere a entrambi i cicli esattamente la stessa visione di quali voci siano caricamenti reali e quali vuote, così una voce non può mai raggiungere il mover senza prima aver superato il validatore.
La cronologia pubblicata da Patchstack registra la sequenza: il 16 luglio 2026 ha ricevuto la segnalazione dal ricercatore, e lo stesso giorno ha confermato la vulnerabilità, contattato il fornitore e assegnato l'identificatore CVE CVE-2026-32475. Il 17 luglio 2026 il fornitore ha preparato la patch, con il rilascio ancora in sospeso. Il 3 agosto 2026 Patchstack ha esaminato la patch del fornitore e ha confermato che risolveva la vulnerabilità. Il 19 agosto 2026 il fornitore ha rilasciato la patch nella versione 4.2.2, e lo stesso giorno è stato pubblicato il resoconto dell'avviso di sicurezza.
Come Proteggerti
- Apri la dashboard di WordPress, vai alla pagina Plugin e aggiorna Elementor Pro alla versione 4.2.2 o successiva oggi stesso se è installato.
- Se non sei sicuro che il tuo sito usi Elementor Pro, chiedi a chi l'ha creato o lo ospita, oppure controlla l'elenco dei Plugin nella dashboard di WordPress.
- Se i moduli del tuo sito non hanno bisogno di allegati, rimuovi da essi il campo File Upload, dato che è la parte del modulo che sfrutta questo problema.
- Chiedi al tuo provider di hosting o allo sviluppatore di controllare nella cartella dove vengono salvati i caricamenti dei moduli la presenza di file inattesi che terminano in .php, l'estensione usata dal codice che fa funzionare il tuo sit
- Valuta di attivare gli aggiornamenti automatici per il software aggiuntivo del tuo sito, così correzioni di sicurezza come questa si installano da sole invece di aspettare te.
- Se il tuo sito ha eseguito una versione precedente con un modulo pubblico che accetta caricamenti di file, cambia la password di amministrazione di WordPress e chiedi a uno sviluppatore di controllare il sito per qualsiasi cosa insolita.
Vulnerabilità e Soluzioni
- CVE-2026-32475 An unauthenticated arbitrary file upload flaw in Elementor Pro version 4.2.1 and below that can lead to remote code execution, fixed in version 4.2.2. Vedi la soluzione e i dettagli →
I Termini Spiegati
- WordPress Il software gratuito che alimenta una grandissima parte dei siti web del mondo e consente ai proprietari di pubblicare pagine e articoli senza programmare.
- plugin Un componente software aggiuntivo che si installa su un sito web per dargli funzionalità extra, come un modulo di contatto o un page builder.
- remote code execution Quando un estraneo riesce a far eseguire al server di un sito web istruzioni scritte da lui, prendendo di fatto il controllo della macchina.
- unauthenticated Descrive un attacco che non richiede nome utente, password o account sul sito, quindi qualsiasi estraneo su internet può tentarlo.
- CVE-2026-32475 Il numero di riferimento ufficiale assegnato a questa specifica falla di sicurezza, così che fornitori, ricercatori e strumenti si riferiscano tutti allo stesso problema.
- CVSS Un sistema di punteggio standard da 0 a 10 per quanto è grave una falla di sicurezza, dove numeri più alti indicano un pericolo maggiore.
- nonce Un codice monouso che un sito web allega a una richiesta per dimostrare che proviene davvero dalla sua pagina e non da un estraneo.
- PHP Il linguaggio di programmazione con cui sono scritti WordPress e molti file dei siti web, e il linguaggio dei file che terminano in .php.