
# Docker-Lab zur Reproduktion von CVE-2026-27541, einer authentifizierten Privilegieneskalation in WooCommerce Wholesale Prices. Vergleicht verwundbare und gepatchte Builds, enthält PoC-Skript und Root-Cause-Analyse.

Dieses Projekt ist ein lokales Docker-Labor zur Analyse und Reproduktion des Verhaltens von CVE-2026-27541 im WooCommerce Wholesale Prices / Wholesale Suite-Plugin, indem verwundbare und gepatchte Builds Seite an Seite auf derselben Maschine verglichen werden.
Das Kernproblem ist Broken Access Control im folgenden REST-API-Endpunkt:
/wp-json/wwp/v1/admin/save
Basierend auf dem in diesem Labor verwendeten Quellcode verfügt diese Route in beiden Builds (verwundbar und gepatcht) bereits über einen permission_callback. Die betroffene Version verwendet jedoch eine zu weit gefasste Fähigkeitsprüfung für eine Admin-Einstellungs-Schreibaktion:
2.2.6) → current_user_can( 'manage_woocommerce' )2.2.7) → current_user_can( 'manage_options' )In diesem Labor hat der Benutzer shopmgr, der die Rolle shop_manager besitzt, manage_woocommerce=true, aber nicht manage_options. Dadurch kann dieser Benutzer mit geringen Rechten eine gültige angemeldete Sitzung sowie ein gültiges X-WP-Nonce verwenden, um den Admin-Einstellungs-Speicher-Endpunkt im verwundbaren Build aufzurufen, während der gepatchte Build für dieselbe Anfrage 403 rest_forbidden zurückgibt.
2.2.6): Der Benutzer shopmgr kann erfolgreich POST /wp-json/wwp/v1/admin/save aufrufen und Plugin-Einstellungen ändern.2.2.7): Dieselbe Anfrage von shopmgr wird mit 403 abgelehnt.403 zurück, was konsistent mit einem Post-Authentifizierungs-Privilegienausweitungsproblem ist.wwp_see_wholesale_prices_replacement_text=PWNED_BY_POC, während der gepatchte Build weiterhin See wholesale prices zurückgibt.vuln → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.6patched → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.7db-vuln / db-patched → separate MariaDB-Datenbankenseed-vuln / seed-patched → wp-cli-Seed-Jobs, die WordPress installieren, das Plugin installieren, Benutzer erstellen und ein Produkt für Tests erstellenhttp://localhost:8081 → verwundbarhttp://localhost:8082 → gepatchtwordpress:6.8.1-php8.2-apachemariadb:11.4.5wordpress:cli-php8.2.
├── docker-compose.yml
├── README.md
├── patched/
│ └── Dockerfile
├── vuln/
│ └── Dockerfile
├── scripts/
│ └── seed-wp.sh
└── poc.py
docker-compose.yml — definiert die verwundbaren und gepatchten Stacks mit separaten Datenbankenscripts/seed-wp.sh — installiert WordPress, WooCommerce, das Ziel-Plugin und erstellt Testbenutzer und Produktdatenpoc.py — PoC mit minimalem Schadenspotenzial für Login, Nonce-Extraktion und REST-Endpunkt-AufrufSobald der Stack bereit ist, erstellt das Seed-Skript Folgendes:
admin / AdminPass!234shopmgr / ShopMgrPass!234lab-product10050WooCommerce: 10.6.0
WooCommerce Wholesale Prices:
2.2.62.2.7Das Skript schreibt außerdem lab-secrets.json in jeden WordPress-Container, damit die Seed-Daten und Versionsinformationen überprüft werden können.
Dieser PoC versucht nicht, die Website zu übernehmen, Rollen zu ändern, Plugins zu installieren oder eine Shell auszuführen.
Er führt nur Folgendes aus:
shopmgr anwpApiSettings.nonce zu extrahierenwwp_see_wholesale_prices_replacement_text = PWNED_BY_POC
Diese Einstellung wird als beobachtbarer Marker verwendet, um zu demonstrieren, dass ein Benutzer mit geringen Rechten eine nur für Administratoren bestimmte Konfiguration ändern kann.
POST /wp-json/wwp/v1/admin/saveObwohl der Endpunkt eine gültige Sitzung und ein Nonce erfordert, erlaubt die verwundbare Version dennoch einem Benutzer mit geringen Rechten wie shopmgr mit der Rolle shop_manager, einen Endpunkt aufzurufen, der nur für Administratoren gedacht sein sollte.
Dies ist keine nicht authentifizierte Schwachstelle.
Wenn der Endpunkt direkt ohne angemeldete Sitzung aufgerufen wird, lehnen sowohl der verwundbare als auch der gepatchte Build die Anfrage ab. Der Fehler liegt in der Autorisierung nach der Authentifizierung, nicht in der Authentifizierung selbst.
Der verwundbaren Version fehlt kein permission_callback. Der Fehler besteht darin, dass sie eine zu weit gefasste Fähigkeitsprüfung (manage_woocommerce) für eine REST-Aktion verwendet, die Admin-seitige Einstellungen schreibt.
Aus dem Quellcode in includes/class-wwp-admin-settings.php:
POST /wp-json/wwp/v1/admin/savesave_registered_settings() weiterpermission_admin_check() als permission_callback2.2.6)if ( ! current_user_can( 'manage_woocommerce' ) ) {
return new WP_Error( 'rest_forbidden', ... );
}
2.2.7)if ( ! current_user_can( 'manage_options' ) ) {
return new WP_Error( 'rest_forbidden', ... );
}
In diesem Labor hat der Benutzer shopmgr, der die Rolle shop_manager besitzt, manage_woocommerce=true, aber nicht manage_options, sodass er die verwundbare Prüfung besteht, aber die gepatchte nicht.
Die gepatchte Version tut mehr, als nur die Antwort von 200 auf 403 zu ändern. Sie ändert die Zugriffskontrolllogik, indem sie die Fähigkeitsanforderung von manage_woocommerce auf manage_options verschärft.
Darüber hinaus ist der Speicherpfad im gepatchten Build weiter gehärtet, indem von präfixbasierter Filterung auf explizite Whitelists und stärkere Sanitisierung umgestellt wird.
Der PoC folgt demselben Ablauf wie ein realer Browser-Kontext:
shopmgr anmeldenwpApiSettings.nonce extrahierenPOST /wp-json/wwp/v1/admin/save aufrufenDa der verwundbare Build Benutzern mit manage_woocommerce erlaubt, diese Einstellungs-Schreibaktion aufzurufen, ist die Anfrage erfolgreich und führt zu einer persistenten Optionsänderung.
Ein nonce hilft gegen CSRF, ist aber keine Autorisierungskontrolle.
Eine gültige Sitzung und ein gültiges Nonce zu haben, bedeutet nicht, dass ein Benutzer eine Admin-Aktion ausführen darf. Die Verwendung einer zu weit gefassten Fähigkeit auf einem privilegierten Endpunkt reicht aus, um eine Autorisierungsumgehung mit geringen Rechten zu erzeugen.