Zum Hauptinhalt springenZur Fußzeile springen
Sicherheitsnachrichten

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

Aktualisiert Patrick Schlesinger
Diagramm der „wp2shell“-WordPress-Angriffskette, die von der ReportedIP -Firewall blockiert wurde

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 eine Anmeldung noch ein Plugin eines Drittanbieters. Websites, auf denen ReportedIP läuft, sind bereits geschützt: Die Regeln sind in der mitgelieferten Baseline enthalten und wurden an die Ruleset-API veröffentlicht, sodass kostenlose und 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. Wenn Sie Hive einsetzen, aktualisieren Sie es ebenfalls auf Version 2.1.25, da die beiden neuen Regeln in der kostenlosen Basisversion enthalten sind. Die Installations- und Aktualisierungsschritte finden Sie im Plugin-Handbuch, und die neueste Version ist auf der GitHub-Release-Seite verfügbar.

Die beiden Fehler und warum die Kette wichtig ist

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

  • CVE-2026-60137 (SQL-Injection, CVSS 9,1). REST author_exclude Der Parameter wird dem author__not_in Abfrage „var in“ WP_Query und als Zeichenfolge in ein post_author NOT IN (…) Klausel. Ein Wert wie 0) UNION SELECT …-- - schließt das IN() Liste und fügt beliebigen SQL-Code an. Diese Funktion ist für sich genommen nur über eine authentifizierte Abfrage der Sammlung erreichbar.
  • CVE-2026-63030 (REST-Batch-Routenverwechslung). In /wp-json/batch/v1, eine Unteranfrage, deren Pfad fehlschlägt wp_parse_url() wird an die interne $validation auflisten, aber nicht $matches. Die beiden Arrays geraten aus dem Takt, und eine validierte Teilanfrage wird über den Handler der nächsten Teilanfrage weitergeleitet. Dadurch kann eine GET /wp/v2/posts/999999 Tragen author_exclude unter der „Posts“-Sammlung get_items(), wo sich die injizierbare Abfragevariable befindet, 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 nutzt orderby=none und per_page=500 (sodass die Zeile als gefälschter Beitrag erhalten bleibt), fälscht es eine vollständige 23-spaltige wp_posts Zeile mit UNION SELECT und überträgt den durchgesickerten Wert in das reflektierte post_title. Von dort aus verzweigt sich die Kette in drei oembed_cache Beiträge, ruft deren IDs über dieselbe Injektion ab, 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-Account ermöglicht das Hochladen eines Plugins oder Themes die Ausführung von Code. In keinem Schritt sind Anmeldedaten erforderlich.

Wie ReportedIP dies verhindert

Die Hive-Firewall-Hooks init mit Priorität 1, und der optionale Drop-in-Lauf findet noch früher statt, und zwar über einen auto_prepend_file Schutzmechanismus, der vor dem Start von WordPress aktiv wird. Bei einer nicht authentifizierten Anfrage überprüft er die URI, den User-Agent und den Anfragetext bis zu einer Größe von 64 KB. Seit Version 2.1.25 überprüft er den Anfragetext sowohl im Rohformat als auch URL-dekodiert, sodass eine prozentkodierte Nutzlast innerhalb eines JSON-Blocks (SLEEP%283%29 statt SLEEP() ist für dieselben Signaturen sichtbar. Die Bericht über Firewalls befasst sich eingehender mit dem Motor.

Der Pfad zur Erstellung des Administrators hängt ab von UNION SELECT, die die kostenlose waf_sqli_union Die Regel wurde bereits vor dieser Version blockiert. 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 durch eine Änderung des Tokens nicht 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 gehören zur Paranoia-Stufe 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 eine Regelsynchronisierung erforderlich ist. Für Professional-Seiten werden dieselben Regeln an die API für signierte Regelsätze 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 kostenlosen als auch in der Professional-Stufe zurückgewiesen, und ein Korpus mit Fehlalarmen, 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 über die Plugins auf Version 2.1.25 oder klicken Sie auf „Nach Updates suchen“, um es 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, wenn Sie auf „Jetzt synchronisieren“ klicken. Wenn Sie viele Websites verwalten, führen Sie zunächst den Kern-Patch durch und lassen Sie die Firewall die Verteidigung übernehmen, während die Änderungen übernommen werden.

Häufig gestellte Fragen

Ersetzt ReportedIP das WordPress-Kern-Update?

Nein. Der Kern-Patch ist die Lösung. 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 haben die Stufe „Paranoia-Level-1“ und sind in der mitgelieferten Basisversion enthalten, sodass sie für jeden Tarif 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 Fehlalarme bestätigt wurde.

Die Tage rund um die Bekanntgabe spiegeln sich in unseren Telemetriedaten wider: Die Anzahl der Abfragen am REST-Batch-Endpunkt stieg Mitte Juli an. Der WordPress-Angriffsbericht 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.

Eine Antwort hinterlassen

Ihre E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit * gekennzeichnet

Bitte füllen Sie dieses Feld aus
Bitte füllen Sie dieses Feld aus
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren