CVE-2025-59562
Executive Summary
CVE-2025-59562 is an Authorization Bypass Through User-Controlled Key vulnerability (CWE-639) in the Academy LMS plugin by Kodezen LLC for WordPress. This flaw allows an authenticated attacker with low privileges (e.g., a student or instructor) to manipulate a user-controlled key (likely a numeric ID or UUID) to access or modify resources belonging to other users, such as course content, grades, or user profiles. The vulnerability exists in all versions of Academy LMS up to and including 3.3.4. As of this report, no official patch has been released, and no public proof-of-concept (PoC) or exploit code is available. The CVSS score of 5.5 (Medium) reflects the need for authentication but the potential for significant data exposure.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects a WordPress plugin distributed through the official WordPress plugin repository and third-party marketplaces. Organizations using Academy LMS should treat this as a supply chain risk, as the plugin is a third-party component integrated into the WordPress ecosystem. The lack of a patch means that all deployments are currently vulnerable, and the only mitigation is to disable the plugin or implement strict access controls at the web application firewall (WAF) level.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
- Base Score: 5.5 (Medium)
- Attack Vector (AV): Network – The attack can be launched remotely.
- Attack Complexity (AC): Low – No special conditions are required.
- Privileges Required (PR): Low – The attacker must have a valid account (e.g., student or instructor).
- User Interaction (UI): None – No victim interaction is needed.
- Scope (S): Unchanged – The vulnerable component and the impacted component are the same.
- Confidentiality (C): Low – Limited data exposure (e.g., other users’ course progress or personal details).
- Integrity (I): Low – Limited ability to modify data (e.g., changing grades or course enrollment).
- Availability (A): None – No impact on system availability.
Threat Level: Medium. The requirement for authentication reduces the attack surface, but the ease of exploitation and potential for lateral movement within the LMS make this a significant risk for educational institutions and enterprises using Academy LMS.
Deep Dive & Mechanics
The vulnerability stems from the plugin’s failure to validate that the user-controlled key (e.g., user_id, course_id, lesson_id) belongs to the authenticated user. In typical WordPress REST API endpoints or AJAX handlers, the plugin likely uses a parameter like user_id to fetch or modify data without verifying that the current user has permission to access that specific resource.
Example vulnerable endpoint (hypothetical):
add_action('wp_ajax_academy_get_user_progress', 'academy_get_user_progress');
function academy_get_user_progress() {
$user_id = $_POST['user_id'];
// No check: if (get_current_user_id() != $user_id) { wp_die('Unauthorized'); }
$progress = get_user_meta($user_id, 'academy_course_progress', true);
wp_send_json_success($progress);
}
An attacker can simply change the user_id parameter to enumerate other users’ progress, grades, or personal information. The same pattern could apply to course management, lesson access, or quiz results.
Vulnerable vs. Patched Code
Vulnerable Code (Academy LMS <= 3.3.4):
// No authorization check on user-controlled key
$target_user_id = $_GET['user_id'];
$data = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}academy_quiz_attempts WHERE user_id = %d", $target_user_id));
Patched Code (Hypothetical fix):
$target_user_id = intval($_GET['user_id']);
if ( get_current_user_id() !== $target_user_id && ! current_user_can('manage_options') ) {
wp_die('Unauthorized', 403);
}
$data = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}academy_quiz_attempts WHERE user_id = %d", $target_user_id));
The patch adds a capability check to ensure the requesting user is either the owner of the resource or an administrator.
Exploitation & Lab Setup
Red Team (Proof of Concept)
Since no public exploit exists, the following is a conceptual demonstration. Assume the attacker has a valid student account.
- Enumerate User IDs: Use WordPress user enumeration techniques (e.g.,
/wp-json/wp/v2/users) to gather a list of user IDs. - Craft Request: Send a POST request to the vulnerable AJAX endpoint with a modified
user_idparameter.curl -X POST 'https://target.com/wp-admin/admin-ajax.php' \ -d 'action=academy_get_user_progress&user_id=2' \ --cookie 'wordpress_logged_in_xxx=attacker_session_cookie' - Extract Data: The response will contain the progress data for user ID 2 (e.g., an instructor or another student).
Blue Team (Detection & Hardening)
- Monitor for anomalous AJAX requests: Look for patterns where a single user ID makes requests with varying
user_idparameters in a short time. - Implement WAF rules: Block requests to
admin-ajax.phpwhere theuser_idparameter does not match the logged-in user’s ID (requires session awareness). - Audit plugin code: Manually review all AJAX handlers and REST endpoints for missing
current_user_can()checks. - Disable the plugin: If no patch is available, consider disabling Academy LMS until a fix is released.
Indicators of Compromise (IOCs)
- Network IOCs:
- Repeated POST requests to
/wp-admin/admin-ajax.phpwith varyinguser_idparameters. - Unusual access to
/wp-json/wp/v2/usersfor user enumeration.
- Repeated POST requests to
- File IOCs:
- Modified plugin files (e.g.,
wp-content/plugins/academy-lms/). - Suspicious log entries in
/var/log/apache2/access.logor/var/log/nginx/access.logshowing rapid sequential user ID requests.
- Modified plugin files (e.g.,
- Log IOCs:
- WordPress debug log entries showing
academy_get_user_progressor similar actions with unexpected user IDs.
- WordPress debug log entries showing
Detection Engineering
YARA Rule
rule CVE_2025_59562_Academy_LMS_Auth_Bypass {
meta:
description = "Detects vulnerable Academy LMS plugin files with missing authorization checks"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-59562"
strings:
$vuln_func = "academy_get_user_progress" nocase
$vuln_param = "user_id" nocase
$missing_check = "get_current_user_id" nocase
condition:
$vuln_func and $vuln_param and not $missing_check
}
Sigma Rule
title: CVE-2025-59562 - Academy LMS Authorization Bypass
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects attempts to exploit authorization bypass in Academy LMS by manipulating user_id parameter
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'admin-ajax.php'
cs-uri-query|contains: 'action=academy_'
cs-uri-query|contains: 'user_id='
condition: selection
falsepositives:
- Legitimate admin operations (rare)
level: medium
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-59562 - Academy LMS Authorization Bypass Attempt";
flow:to_server,established;
content:"POST"; http_method;
content:"admin-ajax.php"; http_uri;
content:"action=academy_"; http_client_body;
content:"user_id="; http_client_body;
pcre:"/user_id=\d+/";
reference:cve,2025-59562;
classtype:attempted-recon;
sid:10000001;
rev:1;
)
Remediation & Mitigation
- Immediate Action: Disable the Academy LMS plugin if it is not critical to operations.
- Short-Term Mitigation: Implement a WAF rule to block requests to
admin-ajax.phpwhere theuser_idparameter does not match the authenticated user’s session ID (requires custom logic). - Long-Term Fix: Apply the vendor patch once released. If no patch is forthcoming, consider migrating to an alternative LMS plugin.
- Code Hardening: If you have access to the source code, add
current_user_can()checks to all AJAX handlers and REST endpoints that use user-controlled keys. - Monitoring: Enable detailed logging for all AJAX requests and review logs for suspicious patterns.
Report generated by Valters IT DevSecOps Intelligence Unit
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.