Published : July 4, 2026

CVE-2026-57646: Majestic Support – The Leading-Edge Help Desk & Customer Support Plugin <= 1.1.7 Authenticated (Subscriber+) Insecure Direct Object Reference PoC, Patch Analysis & Rule

Severity Medium (CVSS 4.3)
CWE 639
Vulnerable Version 1.1.7
Patched Version 1.1.8
Disclosed June 25, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-57646:

This vulnerability is an Insecure Direct Object Reference (IDOR) in the Majestic Support plugin for WordPress, affecting versions up to and including 1.1.7. The flaw allows authenticated attackers with Subscriber-level access to perform unauthorized actions by exploiting a missing access control check in the AI-powered reply feature. The CVSS score is 4.3.

Root Cause: The vulnerability resides in the file /modules/ticket/model.php, specifically in the function handling the AI-powered reply feature. In the vulnerable version, the code at line 3209 lacked any permission verification before processing requests. The patch introduces a strict access control block that checks if the user is an admin, an agent with the required AI permission, or denies access otherwise. The diff shows the insertion of a new security check at lines 3212-3236 that explicitly blocks standard users (including Subscribers) from accessing the AI reply functionality.

Exploitation: An authenticated attacker with Subscriber-level privileges can send a crafted AJAX request to the WordPress admin-ajax.php endpoint with the action parameter set to the vulnerable handler (likely ‘majestic_support_ai_reply’ or similar) and a ticketId parameter. The server processes the request without verifying that the user has the necessary permissions, allowing the attacker to invoke the AI reply feature on any ticket. The precise AJAX action name was not provided in the diff, but it is triggered by the code path that calls the vulnerable model method.

Patch Analysis: The patch adds a three-tier access control check before the AI reply logic executes. Admin users retain full access. Agents must have the ‘Use AI Powered Reply Feature’ permission granted via the plugin’s user permissions system. All other users, including Subscribers, are blocked with an error message. This directly addresses the missing authorization by verifying the user’s role and permissions before processing the request.

Impact: Successful exploitation allows an authenticated Subscriber to use the AI-powered reply feature on tickets, potentially viewing and generating replies for tickets they should not have access to. This leads to unauthorized data exposure and could facilitate further social engineering or privilege escalation within the support system.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/majestic-support/includes/activation.php
+++ b/majestic-support/includes/activation.php
@@ -183,8 +183,8 @@
                     ('tplink_tickets_user', '1', 'tplink', NULL),
                     ('show_breadcrumbs', '1', 'default', NULL),
                     ('productcode', 'mjsupport', 'default', NULL),
-                    ('versioncode', '1.1.7', 'default', NULL),
-                    ('productversion', '117', 'default', NULL),
+                    ('versioncode', '1.1.8', 'default', NULL),
+                    ('productversion', '118', 'default', NULL),
                     ('producttype', 'free', 'default', NULL),
                     ('tve_enabled', '2', 'default', NULL),
                     ('tve_mailreadtype', '3', 'default', NULL),
--- a/majestic-support/majestic-support.php
+++ b/majestic-support/majestic-support.php
@@ -5,7 +5,7 @@
   Plugin URI: https://www.majesticsupport.com
   Description: Majestic Support is a trusted open source ticket system. Majestic Support is a simple, easy to use, web-based customer support system. User can create ticket from front-end. Majestic Support comes packed with lot features than most of the expensive(and complex) support ticket system on market. Majestic Support provide you best industry Majestic Support system.
   Author: Majestic Support
-  Version: 1.1.7
+  Version: 1.1.8
   License: GPLv3
   Text Domain: majestic-support
   Domain Path: /languages
@@ -62,7 +62,7 @@
         self::$_data = array();
         self::$_search = array();
         self::$_captcha = array();
-        self::$_currentversion = '117';
+        self::$_currentversion = '118';
         self::$_addon_query = array('select'=>'','join'=>'','where'=>'');
         self::$_mjtcsession = MJTC_includer::MJTC_getObjectClass('wphdsession');
         global $wpdb;
@@ -1435,7 +1435,7 @@
             if( $MJTC_plugin == $MJTC_our_plugin ) {
                 update_option('ms_currentversion', majesticsupport::$_currentversion);
                 include_once MJTC_PLUGIN_PATH . 'includes/updates/updates.php';
-                MJTC_updates::MJTC_checkUpdates('117');
+                MJTC_updates::MJTC_checkUpdates('118');
                 MJTC_includer::MJTC_getModel('majesticsupport')->updateColorFile();
                 MJTC_includer::MJTC_getModel('majesticsupport')->mjtc_check_license_status();
                 MJTC_includer::MJTC_getModel('premiumplugin')->MSAddonsAutoUpdate();
--- a/majestic-support/modules/majesticsupport/controller.php
+++ b/majestic-support/modules/majesticsupport/controller.php
@@ -22,7 +22,7 @@
                 case 'controlpanel':
                     MJTC_includer::MJTC_getModel('majesticsupport')->getControlPanelData();
                     include_once MJTC_PLUGIN_PATH . 'includes/updates/updates.php';
-                    MJTC_updates::MJTC_checkUpdates('117');
+                    MJTC_updates::MJTC_checkUpdates('118');
                     MJTC_includer::MJTC_getModel('majesticsupport')->updateColorFile();
                     break;
                 case 'admin_shortcodes':
--- a/majestic-support/modules/ticket/model.php
+++ b/majestic-support/modules/ticket/model.php
@@ -3209,13 +3209,36 @@
             die('Security check Failed');
         }

+        // --- SECURITY CHECK: STRICT ACCESS CONTROL ---
+        // 1. Check if user is Admin
+        $is_admin = current_user_can('manage_options');
+
+        // 2. Check if user is an Agent
+        $is_agent = (in_array('agent', majesticsupport::$_active_addons) && MJTC_includer::MJTC_getModel('agent')->isUserStaff());
+
+        if ($is_admin) {
+            // Admins pass automatically (No permission check needed)
+        } elseif ($is_agent) {
+            // Agents must have the specific AI permission granted
+            if (!MJTC_includer::MJTC_getModel('userpermissions')->MJTC_checkPermissionGrantedForTask('Use AI Powered Reply Feature')) {
+                die(json_encode(['error' => 'Permission denied. Agent lacks AI Reply privilege.']));
+            }
+        } else {
+            // Standard users/Subscribers (like the attacker in the WP report) are blocked completely
+            die(json_encode(['error' => 'Permission denied. Only staff can access this feature.']));
+        }
+        // -------------------------------------------------
+
         $MJTC_id = absint(MJTC_request::MJTC_getVar('ticketId'));
         $MJTC_subject = sanitize_text_field(MJTC_request::MJTC_getVar('ticketSubject'));
         // Set a limit for smart replies, similar to how you had it in your separate query
         $MJTC_limit = 5; // You can adjust this limit as needed

         $MJTC_agentquery = "";
-        if (in_array('agent', majesticsupport::$_active_addons) && MJTC_includer::MJTC_getModel('agent')->isUserStaff()) {
+
+        // We already know the user is either Admin or Agent if they reached here.
+        // If they are an Agent, apply the assignment limitations if configured.
+        if ($is_agent && !$is_admin) {
             $MJTC_allowed = MJTC_includer::MJTC_getModel('userpermissions')->MJTC_checkPermissionGrantedForTask('Limit AI Replies to Agent-Assigned Tickets');
             if ($MJTC_allowed) {
                 $MJTC_staffid = absint(MJTC_includer::MJTC_getModel('agent')->getStaffId(MJTC_includer::MJTC_getObjectClass('user')->MJTC_uid()));

Frequently Asked Questions

Atomic Edge WAF security layer inspecting website traffic.

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Black & McDonald logo representing Enterprise tier security and support for Atomic Edge WAF.Covenant House Toronto logo featuring a dove and text for Atomic Edge Enterprise planAlzheimer Society Canada logo representing trusted organizations and security partners.University of Toronto logo representing trusted organizations using Atomic Edge WAFSpecsavvers logo, trusted developers and organizations using Atomic Edge securityHarvard Medical School logo representing trusted organizations using Atomic Edge WAF.