Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
givewp-cve-2026-82222-rce-lab — # 認可済みDockerラボと、GiveWP 4.16.5.1におけるCVE-2026-82222 RCEおよび4.16.7.2修正を検証するためのクリーンなPoC | Kitploit
ツール/GitHubGitHub/dinosn/givewp-cve-2026-82222-rce-lab
脆弱性分析エクスプロイトウェブアプリケーション悪用学習と教育ラボと実践
GitHubdinosn/givewp-cve-2026-82222-rce-lab

givewp-cve-2026-82222-rce-lab

# 認可済みDockerラボと、GiveWP 4.16.5.1におけるCVE-2026-82222 RCEおよび4.16.7.2修正を検証するためのクリーンなPoC

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-82222 — GiveWP マーカーのみのRCE検証ラボ

CVE-2026-82222を隔離されたDockerラボで再現・検証するためのセキュリティ研究用マテリアルです。

直接RCE PoCとURLスキャンには CVE-2026-8222-RCE.py を使用してください

判定

ステータス: 提供されたラボで実証済み

GiveWP 4.16.5.1では、初期状態で認証されていない攻撃者がPHPオブジェクトグラフを永続化し、GiveWPのセッション処理を通じてそれを復元し、WordPressのWebサーバーユーザーとして固定マーカーコマンドを実行することが可能です。

陽性結果のテスト:

GiveWP:    4.16.5.1
WordPress: 6.6.2
PHP:       8.1.30
Result:    /tmp/CVE-2026-82222-RCE-GETBAG created by www-data

エンドツーエンドの結果は、改変されていない素のGiveWP 4.16.5.1ソースに対しても再現されました。GiveWP 4.16.7.2は、テスト構成においてHTTPキャリアをブロックし、直接制御中にターミナルガジェットも独立してブロックしました。

これはWordPressコンテナ内でのコマンド実行を実証するものです。ルートアクセス、コンテナエスケープ、横移動、またはホストの侵害を実証するものではありません。

安全上の境界

このリポジトリは、所有しているシステム、または明示的にテストを許可されたシステムでのみ使用してください。

提供されるPoCは意図的に制約されています:

  • touch /tmp/CVE-2026-82222-RCE-GETBAG のみを実行します。
  • 任意コマンドオプションは提供しません。
  • シェル、コールバック、永続化、権限昇格は作成しません。
  • オペレーターが明示的な --allow-authorized-non-loopback フラグを指定しない限り、ループバック以外のターゲットを拒否します。
  • DockerはWordPressを 127.0.0.1 のみに公開します。
  • Composeプロジェクト名はチェックアウトパスから派生するため、あるクローンが別のクローンのコンテナやボリュームを破棄することはできません。
  • ラボは改変されていない公式プラグインソースを使用します。脆弱なターゲットの計測やパッチ適用は行いません。

HTTPテストは、使い捨てのドナー・ユーザー、メタデータ、GiveWPセッション行を作成します。テスト後は付属のリセットコマンドを使用してください。

クイックスタート

要件:

  • Compose v2を備えたDocker
  • Python 3.10以降
  • curl
  • unzip
  • sha256sum または shasum
  • 公式プラグインアーカイブのための downloads.wordpress.org へのネットワークアクセス

完全な脆弱/パッチ済みマトリックスを実行:

./lab verify

このコマンドは:

  1. WordPress.orgからGiveWP 4.16.5.1と4.16.7.2をダウンロードします。
  2. 両方のSHA-256ハッシュを検証します。
  3. 通常のWordPress登録を明示的に無効化した、ループバック専用の新しいWordPress 6.6.2/PHP 8.1ラボを構築します。
  4. 素の4.16.5.1をテストし、Webユーザーによるマーカー作成を要求します。
  5. 素の4.16.7.2を使用して2つ目の新しいラボを構築します。
  6. HTTPマーカーが存在しないことを要求します。
  7. 直接制御でイングレスをバイパスし、パッチ適用済みの ProviderForwarder ターミナルも文字列コーラブルを拒否することを確認します。

パッチ適用済みラボは最後まで実行されたままになります。削除するには:

./lab reset

別のループバックポートを使用するには:

LAB_PORT=8099 ./lab verify

期待される証拠

脆弱なコントロールは、具体的なターミナル証拠で終了する必要があります:

[PASS] E1: 認証されていない登録が認証Cookieを発行
[PASS] E3: シリアル化されたグラフが自身のlast_nameに永続化
[PASS] E4: 寄付フォームのnonceを取得
[PASS] E5: セッション書き込みが期待されるポストシンクHTTPステータス=500に到達
[PASS] E6: セッション読み取り/破棄トリガーが完了
marker present and owned by the WordPress web user
RESULT: VULNERABLE CONTROL CONFIRMED

パッチ適用済みコントロールは次のように表示される必要があります:

[PASS] P1: パッチ適用済み登録ゲートが認証Cookieをブロック
DIRECT_MARKER=absent
HTTP marker absent and direct terminal gadget blocked
RESULT: PATCHED CONTROL CONFIRMED

HTTP 500、保存されたペイロード、例外、またはマーカーなしの検出器ヒットは、RCEの証明として受け入れられません。

手動ラボライフサイクル

脆弱なリリースを起動してテスト:

./lab start vulnerable
./lab test

パッチ適用済みリリースを起動してテスト:

./lab start patched
./lab test

現在の状態を確認:

./lab status

コンテナ、ボリューム、テストユーザー、セッション、マーカー状態を削除:

./lab reset

キャッシュされたプラグインZIPと展開されたアセットは、再実行を高速化するために保持されます。これらの生成されたアセットも削除するには:

./lab reset --purge-assets

影響を受けるバージョンとテスト済みバージョン

バージョン評価
GiveWP 4.16.5.1RCEをエンドツーエンドで再現
GiveWP 4.16.6–4.16.7.1影響ありと報告済み。ここでは個別に再現されていません
GiveWP 4.16.7.2パッチ適用済みネガティブコントロールを再現
それ以降のリリース個別にテストされていません。最新のサポートリリースに更新してください

公開アドバイザリは、4.16.7.1までのリリースを影響ありと特定しています。このリポジトリは、その陽性/陰性テストマトリックス内の2つのバージョンのみを直接証明します。

参考文献:

  • Patchstackアドバイザリ
  • CVE-2026-82222
  • GiveWPハードニングコミット
  • 公式GiveWPプラグインページ

根本原因

このエクスプロイトは複数の動作を組み合わせます:

  1. GiveWP 4.16.5.1は、通常のWordPress登録が無効な場合でも、低権限のドナーを作成して認証する登録アクションを公開します。
  2. そのユーザーは自身の名前メタデータにシリアル化されたデータを永続化できます。
  3. Give\Helpers\Utils::maybeSafeUnserialize() は allowed_classes => false を使用して __PHP_Incomplete_Class を生成しますが、後続のシリアル化は元のクラス名とプロパティを保持します。
  4. グラフはGiveWP購入セッションに保存されます。
  5. 後続の無制限の maybe_unserialize() が同梱クラスを復元します。
  6. 自動破棄が system() への完全なPOPチェーンに入ります。

HTTPキャリアには4つのリテラルな名前空間バックスラッシュが必要です。2つの実効的なストリッピングパスにより、それらは 4 -> 2 -> 1 に削減されます。ペイロードはNULフリーであり、PHP 8.1.30がプライベートな Session::$attributeName プロパティのプレーンなシリアル化名をハイドレートすることが検証されました。

完全なPOPチェーン

TCPDF::__destruct()
  -> TCPDF::_destroy(true)
  -> foreach ($this->imagekeys as $file)
  -> Symfony Session::getIterator()
  -> Session::getAttributeBag()
  -> Session::getBag($this->attributeName)
  -> $this->storage->getBag($attributeName)
  -> DonationFactory->__call('getBag', [$attributeName])
  -> call_user_func_array('system', [$attributeName])
  -> system('touch /tmp/CVE-2026-82222-RCE-GETBAG')

攻撃者制御のグラフ:

TCPDF
├── file_id = 一意のリクエスト識別子
└── imagekeys = Give\Vendors\Symfony\Component\HttpFoundation\Session\Session
    ├── attributeName = 固定マーカーコマンド
    └── storage = Give\TestData\Factories\DonationFactory
        └── loadedProviders["getBag"] = "system"

重要な隠れた遷移は、PHPの暗黙的な IteratorAggregate ディスパッチです。TCPDF::$imagekeys は型指定がないため、Symfony Session を代入すると foreach が Session::getIterator() を呼び出します。

マーカーコマンドは、Symfonyが getAttributeBag(): AttributeBagInterface の戻り値の型を強制する前に実行されます。結果として生じる TypeError とHTTP 500はポストシンク効果です。

以前の試みが見逃したもの

却下された候補グラフは以下を使用していました:

TCPDF::$objcopy
  -> DonationFactory::$loadedProviders['__destruct'] = 'system'

このグラフは機能しません。TCPDF::_destroy() は objcopy のunsetのみを行います。PHPは自動破棄を __call('__destruct', ...) にルーティングしません。

欠落していた操作は次のとおりです:

foreach ($this->imagekeys as $file) {

以前のレビューはデストラクタと明示的なメソッド呼び出しに従いましたが、foreach によってトリガーされる暗黙的なオブジェクトプロトコルを再帰的に検査しませんでした。Symfony Session が欠落したブリッジを提供します:

  • foreach は getIterator() を呼び出します。
  • getIterator() は getBag($attributeName) に到達します。
  • 攻撃者制御の storage は DonationFactory です。
  • 未定義の getBag は ProviderForwarder::__call() を呼び出します。
  • loadedProviders['getBag'] = 'system' がコーラブルを選択します。
  • attributeName がコマンド引数を提供します。

ソース証拠

関連するGiveWP 4.16.5.1の場所:

コンポーネント場所
ガード付き初期アンシリアライズsrc/Helpers/Utils.php:203-217,237-241
寄付キャリアincludes/process-donation.php:157
GiveWPセッション永続化includes/class-give-session.php:364-368,489-508
無制限セッション復元includes/class-give-session.php:347-350
TCPDFデストラクタvendor/tecnickcom/tcpdf/tcpdf.php:2050-2052
攻撃者制御の反復vendor/tecnickcom/tcpdf/tcpdf.php:7885-7907
Symfonyイテレータブリッジvendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:134-136
Symfony getBag ブリッジvendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:259-283
ターミナルコーラブルsrc/TestData/Framework/ProviderForwarder.php:19-23
GiveWP Composerオートローダーgive.php:624-625

公式リリースハッシュ:

give.4.16.5.1.zip
95fc6709b6ed284074bf09be096e28d6299fd4a103848c2b1c3bf8a5772cf98c

give.4.16.7.2.zip
c5bc98da2abb748c64d31a43679ff5f223092dfff6d214132a55dcbc948e91ae

ラボは、毎回の新規起動前に検証済みZIPから各プラグインを再抽出し、変更を加えずにWordPressにコピーし、展開された完全なプラグインファイルツリーを検証済みソースとバイト比較します。3つの公式Dockerベースイメージも、マルチアーキテクチャマニフェストダイジェストに固定されています。

4.16.7.2がチェーンをブロックする理由

GiveWP 4.16.7.2は、登録、シリアル化された入力処理、セッション復元、データ移行、ガジェットハードニングにわたって独立した防御を追加します。

ターミナルハードニングでは、解決されたオブジェクトが期待されるプロバイダーコントラクトを実装することが要求されます:

if ( ! $provider instanceof Contract\Provider ) {
    return null;
}

したがって、攻撃者制御の文字列 system は拒否されます。このリポジトリの直接制御はHTTPキャリアをバイパスし、このターミナル防御だけでもマーカーが存在しないことを検証します。

実際のデプロイメントの確認

PoCの陰性結果だけでは、サイトがパッチ適用済みであることを証明しません。WAF、異なるルーティング、無効化された登録、欠落したレガシーフォーム、セッション構成、または無効化されたPHPコマンド関数はすべて、依然として脆弱なコードベース上でマーカーを防ぐ可能性があります。

推奨される検証手順:

  1. デプロイされたGiveWPバージョンとソースリビジョンを記録します。
  2. WordPressサイトとデータベースをバックアップまたはスナップショットします。
  3. そのスナップショットを隔離されたステージング環境に復元します。
  4. 不要なアウトバウンドネットワークアクセスを無効にします。
  5. クローンに対してこのマーカーのみの検証ツールを実行します。
  6. GiveWPを最新のサポートリリースに更新します。4.16.7.2はテスト済み修正を含む最小リリースです。
  7. 同一のテストを繰り返し、マーカーが存在しないことを要求します。
  8. インストールされたプラグインバージョンとパッチ適用済みソースを独立して検証します。

バージョンチェック:

wp plugin get give --fields=name,status,version

修復とインシデントレビュー

GiveWPを最新のサポートバージョンに更新してください。更新後:

ツールをダウンロード