Elementor Pro opravuje kritickou chybu pro nahrání libovolného souboru
Elementor Pro opravuje kritickou zranitelnost, která umožňovala nepřihlášenému útočníkovi nahrát na web libovolný soubor včetně spustitelného PHP. Chyba zasahuje všechny verze do 4.2.1 včetně a dostala identifikátor CVE-2026-32475. Aktualizuj na Elementor Pro 4.2.2 nebo novější co nejdřív.
Problém se týká webů, které mají zveřejněnou stránku s formulářovým widgetem Form z Elementor Pro. Formulář musí obsahovat alespoň jedno nepovinné pole pro nahrání souboru (File Upload). Útočník se nemusí přihlašovat, takže zveřejněný formulář stačí jako vstupní bod.
Kritická zranitelnost
CVE-2026-32475 má skóre CVSS 9,8 z 10. Úspěšný útok může vést ke vzdálenému spuštění kódu a úplnému převzetí webu.
Koho chyba zasahuje a co udělat
Ohrožené jsou instalace Elementor Pro ve verzi 4.2.1 a starší. Plugin má odhadem 6 000 000 aktivních instalací. Opravená verze 4.2.2 vyšla 19. srpna 2026.
- V administraci WordPressu otevři přehled pluginů a ověř verzi Elementor Pro.
- Pokud používáš verzi 4.2.1 nebo starší, aktualizuj plugin alespoň na verzi 4.2.2.
- Projdi veřejné formuláře vytvořené v Elementor Pro, zejména ty s nepovinným polem pro nahrání souboru.
- Po aktualizaci ověř, že formuláře a legitimní nahrávání souborů fungují podle očekávání.
Jak obejití validace fungovalo
Elementor Pro zpracovává odeslané formuláře přes metodu ajax_send_form() ve třídě Ajax_Handler, kterou mohou volat i nepřihlášení návštěvníci. Plugin zabalí data formuláře včetně nahraných souborů do objektu Form_Record a předá je validačním a zpracovacím metodám třídy ElementorProModulesFormsFieldsUpload.
Při validaci nahrávky metoda validation() nejprve opraví indexy souborů, načte $_FILES['form_fields'] a případně ověří maximální počet souborů. Pak prochází jednotlivé položky nahrávacího pole. Kritická chyba byla v reakci na prázdnou první položku nepovinného pole: kód použil return, a tím ukončil validaci všech dalších položek.
foreach ( $files[ $id ] as $index => $file ) {
// U nepovinného pole nebyl v této položce nahrán soubor.
if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
return;
}
// Povinné pole bez souboru vrátí chybu.
if ( $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
$ajax_handler->add_error( $id, $upload_errors[ $file['error'] ] );
return;
}
// Ostatní chyby nahrávání vrátí chybu formuláře.
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' ) );
}
}Správně měl kód použít continue. Ten by prázdnou položku přeskočil a pokračoval kontrolou dalšího souboru. return ale metodu okamžitě ukončil, takže se pro zbývající položky nespustila kontrola přípony přes is_file_type_valid() ani kontrola velikosti přes is_file_size_valid().
Útočník proto mohl poslat nahrávací pole jako pole se dvěma částmi. První část nechal prázdnou, čímž vyvolal UPLOAD_ERR_NO_FILE a předčasný návrat z validace. Do druhé části vložil PHP payload a zvolil mu příponu, kterou by standardní validace odmítla.
Proč se soubor přesto uložil
Zpracovací metoda process_field() se k prázdné položce chovala správně: použila continue, nikoli return. První prázdnou část tedy přeskočila, ale druhou – už neověřenou – část zpracovala a uložila na disk.
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 ),
] );
}
}
}Metoda převezme příponu přímo z názvu souboru, který poslal klient. PHP soubor s příponou .php se tak mohl uložit do adresáře /wp-content/uploads/elementor/forms/. Útočník pak mohl nahraný soubor vyvolat přes URL a spustit jeho PHP kód na serveru.
Nahrání libovolného souboru patří mezi nejzávažnější třídy chyb ve WordPressu. Útočník může PHP soubor použít jako webshell nebo jinou techniku pro převzetí kontroly nad webem.
Časová osa opravy
- 24. července 2026 byla zranitelnost nahlášena prostřednictvím programu Wordfence.
- 27. července 2026 byla chyba ověřena včetně proof of conceptu a nahlášena týmu Elementor.
- 2. srpna 2026 Elementor potvrdil, že stejnou chybu nahlásil také jiný výzkumník, a začal připravovat opravu.
- 19. srpna 2026 vyšel Elementor Pro 4.2.2 s úplnou opravou.
Původně přidělené CVE se nepoužilo, protože stejná zranitelnost už měla identifikátor přidělený na základě hlášení třetí strany. Platný identifikátor je CVE-2026-32475.
Shrnutí
Neodkládej aktualizaci Elementor Pro: verze 4.2.2 opravuje chybu, která na veřejném formuláři s nepovinným nahráváním souborů dovolovala obejít kontrolu typu i velikosti souboru. Po aktualizaci zkontroluj formuláře s nahráváním souborů a ověř jejich běžné odesílání.
Jakub Dvořák
Linux administrátor a DevOps inženýr. Shell scripting a automatizace jsou mou vášní. Infrastruktura jako kód je budoucnost.
Všechny příspěvky