flawopen.com/Teardowns/cve-2026-87902-wordpress-page-template-path-traversal
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]
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]
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-98
- CISA KEV — aufgenommen am 2026-09-25 — CVE-2026-87902
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-Bedingung | Beleg der Primärquellen | Maßnahme |
|---|---|---|
| Betroffener WordPress-Core-Zweig | Das 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 Themes | Das 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-Datei | Eine 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 RCE | Das 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
Eingabe erreicht Vorlagenauswahl
Eine nicht authentifizierte Anfrage liefert den Namen für Kandidaten; Konto und Klick sind nicht nötig.[1]
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]
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()
if ( $pagename ) {
$pagename_decoded = urldecode( $pagename );
if ( $pagename_decoded !== $pagename ) {
$templates[] = "page-{$pagename_decoded}.php";
}
}
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
- ✓Aktualisieren Sie auf die korrigierte Version Ihres Zweigs und prüfen Sie den tatsächlich laufenden Code.[1], [4]
- ✓Inventarisieren Sie internet-erreichbare WordPress-Systeme und erkennen Sie nicht unterstützte Versionen vor 4.7.[1], [4]
- ✓Prüfen Sie bei vorheriger Exposition Protokolle sowie unerwartete PHP-Dateien oder Konten; ein Signal ist ein Ermittlungsansatz, kein alleiniger Beweis.
- ✓Validieren Sie in eigenen Auflösern dekodierte Bestandteile und begrenzen Sie den kanonischen realen Pfad auf erlaubte Verzeichnisse.[1], [3]
- ✓Halten Sie Core und Themes aktuell; ein Theme-Wechsel kann die Expositionsbedingungen ändern.[1], [4]