Share
## https://sploitus.com/exploit?id=PACKETSTORM:218672
# 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/)