CVE-2026-89274 の Docker 検証ラボおよび Python PoC。WP Recipe Maker <= 10.8.1 において、rating-comment の reviewBody を介した任意のショートコード実行を実証する。
CVE-2026-89274 を再現・検証するためのセキュリティリサーチ資料: WP Recipe Maker <= 10.8.1 は、承認された評価コメント経由で仕込まれた レシピの JSON-LD メタデータ内で、登録済みの任意の WordPress ショートコードを実行する。
do_shortcode_safe に置き換え)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94自身が所有するシステム、または明示的にテストを許可されたシステムでのみ使用すること。 この PoC は、ラボで登録されたマーカーショートコードを含む評価コメントを 1 件投稿する。 破壊的なショートコードは使用せず、ディスクへの書き込みも行わない。
ステータス: 提供されたラボで実証済み。
WP Recipe Maker 10.8.1 (WordPress 7.1.2、デフォルトのレシピカードモデル):
comment posted : "[cve89274]" + wprm-comment-rating=5 on the recipe's parent post
result : JSON-LD on the rendered page contains
"reviewBody":"CVE89274-SHORTCODE-FIRED"
(marker shortcode executed server-side at render time)
10.8.2 : shortcode stripped, marker absent (patched negative control)
これは、出力がページメタデータに埋め込まれ、すべての訪問者に開示される、 登録済みの任意のショートコードのサーバーサイド実行を実証する。RCE を 実証するものではなく、影響はターゲットに登録されているショートコード (投稿/メタ情報の露出、副作用を持つプラグイン提供のショートコード) に依存する。
WPRM_Metadata::sanitize_metadata() は、レシピの構造化メタデータ配列の
すべてのスカラーフィールドを再帰的にサニタイズする:
// includes/public/class-wprm-metadata.php:553, WP Recipe Maker 10.8.1
$sanitized = strip_shortcodes( wp_strip_all_tags( do_shortcode( $metadata ) ) );
// 10.8.2
$sanitized = strip_shortcodes( wp_strip_all_tags( WPRM_Instacart::do_shortcode_safe( $metadata ) ) );
do_shortcode() は最初にショートコードを実行し、strip_shortcodes()
ラッパーは既に実行された出力からタグを削除するだけである。フィールドの
1 つである reviewBody は、wprm-comment-rating メタ値を持つ承認済み
コメントの comment_content からそのまま設定され
(class-wprm-metadata.php:1016)、レシピの 親投稿
(post_id => $recipe->parent_post_id()、973 行目) — レシピカードが
埋め込まれている投稿またはページ — に対してクエリされる。
10.8.2 の置き換えである WPRM_Instacart::do_shortcode_safe()
(class-wprm-instacart.php:501) は、内部コンテンツのみを保持し、
何も実行しない。
[wprm-recipe] を埋め込んでいる投稿/ページ) を対象とする。wprm-comment-rating=5 を付けて
/wp-comments-post.php にコメントを POST する。review 配列に含め、
sanitize_metadata() がショートコードを実行する。その出力が
reviewBody 内のコメントテキストを置き換え、すべての訪問者に
表示される。要件: Docker (Compose v2 付き)、ホスト上の Python 3.10+。
./lab verify
10.8.1 ラボをビルドし、マーカーの発火を要求した後、10.8.2 ラボを
ビルドし、その不在を要求する。すべてを削除するには ./lab reset を
実行する。
脆弱性コントロール:
[!!!] SHORTCODE EXECUTION CONFIRMED
evidence: 'CVE89274-SHORTCODE-FIRED' present in the rendered recipe page
context : ..."reviewBody":"CVE89274-SHORTCODE-FIRED","author":...
RESULT: VULNERABLE CONTROL CONFIRMED
修正済みコントロール:
[=] shortcode text present but NOT executed: output was stripped
RESULT: PATCHED CONTROL CONFIRMED
ページ内で表示されたコメント (生テキスト) の中にのみマーカーが存在する 場合は証明として認められない。マーカーはメタデータ内で実行済み出力と して現れなければならない。
./lab start vulnerable # 10.8.1 lab on http://127.0.0.1:9482
./lab test # assert marker fires
./lab start patched # 10.8.2 lab
./lab test # assert absence
./lab status
./lab reset
PoC を手動で実行する (デフォルトはループバック。許可された外部 ターゲットには明示的なオーバーライドが必要):
python3 poc/poc_cve_2026_89274.py --url http://127.0.0.1:9482 --post-id 5
python3 poc/poc_cve_2026_89274.py --url https://target.example \
--allow-authorized-non-loopback [--insecure]
nuclei テンプレート (nuclei/cve-2026-89274.yaml) はバージョンスクリーン
のみである (readme.txt の stable タグ <= 10.8.1)。動作チェーンには
コメント送信と承認遷移が必要であり、nuclei で表現するのは現実的では
ない。Python PoC がフロー全体を実行する。
| バージョン | 評価 |
|---|---|
| WP Recipe Maker 10.8.1 | ショートコード実行をエンドツーエンドで再現 |
| WP Recipe Maker 10.8.2 | 修正済みネガティブコントロールを再現 |
| WP Recipe Maker <= 10.8.0 | アドバイザリにより影響を受ける。個別には未テスト |
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│ └── cve-2026-89274.yaml
└── poc/
└── poc_cve_2026_89274.py
コミット対象外: assets/ (プラグインの zip)、.lab-state、__pycache__/。
| 主張 | ステータス |
|---|---|
| 評価コメントの reviewBody 経由のショートコード実行 | 実証済み (10.8.1) |
| 実行出力がレンダリングされた JSON-LD 内で開示される | 実証済み |
| 修正済みネガティブコントロール (10.8.2) | 実証済み |
| デフォルト設定 (非公開レシピ CPT + 親投稿) | 実証済み (これがラボのトポロジー) |
| 公開レシピ投稿タイプ設定 | 未テスト |
| 代替エントリとしての WPRM 自身の評価 REST エンドポイント | 未テスト |
| 登録済みショートコード出力を超える影響 (RCE) | 主張せず |
このリポジトリは、自身が所有するシステム、または明示的にテストを許可
されたシステムでのみ実行すること。ラボドライバーは vulnerable/
patched 以外のバリアントを拒否し、PoC は
--allow-authorized-non-loopback が指定されない限り非ループバック
ターゲットを拒否し、Compose ポートは 127.0.0.1 にバインドされる。
開示の取り扱いについては SECURITY.md を参照。この リポジトリには、本番ターゲット、顧客データ、アクセストークン、実際の システムからのエビデンスは含まれない。
MIT - LICENSE を参照。