CVE-2026-54768

CVE-2026-54768 is a medium-severity security vulnerability in wp-graphql/wp-graphql (composer), affecting versions <= 2.6.0. No fixed version is listed yet.

Does this CVE actually affect you?

Kodem shows which CVEs are reachable and running in your applications, so you fix what's exploitable, not just what's listed.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Runtime intelligence, not another scanner.

Summary

WPGraphQL has deprecated user field on SendPasswordResetEmailPayload that leaks user existence + profile (defeats explicit anti-enumeration design)

The sendPasswordResetEmail mutation in WPGraphQL is explicitly designed to prevent user enumeration. The resolver in src/Mutation/SendPasswordResetEmail.php states in a code comment:

// We obsfucate the actual success of this mutation to prevent user enumeration.

The mutation always returns success: true regardless of whether the supplied username/email belongs to an existing user. The intended public output field is only success: Boolean.

However, a deprecated user field is still registered on the SendPasswordResetEmailPayload output type in src/Deprecated.php (lines 433-450). This deprecated field resolves to a full User object when the supplied username/email corresponds to an existing author-class user, and null otherwise, completely undermining the anti-enumeration design.

The @todo remove in 3.0.0 comment acknowledges the field is scheduled for removal, but it remains active in all 2.x releases, including current 2.14.1.

Discovered via source code review on May 29, 2026.

Details

The mutation resolver in src/Mutation/SendPasswordResetEmail.php:

$payload = ['success' => true, 'id' => null];
$user_data = self::get_user_data($input['username']);
if (!$user_data) {
    graphql_debug(...);
    return $payload;  // id stays null
}
// ...send email, then...
return ['id' => $user_data->ID, 'success' => true];

The intended public output field is only success. The id is internal-only state for downstream resolvers.

src/Deprecated.php registers an additional user field on the same payload type:

register_graphql_field(
    'SendPasswordResetEmailPayload',
    'user',
    [
        'type' => 'User',
        'deprecationReason' => static function () { return __('This field will be removed...'); },
        'resolve' => static function ($payload, $args, AppContext $context) {
            return !empty($payload['id'])
                ? $context->get_loader('user')->load_deferred($payload['id'])
                : null;
        },
    ],
);

This field reads the internal $payload['id'] and resolves it through the standard user loader. The User Model's allowed_restricted_fields policy permits unauthenticated reads of public author fields (databaseId, name, firstName, lastName, slug, description, uri, url).

PoC

mutation EnumerateUser {
  sendPasswordResetEmail(input: { username: "[email protected]" }) {
    success
    user {
      databaseId
      name
      firstName
      lastName
      slug
      description
      uri
    }
  }
}

Behavior:

  • Non-existing user/email → data.sendPasswordResetEmail.user is null
    • Existing author-class user → data.sendPasswordResetEmail.user is a full User object with the listed fields populated
    • success always returns true, preserving the appearance of obfuscation, the deprecated user field is the leak

Impact

Affected versions

wp-graphql/wp-graphql (<= 2.6.0)

Security releases

Not available

Kodem intelligence

Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.

Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.

Already deployed Kodem?

See it in your environmentNew to Kodem? Get a demo →

Remediation advice

Either remove the deprecated user field entirely (advance the existing @todo remove in 3.0.0) or change the resolver to always return null:

'resolve' => static function ($payload, $args, AppContext $context) {
-    return !empty($payload['id']) ? $context->get_loader('user')->load_deferred($payload['id']) : null;
- +    // Always null, this deprecated field previously leaked user existence,
- +    // undermining the anti-enumeration design of the sendPasswordResetEmail mutation.
- +    return null;
- },
- ```
Defense in depth, change the mutation resolver itself to not populate `$payload['id']` on real success:

```diff
return [
-    'id'      => $user_data->ID,
- +    'id'      => null,
-      'success' => true,
- ];
- ```

Luke Granto, independent security researcher operating in good faith. Discovery via source code review of wp-graphql/wp-graphql v2.14.1, approximately 15 minutes from `git clone` to confirmed bug. No live exploitation against any third-party deployment.

Frequently Asked Questions

  1. What is CVE-2026-54768? CVE-2026-54768 is a medium-severity security vulnerability in wp-graphql/wp-graphql (composer), affecting versions <= 2.6.0. No fixed version is listed yet.
  2. Which versions of wp-graphql/wp-graphql are affected by CVE-2026-54768? wp-graphql/wp-graphql (composer) versions <= 2.6.0 is affected.
  3. Is there a fix for CVE-2026-54768? No fixed version is listed for CVE-2026-54768 yet. Monitor the advisory for updates and apply mitigations in the interim.
  4. Is CVE-2026-54768 exploitable, and should I be worried? Whether CVE-2026-54768 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
  5. What actually determines whether CVE-2026-54768 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.

Other vulnerabilities in wp-graphql/wp-graphql

Stop the waste.
Protect your environment with Kodem.