Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : July 5, 2026

CVE-2026-57652: JS Help Desk – AI-Powered Support & Ticketing System <= 3.1.0 Unauthenticated Insecure Direct Object Reference PoC, Patch Analysis & Rule

Severity Medium (CVSS 5.3)
CWE 639
Vulnerable Version 3.1.0
Patched Version 3.1.1
Disclosed June 25, 2026

Analysis Overview

“`json
{
“analysis”: “Atomic Edge analysis of CVE-2026-57652:nThis vulnerability is an Insecure Direct Object Reference (IDOR) in the JS Help Desk – AI-Powered Support & Ticketing System plugin for WordPress, affecting versions up to and including 3.1.0. The flaw allows unauthenticated attackers to download arbitrary ticket attachments without authorization. The CVSS score is 5.3, indicating moderate severity.nnRoot Cause: The root cause is missing authorization validation in the attachment download handler. The vulnerable code is in `/js-support-ticket/modules/attachment/model.php` within the function that processes file downloads. The original code at line 198 lacked any permission checks before streaming the file to the user. The `jsst_id` parameter, which controls which attachment to download, was directly used without verifying that the requester had rights to that ticket. The patch adds a comprehensive security check that validates user roles (admin, agent, ticket owner) or visitor ticket validation before serving the file.nnExploitation: An attacker can exploit this by crafting a direct HTTP request to the plugin’s attachment download endpoint. The vulnerable endpoint typically accepts `?jsst_id=` or similar parameter through either GET or POST requests. By enumerating attachment IDs or using known ticket IDs, an attacker can download any file attached to any ticket without authentication. The attack vector is simple: send a GET request to `/?jssupportticket=attachment&task=download&jsst_id=` or through the AJAX handler. No session, nonce, or capability check is performed.nnPatch Analysis: The patch adds a permission validation block before the file download logic. It first casts `jsst_id` to an integer. It then checks if the user is a guest, an admin with `manage_options`, a user with `jsst_support_ticket_tickets`, an agent from an active addon, a ticket owner via `validateTicketDetailForUser`, or a visitor with a valid ticket via `validateTicketDetailForVisitor`. If none of these checks pass, the script includes a 404 template and exits, preventing unauthorized file access. The patch also fixes a variable typo from `$wp_filesystem` to `$jsst_wp_filesystem` on line 283.nnImpact: An attacker can read any file uploaded as a ticket attachment without authentication. This exposes sensitive data such as customer personal information, internal communications, screenshots, documents, and any other files users submit through the support ticket system. This compromises the confidentiality of the entire helpdesk data, affecting all tickets and their attachments.”,
“poc_php”: “n”,
modsecurity_rule”: “# Atomic Edge WAF Rule – CVE-2026-57652n# Blocks unauthenticated attachment download attempts in JS Help Deskn# Matches the direct request to attachment download with numeric IDnSecRule REQUEST_URI “@rx /index.php” \n “id:20261994,phase:2,deny,status:403,chain,msg:’CVE-2026-57652 – Unauthenticated IDOR in JS Help Desk’,severity:’CRITICAL’,tag:’CVE-2026-57652′,tag:’wordpress’,tag:’js-help-desk'”n SecRule ARGS_GET:jssupportticket “@streq attachment” “chain”n SecRule ARGS_GET:task “@streq download” “chain”n SecRule ARGS_GET:jsst_id “@rx ^[0-9]+$” “t:none”n”
}
“`

Differential between vulnerable and patched code

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

Code Diff
--- a/js-support-ticket/includes/activation.php
+++ b/js-support-ticket/includes/activation.php
@@ -201,8 +201,8 @@
                     ('tplink_faqs_user', '0', 'tplink', 'faq'),
                     ('show_breadcrumbs', '1', 'default', NULL),
                     ('productcode', 'jsticket', 'default', NULL),
-                    ('versioncode', '3.1.0', 'default', NULL),
-                    ('productversion', '310', 'default', NULL),
+                    ('versioncode', '3.1.1', 'default', NULL),
+                    ('productversion', '311', 'default', NULL),
                     ('producttype', 'free', 'default', NULL),
                     ('tve_enabled', '2', 'default', NULL),
                     ('tve_mailreadtype', '3', 'default', NULL),
--- a/js-support-ticket/includes/classes/uploads.php
+++ b/js-support-ticket/includes/classes/uploads.php
@@ -406,6 +406,7 @@
         if(!isset($_FILES[$jsst_field])){
             return;
         }
+        $jsst_filename = '';
         if (!function_exists('wp_handle_upload')) {
             do_action('jssupportticket_load_wp_file');
         }
--- a/js-support-ticket/js-support-ticket.php
+++ b/js-support-ticket/js-support-ticket.php
@@ -5,7 +5,7 @@
   Plugin URI: https://www.jshelpdesk.com
   Description: JS Help Desk is a trusted open source ticket system. JS Help Desk is a simple, easy to use, web-based customer support system. User can create ticket from front-end. JS Help Desk comes packed with lot features than most of the expensive(and complex) support ticket system on market. JS Help Desk provide you best industry help desk system.
   Author: JS Help Desk
-  Version: 3.1.0
+  Version: 3.1.1
   Text Domain: js-support-ticket
   Domain Path: /languages
   License: GPLv3
@@ -63,7 +63,7 @@
         self::$jsst_data = array();
         self::$_search = array();
         self::$_captcha = array();
-        self::$_currentversion = '310';
+        self::$_currentversion = '311';
         self::$_addon_query = array('select'=>'','join'=>'','where'=>'');
         self::$_jshdsession = JSSTincluder::getObjectClass('wphdsession');
         global $wpdb;
@@ -143,7 +143,7 @@
                     // restore colors data end
                     update_option('jsst_currentversion', self::$_currentversion);
                     include_once JSST_PLUGIN_PATH . 'includes/updates/updates.php';
-                    JSSTupdates::checkUpdates('310');
+                    JSSTupdates::checkUpdates('311');
                     JSSTincluder::getJSModel('jssupportticket')->updateColorFile();
                     JSSTincluder::getJSModel('jssupportticket')->jsst_check_license_status();
                     JSSTincluder::getJSModel('jssupportticket')->JSSTAddonsAutoUpdate();
--- a/js-support-ticket/modules/attachment/model.php
+++ b/js-support-ticket/modules/attachment/model.php
@@ -198,6 +198,33 @@
             return false;
         }

+        // --- ADDED SECURITY CHECK: Copied from getDownloadAttachmentById ---
+        $jsst_ticketid = intval($jsst_id);
+        $jsst_download = false;
+
+        if(!JSSTincluder::getObjectClass('user')->isguest()){
+            if(current_user_can('manage_options') || current_user_can('jsst_support_ticket_tickets') ){
+                $jsst_download = true;
+            }else{
+                if( in_array('agent',jssupportticket::$_active_addons) && JSSTincluder::getJSModel('agent')->isUserStaff()){
+                    $jsst_download = true;
+                }else{
+                    if(JSSTincluder::getJSModel('ticket')->validateTicketDetailForUser($jsst_ticketid)){
+                        $jsst_download = true;
+                    }
+                }
+            }
+        }else{ // user is visitor
+            $jsst_download = JSSTincluder::getJSModel('ticket')->validateTicketDetailForVisitor($jsst_ticketid);
+        }
+
+        // If the user fails all checks, block the download and show a 404 page
+        if ($jsst_download != true) {
+            include( get_query_template( '404' ) );
+            exit;
+        }
+        // -------------------------------------------------------------------
+
         $jsst_filename = jssupportticketphplib::JSST_str_replace(' ', '_', $jsst_file_name);
         $jsst_filename = jssupportticketphplib::JSST_clean_file_path($jsst_filename);

@@ -253,7 +280,7 @@
         flush();

         // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
-        echo $wp_filesystem->get_contents($jsst_file);
+        echo $jsst_wp_filesystem->get_contents($jsst_file);
         exit;
     }

--- a/js-support-ticket/modules/jssupportticket/controller.php
+++ b/js-support-ticket/modules/jssupportticket/controller.php
@@ -22,7 +22,7 @@
                 case 'controlpanel':
                     JSSTincluder::getJSModel('jssupportticket')->getControlPanelData();
                     include_once JSST_PLUGIN_PATH . 'includes/updates/updates.php';
-                    JSSTupdates::checkUpdates('310');
+                    JSSTupdates::checkUpdates('311');
                     JSSTincluder::getJSModel('jssupportticket')->updateColorFile();
                     //JSSTincluder::getJSModel('jssupportticket')->getStaffControlPanelData();
                     break;
--- a/js-support-ticket/modules/zywrap/controller.php
+++ b/js-support-ticket/modules/zywrap/controller.php
@@ -16,7 +16,7 @@
             switch ($jsst_layout) {
                 case 'admin_zywrap':
                     include_once JSST_PLUGIN_PATH . 'includes/updates/updates.php';
-                    JSSTupdates::checkUpdates('310');
+                    JSSTupdates::checkUpdates('311');
                     JSSTincluder::getJSModel('zywrap')->getDashboardStats();
                     break;

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.