Skip to main contentSkip to footer
Sicherheitsnachrichten

wp2shell: Nicht authentifizierte RCE-Schwachstelle in WordPress und wie man sie blockiert

Updated Patrick Schlesinger
Diagram of the wp2shell WordPress attack chain blocked by the ReportedIP Hive firewall

wp2shell ist eine Kette zur Ausführung von Remote-Code ohne Authentifizierung im WordPress-Kern. Sie kombiniert eine SQL Injection (CVE-2026-60137) mit einem REST-Batch-Route-Confusion-Fehler (CVE-2026-63030) und erfordert weder einen Login noch ein Plugin eines Drittanbieters. Websites, auf denen ReportedIP Hive läuft, sind bereits geschützt: Die Regeln sind in der mitgelieferten Baseline aktiv und wurden an die Ruleset-API veröffentlicht, sodass sowohl kostenlose als auch synchronisierte Installationen das Anfragemuster bereits heute blockieren.

Wenden Sie zunächst den Patch für den WordPress-Kern auf die korrigierte Version an. Damit beseitigen Sie die eigentliche Ursache. Eine Firewall schützt Sie in der Zeit, bis alle Websites in Ihrem Bestand aktualisiert sind, und fängt Varianten ab, ist jedoch kein Ersatz für den Kern-Patch. Falls Sie Hive einsetzen, aktualisieren Sie es ebenfalls auf Version 2.1.25, da die beiden neuen Regeln in der Free-Version enthalten sind. Die Installations- und Aktualisierungsschritte finden Sie im Plugin-Handbuch, und die neueste Version ist auf der GitHub Releases-Seite verfügbar.

Die beiden Fehler und warum die Kette von Bedeutung ist

Keiner der beiden Fehler ist für sich genommen schwerwiegend. In Kombination führen sie jedoch dazu, dass eine anonyme Anfrage bis hin zur Codeausführung durchgesetzt wird.

  • CVE-2026-60137 (SQL Injection, CVSS 9.1). Der REST- author_exclude Parameter wird der author__not_in Abfragevariable in WP_Query und als Zeichenfolge in eine post_author NOT IN (…) Klausel. Ein Wert wie 0) UNION SELECT …-- - schließt die IN() Liste und fügt beliebiges SQL an. Für sich allein ist dies nur über eine authentifizierte Abfrage der Sammlung erreichbar.
  • CVE-2026-63030 (Verwechslung von REST-Batch-Routen). In /wp-json/batch/v1wird eine Unteranfrage, deren Pfad fehlschlägt, wp_parse_url() , wird an die interne $validation Liste angehängt, jedoch nicht an $matches. Die beiden Arrays geraten aus dem Takt, und eine validierte Unteranfrage wird an den Handler der nächsten Unteranfrage weitergeleitet. Dies ermöglicht es einer GET /wp/v2/posts/999999 , die author_exclude ohne Authentifizierung unter dem get_items()ausgeführt zu werden, in der sich die injizierbare Abfragevariable befindet, und zwar ohne Authentifizierung.

Die Batch-Eskalation betrifft WordPress 6.9 und neuere Versionen, in denen die Behandlung von Routenkonflikten implementiert ist.

Von einem „Blind-SQLi“ zu einer Shell

Sobald die Injektion eine nicht aufgespaltene Abfrage erreicht (der Exploit verwendet orderby=none und per_page=500 , sodass die Zeile als gefälschter Eintrag erhalten bleibt), fälscht er eine vollständige Zeile mit 23 Spalten wp_posts mit UNION SELECT und überträgt den durchgesickerten Wert in die reflektierte post_title. Von dort aus sät die Kette drei oembed_cache Beiträge, gewinnt deren IDs über dieselbe Injektion zurück, wandelt diese IDs in ein Customizer-Changeset und einen Nav-Menu-Item-Graph um und legt über die REST-Benutzerroute einen neuen Administrator an. Mit einem Administrator-Zugang ermöglicht das Hochladen eines Plugins oder Themes die Codeausführung. In keinem Schritt sind Anmeldedaten erforderlich.

Wie ReportedIP Hive dies verhindert

Die Hive-Firewall greift init mit Priorität 1, und der optionale Drop-in wird noch früher über einen auto_prepend_file Guard, noch bevor WordPress startet. Bei einer nicht authentifizierten Anfrage überprüft er die URI, den User-Agent und den Request-Body bis zu einer Größe von 64 KB. Seit Version 2.1.25 überprüft er den Body sowohl im Rohformat als auch URL-dekodiert, sodass eine prozentkodierte Payload innerhalb eines JSON-Batches (SLEEP%283%29 anstelle von SLEEP() für dieselben Signaturen sichtbar ist. Die Dokumentation zur Firewall behandelt die Engine ausführlicher.

Der Pfad zur Erstellung des Administrators hängt davon ab UNION SELECT, ob die freie waf_sqli_union Regel bereits vor dieser Version blockiert hat. Mit Version 2.1.25 werden zwei strukturelle Regeln hinzugefügt, die nicht davon abhängen, dass die SQL-Schlüsselwörter im Hauptteil erhalten bleiben.

  • waf_rest_batch_desync entspricht der Klasse fehlerhafter Teilanforderungspfade, die ein Batch-Parser ablehnt, wie beispielsweise zwei oder mehr führende Schrägstriche oder ein Schema mit einem leeren Host. Da es auf den Desync-Primer selbst abzielt, lässt sich diese Überprüfung nicht durch eine Änderung des Tokens umgehen.
  • waf_rest_batch_nested entspricht der einen Invarianten, die der Angriff nicht aufheben kann, nämlich einer Unteranfrage, deren Hauptteil selbst ein Batch ist ("body":{…"requests":[).

Beide Regeln entsprechen dem Paranoia Level 1 und sind gegen katastrophales Backtracking abgesichert. Sie sind in der Offline-Baseline enthalten, die bei jeder Installation mitgeliefert wird, sodass der Schutz sofort nach der Aktualisierung des Plugins aktiv ist, ohne dass ein Rule Sync erforderlich ist. Für Professional-Seiten werden dieselben Regeln in der signierten Ruleset-API veröffentlicht und sind bei der nächsten Synchronisierung verfügbar. Im Vergleich zum öffentlichen Proof-of-Concept wurden alle sechs Stufen sowohl in der Free- als auch in der Professional-Stufe zurückgewiesen, und ein Korpus mit False Positives, bestehend aus normalen Batch-Aufrufen, protokollrelativen URLs und absoluten URLs, blieb fehlerfrei.

Was ist nun zu tun?

Aktualisieren Sie den WordPress-Kern auf all Ihren Websites. Aktualisieren Sie „ReportedIP Hive“ über den Plugin-Bereich auf Version 2.1.25 oder klicken Sie auf „Nach Updates suchen“, um das Update sofort herunterzuladen. Kostenlose und nicht synchronisierte Websites erhalten beide Regeln mit dem Plugin-Update. Synchronisierte Professional-Websites erhalten sie bei der nächsten Synchronisierung des Regelsatzes oder sofort über „Jetzt synchronisieren“. Wenn Sie viele Websites verwalten, führen Sie zunächst den Core-Patch durch und lassen Sie die Firewall die Verteidigung aufrechterhalten, während die Änderungen übernommen werden.

Häufig gestellte Fragen

Ersetzt „ReportedIP Hive“ das WordPress-Kern-Update?

Nein. Der Kern-Patch stellt die eigentliche Behebung dar. Hive blockiert das Anfragemuster vor dem anfälligen Code, wodurch das Patch-Fenster geschützt wird und Varianten abgefangen werden; der zugrunde liegende Fehler wird dadurch jedoch nicht beseitigt.

Sind kostenlose Websites vor wp2shell geschützt?

Ja. Beide neuen Regeln gehören zum „Paranoia Level 1“ und sind in der mitgelieferten Basisversion enthalten, sodass sie für alle Tarife gelten, sobald das Plugin auf Version 2.1.25 aktualisiert wird.

Werden die neuen Regeln legitime REST-Batch-Anfragen blockieren?

Nein. Sie zielen auf fehlerhafte Pfade von Unteranfragen und einen in den Haupttext einer Unteranfrage verschachtelten Batch ab. Normale Batch-Aufrufe erzeugen solche Strukturen nicht, was durch den Korpus der False Positives bestätigt wurde.

Die Tage rund um die Bekanntgabe spiegeln sich in unseren Telemetriedaten wider: Die Anzahl der Abfragen an REST-Batch-Endpoints stieg Mitte Juli an. Der WordPress Attack Report für Mai bis Juli 2026 ordnet „wp2shell“ im Kontext von 1,69 Millionen weiteren Angriffen ein, und die Plattform „Threat Reports“ erfasst die Daten vierteljährlich.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fill out this field
Fill out this field
Bitte geben Sie eine gültige E-Mail-Adresse ein.
You need to agree with the terms to proceed