FlawOpen

flawopen.com/Teardowns/cve-2026-87902-wordpress-page-template-path-traversal

● CVE-2026-87902 · CVSS 9.2[1] · Kritisch
Sicherheitsforschung · FlawOpen

CVE-2026-87902: Pfad-Traversal in WordPress-Seitenvorlagen

Ein ungeprüfter dekodierter Seitenname gelangte in die Vorlagenauflösung und ermöglichte lokale PHP-Einbindung ohne Anmeldung; RCE erforderte bestimmte Theme- und PHP-Bedingungen.[1]

💡 Einfache Erklärung (ELI5)

Stellen Sie sich eine Bibliothekarin vor, die jede Anfrage prüft. WordPress prüfte einen Weg zu Vorlagen, übersah aber den Weg über den dekodierten Namen; besondere Pfadmarker konnten aus dem Theme-Verzeichnis hinausführen. Der Fix prüft den Namen und hält die Vorlage in einem erlaubten Verzeichnis.[1], [2], [3]

Kernkonzepte & Begriffe

Auflösung von Seitenvorlagen
WordPress ordnet PHP-Kandidaten und sucht im aktiven Theme die erste passende Datei.[1], [2]
Pfad-Traversal
Bestandteile wie .. können das vorgesehene Verzeichnis verlassen, wenn Eingaben ungeprüft bleiben.[1]
Lokale PHP-Einbindung
Lädt eine bereits auf dem Server vorhandene PHP-Datei; RCE erfordert weitere Bedingungen.[1]
`validate_file()`
WordPress-Funktion, die unzulässige Pfadbestandteile vor ihrer Verwendung zurückweist.[3]
CWE-98
CWE-98 — Unzureichende Kontrolle des Dateinamens bei include/require: Die Eingabe wird vor der Auswahl einer PHP-Datei nicht ausreichend eingeschränkt.[1], [7]

Framework-Zuordnungen

Ursachenanalyse

In get_page_template() dekodierte WordPress pagename und fügte page-{name}.php ohne validate_file() hinzu, anders als im benachbarten Zweig. So konnte der Pfad das Theme verlassen. Erforderlich sind ein oberstes Verzeichnis page-* und eine lesbare lokale PHP-Datei; RCE setzt weitere PHP-/Serverbedingungen voraus. Version 7.1.2 prüft den dekodierten Wert und begrenzt den aufgelösten Pfad in locate_template(). Das WordPress-Advisory ordnet die Schwachstelle CWE-98 zu (unzureichende Kontrolle des Dateinamens in einem PHP-include/require) und nennt Robert Ressl als Entdecker und verantwortlichen Offenleger.[1], [2], [3], [7]

CVE-2026-87902: Betroffenheit und bedingte RCE

Deployment-BedingungBeleg der PrimärquellenMaßnahme
Betroffener WordPress-Core-ZweigDas GHSA führt die betroffenen Versionen je Zweig auf: von 4.7.0–4.7.36 bis 7.1.0–7.1.1. Die zugehörigen Fixes reichen von 4.7.37 (ältester Backport) bis 7.1.2 (aktueller Zweig); für jeden aufgeführten Zweig gibt es eine eigene korrigierte Version.Prüfen Sie die installierte Core-Version und spielen Sie den passenden Zweig-Fix ein. Aktualisieren Sie Versionen vor 4.7 auf eine unterstützte Version.
Aufbau des aktiven ThemesDas aktive Parent- oder Child-Theme muss ein Verzeichnis auf oberster Ebene enthalten, dessen Name mit page- beginnt (zum Beispiel page-templates).Prüfen Sie die Verzeichnisse beider aktiven Themes. Kontrollieren Sie diese Voraussetzung erneut, wenn sich das aktive Theme ändert.
Lesbare lokale PHP-DateiEine ausgewählte .php-Datei muss außerhalb der aktiven Theme-Verzeichnisse vorhanden und für das Webserver-Konto lesbar sein.Prüfen Sie, welche lokalen PHP-Dateien der Webserver lesen kann; der CVE-Versionsbereich allein belegt keine Dateieinbindung.
Umgebung für bedingte RCEDas Advisory beschreibt RCE nur bei zusätzlichen PHP-/Serverbedingungen. Beispiele sind pearcmd.php mit register_argc_argv=On, das offizielle PHP-Docker-Image und Standard-cPanel-Konfigurationen mit PHP vor 8.5.Bewerten Sie die tatsächliche PHP-Laufzeit und -Konfiguration. Eine verwundbare WordPress-Version allein belegt weder RCE noch eine Kompromittierung.

Schritt-für-Schritt Angriffsablauf

Schritt 1

Eingabe erreicht Vorlagenauswahl

Eine nicht authentifizierte Anfrage liefert den Namen für Kandidaten; Konto und Klick sind nicht nötig.[1]

Schritt 2

Erneute Dekodierung

get_page_template() dekodiert den Namen erneut; betroffene Versionen prüften den dekodierten Kandidaten nicht.[2], [3]

Schritt 3

Suche verlässt den Stamm

Mit einem page-*-Verzeichnis und lesbarer lokaler PHP-Datei kann das Theme eine Datei außerhalb seines Ordners auflösen.[1]

Schritt 4

Bedingte Auswirkung

RCE hängt von zusätzlichen PHP-/Servervoraussetzungen ab; die Version allein beweist keine Ausnutzbarkeit oder Kompromittierung.[1]

Quellcode: Verwundbar vs. Sicher

Dieser Ausschnitt vergleicht die offiziellen Tags 7.1.1 und 7.1.2. Der Patch prüft den Wert nach dem Dekodieren; dieselbe Version begrenzt außerdem aufgelöste Pfade in locate_template(). Dies ist Upstream-Code, kein vollständiger eigenständiger Patch und keine Exploit-Demonstration.[2], [3]

Quelltextauszug: wp-includes/template.php — get_page_template()

VERWUNDBARE IMPLEMENTIERUNG
if ( $pagename ) {
    $pagename_decoded = urldecode( $pagename );

    if ( $pagename_decoded !== $pagename ) {
        $templates[] = "page-{$pagename_decoded}.php";
    }
}
GEHÄRTETER SICHERHEITS-PATCH
if ( $pagename ) {
    $pagename_decoded = urldecode( $pagename );

    if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {
        $templates[] = "page-{$pagename_decoded}.php";
    }
}

Checkliste für Engineering & Systemsicherheit

Quellen