Vulnerabilità critica in Elementor Pro: aggiorna alla versione 4.2.2
Elementor Pro fino alla versione 4.2.1 contiene una vulnerabilità critica di caricamento arbitrario di file senza autenticazione, identificata come CVE-2026-32475. Il problema può consentire a un attaccante di caricare file eseguibili PHP e arrivare all’esecuzione di codice remoto, fino al controllo completo del sito.
Aggiorna subito Elementor Pro
La correzione è disponibile in Elementor Pro 4.2.2, rilasciato il 19 agosto 2026. Tutte le versioni fino alla 4.2.1 inclusa sono vulnerabili.
Quali siti sono esposti
La vulnerabilità riguarda il plugin premium Elementor Pro, installato su una stima di 6 milioni di siti attivi. Per sfruttarla, un sito deve avere una pagina pubblicata con un widget Form di Elementor Pro che contiene almeno un campo File Upload non obbligatorio.
Un visitatore non deve autenticarsi per raggiungere il percorso vulnerabile. Il punto di ingresso è la funzione ajax_send_form() della classe Ajax_Handler, che riceve le richieste inviate dal modulo e le passa, insieme ai file caricati, a un oggetto Form_Record e alle routine di validazione ed elaborazione.
- Software interessato: Elementor Website Builder Pro (
elementor-pro). - Versioni interessate: tutte fino alla 4.2.1 inclusa.
- Versione corretta: 4.2.2.
- Gravità CVSS: 9,8 su 10, critica.
- Condizione necessaria: una pagina pubblicata con un Form di Elementor Pro e almeno un campo File Upload non obbligatorio.
Come il controllo dei file viene aggirato
Per i campi File Upload, Elementor Pro usa i metodi validation() e process_field() della classe ElementorProModulesFormsFieldsUpload. Il difetto si trova nel ciclo di validazione: quando il primo elemento dell’array di file restituisce l’errore PHP UPLOAD_ERR_NO_FILE e il campo non è obbligatorio, il metodo esegue return.
foreach ( $files[ $id ] as $index => $file ) {
// Nessun file nel primo slot di un campo facoltativo.
if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
return;
}
if ( $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
$ajax_handler->add_error( $id, $upload_errors[ $file['error'] ] );
return;
}
if ( $file['error'] > UPLOAD_ERR_OK ) {
$ajax_handler->add_error( $id, $upload_errors[ $file['error'] ] );
return;
}
if ( ! $this->is_file_type_valid( $field, $file ) ) {
$ajax_handler->add_error( $id, esc_html__( 'This file type is not allowed.', 'elementor-pro' ) );
}
if ( ! $this->is_file_size_valid( $field, $file ) ) {
$ajax_handler->add_error( $id, esc_html__( 'This file exceeds the maximum allowed size.', 'elementor-pro' ) );
}
}In quel punto dovrebbe comparire continue: l’istruzione salterebbe soltanto lo slot vuoto e continuerebbe a controllare gli elementi successivi. return, invece, interrompe l’intero metodo validation(). Di conseguenza, Elementor Pro non esegue più né is_file_type_valid() per verificare l’estensione e il tipo di file, né is_file_size_valid() per controllarne la dimensione.
L’attaccante può inviare il campo di caricamento come un array con due parti: la prima vuota, che attiva UPLOAD_ERR_NO_FILE, e la seconda contenente un file PHP con un’estensione scelta dall’attaccante. Il primo elemento arresta la validazione e il secondo non passa dai controlli sull’estensione, sul tipo e sulla dimensione.
Perché il file arriva comunque sul server
L’elaborazione successiva non replica l’errore. process_field() usa continue quando incontra uno slot senza file: ignora l’elemento vuoto, prosegue con il secondo file non validato e lo salva sul disco.
foreach ( $files[ $id ] as $index => $file ) {
if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
continue;
}
$uploads_dir = $this->get_ensure_upload_dir();
$file_extension = pathinfo( $file['name'], PATHINFO_EXTENSION );
$filename = uniqid() . '.' . $file_extension;
$filename = wp_unique_filename( $uploads_dir, $filename );
$new_file = trailingslashit( $uploads_dir ) . $filename;
if ( is_dir( $uploads_dir ) && is_writable( $uploads_dir ) ) {
$move_new_file = Plugin::instance()->php_api->move_uploaded_file(
$file['tmp_name'],
$new_file
);
if ( false !== $move_new_file ) {
chmod( $new_file, 0644 );
$record->add_file( $id, $index, [
'path' => $new_file,
'url' => $this->get_file_url( $filename ),
] );
}
}
}Il metodo ricava l’estensione direttamente dal nome file fornito dal client, genera un nome univoco con uniqid(), applica wp_unique_filename() e sposta il file nella directory di upload. Un file con estensione .php finisce quindi in /wp-content/uploads/elementor/forms/; richiedendo quel file, un attaccante può eseguire il payload PHP sul server.
Le vulnerabilità di caricamento arbitrario di file possono portare alla compromissione completa di un sito, anche tramite webshell e altre tecniche. In questo caso la combinazione fra validazione interrotta e successiva elaborazione del file rende possibile la catena di attacco.
Cronologia della correzione
Wordfence ha ricevuto la segnalazione della vulnerabilità il 24 luglio 2026. Il 27 luglio ha validato la segnalazione, confermato il proof of concept e comunicato il problema al team di Elementor.
- 24 luglio 2026: viene inviata la segnalazione della vulnerabilità di caricamento arbitrario di file senza autenticazione.
- 27 luglio 2026: viene confermato il proof of concept e il problema viene comunicato al fornitore.
- 2 agosto 2026: Elementor comunica che un’altra terza parte ha segnalato la stessa vulnerabilità e che sta preparando una correzione.
- 19 agosto 2026: Elementor Pro 4.2.2, con la correzione completa, viene pubblicato.
Poiché la stessa vulnerabilità era stata segnalata anche da un’altra terza parte, il CVE inizialmente assegnato è stato ritirato ed è stato adottato l’identificativo CVE-2026-32475.
Cosa fare adesso
Apri la Bacheca di WordPress, aggiorna Elementor Pro alla versione 4.2.2 o a una versione successiva e verifica che l’aggiornamento sia stato applicato. Dai priorità ai siti che espongono pagine pubbliche con il widget Form e campi File Upload facoltativi: sono quelli che soddisfano il prerequisito necessario allo sfruttamento della falla.
Francesca Rossi
Caporedattrice del team italiano, specialista in design system e librerie di componenti. Non posso vivere senza Figma e Storybook. Il mio obiettivo è un'interfaccia utente coerente.
Tutti gli articoli