
Docker-basiertes Labor zur Reproduktion von CVE-2026-49060, einer nicht authentifizierten Privilegienausweitung im Hippoo Mobile App für WooCommerce WordPress Plugin. Vergleicht anfällige 1.9.4 und gepatchte 1.9.5 Versionen mithilfe eines Python PoC.
Dieses Repository enthält ein lokales Docker-Lab zur Reproduktion und Validierung von CVE-2026-49060, einer Schwachstelle durch falsche Berechtigungszuweisung, die das WordPress-Plugin Hippoo Mobile App for WooCommerce betrifft.
Das anfällige Verhalten wird über Hippoos geklonten REST-API-Namensraum offengelegt:```text /wc-hippoo/v1/ext/
Im verwundbaren Ziel kann ein nicht authentifizierter Besucher auf eine geklonte WordPress-REST-Benutzerroute zugreifen und das Passwort des Administrator-Benutzers durch eine nicht authentifizierte HTTP-Anfrage aktualisieren. Im gepatchten Ziel wird dieselbe Anfrage mit `403 Forbidden` blockiert.
This lab compares two Hippoo versions:
| Dienst | Hippoo-Version | Zweck | URL |
| --------- | -------------: | ---------------------------- | ----------------------- |
| `vuln` | 1.9.4 | Verwundbares Vergleichsziel | `http://localhost:8081` |
| `patched` | 1.9.5 | Gepatchtes Vergleichsziel | `http://localhost:8082` |
Die demonstrierte Schwachstellenkette ist:```text
Unauthenticated visitor
→ Hippoo cloned REST namespace
→ /wc-hippoo/v1/ext/wp/v2/users/<id>
→ vulnerable permission handling allows access
→ unauthenticated GET exposes user data
→ unauthenticated POST can update the selected user's password
→ patched version blocks the same request with 403 Forbidden
Dieses Labor validiert das Authorisierungsverhalten der verwundbaren im Vergleich zur gepatchten Version unter Verwendung von Hippoo 1.9.4 und Hippoo 1.9.5.
Das Labor ist absichtlich auf lokale Docker-Dienste beschränkt. Es zielt nicht auf externe Systeme ab und enthält keine Persistenz, Web-Shells, Malware oder externe Rückrufe.
| Behauptung | Nachweis | Wie in diesem Labor zu überprüfen |
|---|---|---|
CVE-2026-49060 betrifft die Hippoo Mobile App für WooCommerce bis Version 1.9.4. | Öffentliche Sicherheitshinweise identifizieren Hippoo <= 1.9.4 / bis 1.9.4 als betroffen. | Überprüfen Sie den Abschnitt 'References' und vergleichen Sie die vuln-Dienstversion. |
Hippoo 1.9.5 wird als gepatchtes Vergleichsziel verwendet. | Die Metadaten der öffentlichen Sicherheitshinweise identifizieren 1.9.5 als gepatchte Version für den betroffenen Bereich. | Führen Sie docker compose logs init-vuln init-patched aus und bestätigen Sie die initialisierten Plugin-Versionen. |
| Das verwundbare Verhalten wird über Hippoo's geklonten REST-Namespace bereitgestellt. | Hippoo registriert externe REST-Routen unter /wc-hippoo/v1/ext/ erneut. | Führen Sie python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082 aus. |
Hippoo 1.9.4 erlaubt in diesem Labor unauthentifizierten Zugriff auf die geklonte Benutzerroute. | Der PoC des Labors erhält 200 OK von http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1. | Führen Sie den schreibgeschützten Validierungsbefehl gegen 8081 aus. |
Hippoo 1.9.5 blockiert die gleiche unauthentifizierte Anfrage in diesem Labor. | Der PoC des Labors erhält 403 Forbidden von http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1. | Führen Sie den schreibgeschützten Validierungsbefehl gegen 8082 aus. |
| Das verwundbare Ziel kann in diesem lokalen Labor das Administratorkennwort durch eine unauthentifizierte POST-Anfrage aktualisieren. | Der aktive PoC erhält 200 OK vom verwundbaren Ziel, wenn --update-password verwendet wird. | Führen Sie python3 poc/poc.py --update-password http://127.0.0.1:8081 aus. |
| Das gepatchte Ziel blockiert die unauthentifizierte Kennwortaktualisierungsanfrage. | Hippoo 1.9.5 gibt eine 'Forbidden'-Antwort für die gleiche geklonte Benutzerroute zurück. | Führen Sie eine aktive Validierung gegen beide Ziele durch. |
| Der PoC ist HTTP-only. | poc/poc.py sendet nur HTTP-Anfragen und ruft keine Docker-, WP-CLI- oder Container-APIs auf. | Überprüfen Sie poc/poc.py. |
Dieses Labor verwendet Hippoo 1.9.4 als verwundbares Vergleichsziel, da öffentliche Sicherheitshinweise Versionen bis einschließlich 1.9.4 als betroffen identifizieren.
Dieses Labor verwendet Hippoo 1.9.5 als gepatchtes Vergleichsziel, da die Metadaten der öffentlichen Sicherheitshinweise 1.9.5 als die korrigierte Version für den demonstrierten betroffenen Bereich identifizieren.
Der öffentliche CVE-2026-49060-Eintrag beschreibt das Problem auf hoher Ebene als 'Incorrect Privilege Assignment / Privilege Escalation'. Dieses Labor konzentriert sich auf das beobachtbare Authorisierungsverhalten in Hippoo 1.9.4 und vergleicht es mit Hippoo 1.9.5.
Die Zusammenfassung der Ursachen in dieser README basiert auf einem Quellvergleich zwischen den im Labor verwendeten verwundbaren und gepatchten Hippoo-Versionen.
Dieses Labor beansprucht nicht, jede Hippoo-Route zu testen. Es konzentriert sich auf die geklonte WordPress-Benutzer-REST-Route:```text /wc-hippoo/v1/ext/wp/v2/users/
Das Labor demonstriert nicht:
* Persistenz,
* Web-Shell-Upload,
* willkürliche Befehlsausführung,
* externe Rückrufe,
* Schadsoftware-Verhalten,
* Angriffe gegen Nicht-Lab-Systeme,
* oder Aktivitäten nach der Kompromittierung, die über die lokale Passwortaktualisierungsvalidierung hinausgehen.
## Zusammenfassung der Grundursache
Die Grundursache ist ein Berechtigungslogikfehler in Hippoos Rollen- und Berechtigungsverwaltung.
Hippoo stellt geklonte WordPress- und WooCommerce-REST-Routen unter seinem eigenen Namensraum bereit:```text
/wc-hippoo/v1/ext/
Das Route-Cloning-Verhalten ist sicherheitsrelevant, da die geklonte Route die Autorisierungsanforderungen der ursprünglichen Route bewahren oder verstärken muss. Wenn die geklonte Route einen permissiven Berechtigungs-Callback erhält, könnten nicht authentifizierte Benutzer möglicherweise auf REST-Endpunkte zugreifen, die Authentifizierung und Autorisierung erfordern sollten.
Das relevante Route-Cloning-Verhalten folgt diesem Muster:```php function re_register_external_routes() { $server = rest_get_server(); $endpoints = $server->get_routes();
$new_namespace = $this->hippoo_namespace . '/ext';
foreach ($endpoints as $route => $handlers) {
if (strpos($route, $this->hippoo_namespace) === 0) {
continue;
}
foreach ($handlers as $handler) {
$default_permission_callback = array($this, 'is_user_wordpress_admin');
$permission_callback = apply_filters(
'hippoo_extension_permission_check',
$default_permission_callback,
$route,
$handler
);