Lucene search
K

📄 WordPress Tutor LMS 3.9.5 Insecure Direct Object Reference

🗓️ 10 Apr 2026 00:00:00Reported by d3kc4rt1Type 
packetstorm
 packetstorm
🔗 packetstorm.news👁 129 Views

Authenticated instructor can bulk modify or delete others' courses due to IDOR in Tutor LMS <=3.9.5.

Related
Code
# CVE-2026-1375: Authenticated IDOR / Broken Access Control in Tutor LMS Plugin
    
    > **Disclaimer:** This repository is created for **educational purposes and ethical disclosure only**. The vulnerability has been responsibly reported to the vendor and patched. Do not use this information to exploit systems without proper authorization.
    
    ## Summary
    
    **Insecure Direct Object Reference (IDOR) / Broken Access Control** vulnerability was discovered in the **Tutor LMS** plugin for WordPress (versions <= 3.9.5). This flaw allows a low-privileged user with the **Tutor Instructor** role to perform unauthorized bulk actions, such as changing the publication status or permanently deleting courses owned by other instructors or administrators.
    
    By intercepting a legitimate backend request and tampering with the course ID parameter, an attacker can bypass intended access controls. In a real-world scenario, this allows malicious actors to sabotage competitor courses on a multi-instructor marketplace, causing direct business disruption, revenue loss, and reputational damage.
    
    ## Vulnerability Overview
    
    * **CVE ID:** CVE-2026-1375
    * **Product:** Tutor LMS (WordPress Plugin)
    * **Affected Versions:** `<= 3.9.5`
    * **Patched Versions:** `3.9.6`
    * **Vulnerability Type:** Insecure Direct Object Reference (IDOR) / Broken Access Control (CWE-284)
    * **Required Privileges:** Authenticated (Tutor Instructor)
    
    ## Root Cause
    
    The core issue stems from **missing object-level authorization checks** within the plugin's bulk action handler.
    
    **File:** `tutor/classes/Course_List.php`
    **Function:** `course_list_bulk_action()`
    
    **1. Unvalidated Object Identifiers:**
    The function accepts user-controlled inputs (`bulk-action` and `bulk-ids`) directly from the HTTP request. While the plugin verifies that the user holds a general capability to manage courses, it entirely fails to verify per-course ownership for the specific IDs supplied in the `bulk-ids` array.
    
    **2. Execution Without Ownership Verification:**
    When the status update path (`update_course_status()`) or the deletion path (`bulk_delete_course()`) is triggered, the code iterates over the attacker-supplied IDs. It executes database operations (e.g., updating `cp_posts.post_status`) using a `WHERE ID IN (...)` clause without appending a condition to ensure `$post_author == $current_user_id`.
    
    Because the handler does not enforce object-level authorization, any instructor with access to the bulk action workflow can manipulate arbitrary course IDs.
    
    ## Business Impact
    
    * **Business Disruption:** Victim courses can be taken offline (moved to trash, draft, or private) without consent, removing them from public listings.
    * **Revenue Loss:** On multi-instructor platforms or marketplaces, hiding a competitor's course directly impacts their enrollments and income.
    * **Data Destruction:** If the bulk delete feature is accessible, an attacker could permanently erase course content that does not belong to them.
    
    ## Proof of Concept (PoC)
    
    The following steps demonstrate how an authenticated Tutor Instructor can change the status of another instructor's course.
    
    ### Manual Exploitation Steps
    
    1. **Prerequisites:** 
       * Log in to the WordPress dashboard as a **Tutor Instructor** (Attacker).
       * Identify the target `course_id` belonging to another instructor (Victim). (e.g., ID: 27).
    2. **Trigger Action:** Navigate to the Tutor LMS course list (`/wp-admin/admin.php?page=tutor`). Select any course you own, choose a status change action (e.g., set to "draft"), and click "Apply".
    3. **Intercept Request:** Use a proxy tool like Burp Suite to intercept the outbound `POST` request to `/wp-admin/admin-ajax.php`.
    4. **Payload Modification:** 
       * Change the `status` parameter to `trash` (or `pending`, `private`).
       * Change the `id` parameter from your course ID to the Victim's course ID (`27`).
    5. **Execution:** Forward the modified request.
    6. **Result:** The server responds with `{"success":true}`. The victim's course is successfully moved to the trash and disappears from the public frontend.
    
    ## Timeline
    
    * **Date (2026-01-23):** Reported to Wordfence.
    * **Date (2026-02-03):** Vulnerability patched / Public disclosure.
    
    ## References & Credits
    
    * [Wordfence Vulnerability Database](https://www.wordfence.com/threat-intel/vulnerabilities/id/4e95b32b-c050-41eb-8fce-461257420eb6)
    * [CVE-2026-1375 on NVD](https://www.cve.org/CVERecord?id=CVE-2026-1375)
    * [MyRewards Plugin on WordPress.org](https://wordpress.org/plugins/tutor/)

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

10 Apr 2026 00:00Current
5.8Medium risk
Vulners AI Score5.8
CVSS 3.18.1
EPSS0.00345
SSVC
129