Spring til indhold
Kritisk filupload-sårbarhed lukket i Elementor Pro 4.2.2
Mads Jensen
Mads Jensen 20. August 2026 · 5 min læsetid

Kritisk filupload-sårbarhed lukket i Elementor Pro 4.2.2

Elementor Pro har lukket en kritisk sårbarhed, der kan give en uautoriseret angriber fuld kontrol over et WordPress-site. Fejlen berører alle versioner til og med 4.2.1, mens version 4.2.2 indeholder rettelsen.

Opdater straks

Bruger du Elementor Pro 4.2.1 eller en ældre version, skal du opdatere til mindst 4.2.2. Sårbarheden har CVSS-score 9,8 ud af 10 og er registreret som CVE-2026-32475.

Hvad sårbarheden betyder for dit site

Fejlen gør det muligt at uploade vilkårlige filer uden login, herunder eksekverbare PHP-filer. Hvis en angriber får lagt en PHP-fil på serveren og efterfølgende henter den via web, kan koden køre på serveren. Det kan føre til fjernudførelse af kode og i sidste ende en komplet overtagelse af sitet, blandt andet med webshells.

Elementor Pro er et premium-plugin med anslået 6.000.000 aktive installationer. Sårbarheden kræver dog en konkret opsætning: Sitet skal have en offentliggjort side med Elementor Pro Form-widgetten og mindst ét File Upload-felt, der ikke er markeret som obligatorisk.

Austin Ginder opdagede og indrapporterede sårbarheden ansvarligt. Elementor blev orienteret den 27. juli 2026, og den fulde rettelse udkom den 19. august 2026.

Fejlen ligger i valideringen af uploadfeltet

Formularindsendelser går gennem ajax_send_form() i klassen Ajax_Handler, som også kan nås af besøgende uden login. Uploadede filer ender derefter i validation() og process_field() i klassen ElementorProModulesFormsFieldsUpload.

I validation() gennemløber pluginet filerne i et uploadfelt. Når feltet ikke er obligatorisk, og første element i fil-arrayet mangler, afslutter koden imidlertid hele funktionen med return. Dermed springer den ikke blot det tomme felt over: Den undlader også at validere alle efterfølgende filer i samme felt.

foreach ( $files[ $id ] as $index => $file ) {
    // Et valgfrit, tomt første uploadslot afslutter hele valideringen.
    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' ) );
    }
}

Den tilsigtede håndtering af et tomt uploadslot ville være continue, som går videre til næste element i løkken. return afbryder i stedet både filtypekontrollen via is_file_type_valid() og filstørrelseskontrollen for alle resterende filer.

Sådan kan angrebet gennemføres

En angriber kan sende uploadfeltet som et array med to dele. Den første del er tom og får fejlkoden UPLOAD_ERR_NO_FILE, hvilket udløser den tidlige afslutning af valideringen. Den anden del indeholder angriberens PHP-payload med en selvvalgt filendelse, som derfor aldrig bliver kontrolleret.

Efter den afbrudte validering fortsætter process_field() alligevel. Her bruger koden korrekt continue for at springe den tomme første post over, hvorefter den behandler den ukontrollerede anden fil. Pluginet henter filendelsen direkte fra det klientleverede filnavn og gemmer filen på disken.

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 );
        }
    }
}

En fil med endelsen .php kan derfor havne direkte i /wp-content/uploads/elementor/forms/. En uautoriseret angriber kan derefter anmode om filens URL og få PHP-payloaden eksekveret på serveren.

Berørte og rettede versioner

  • Berørt software: Elementor Website Builder Pro (elementor-pro).
  • Berørte versioner: Alle versioner til og med 4.2.1.
  • Rettet version: 4.2.2.
  • CVE: CVE-2026-32475.
  • Alvorlighed: CVSS 9,8, kritisk.

Tidslinje

  1. 24. juli 2026: Sårbarheden blev indrapporteret.
  2. 27. juli 2026: Rapporten og proof-of-concept-angrebet blev valideret, og Elementor blev underrettet.
  3. 2. august 2026: Elementor oplyste, at en anden researcher også havde rapporteret sårbarheden, og at en rettelse var under udvikling.
  4. 19. august 2026: Elementor Pro 4.2.2 med den fulde rettelse blev frigivet.

Det skal du gøre nu

Åbn WordPress-kontrolpanelet, og kontrollér Elementor Pro-versionen på alle dine sites. Opdater straks til 4.2.2 eller nyere, hvis et site bruger 4.2.1 eller ældre. Gennemgå især offentlige Elementor-formularer med valgfri filuploadfelter, indtil opdateringen er på plads.

Mads Jensen

Mads Jensen

Kubernetes og container orchestration ekspert. Microservices deployment og cluster management er min hverdag. Skalerbarhed i centrum.

Alle indlæg

Bliv en del af HelloWP-communityet!

Chat med os om WordPress og webudvikling, og del erfaringer med andre udviklere.

- medlemmer
- online
Deltag

Vi bruger cookies til at forbedre din oplevelse. Ved at fortsætte accepterer du vores Cookiepolitik.