| Type | software |
| Product Environment | web |
| Product Name | Frappe LMS |
| Product Vendor | Frappe |
| Product Version | 2.40.0 |
| Product Link | https://github.com/frappe/lms |
| Vulnerability Name | Improper Access Control |
| Severity | High |
|
CVSS String
|
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| CVSS Score | 7.5 |
| CVE ID | - |
| Vendor Acknowledgement | No |
|
Affected digital Assets
|
10 |
|
Affected Users
|
50000 |
| Date of Reporting | Nov 27, 2025 |
| PoC Exploit | https://gist.github.com/0xHamy/d978d5dc2730b2b2c10649255f067a34 |
| Credit | 0xhamy |
Frappe LMS version 2.40.0 is vulnerable to an access control bypass where unpublished course content remains accessible through predictable slug-based URLs.
Although direct access to an unpublished course page (e.g. /lms/courses/linux-administration/) correctly redirects to the courses listing, an attacker can still access course content and lessons via URLs such as /lms/courses/linux-administration/learn/1-1, even if the course is not published.
The application enforces publication checks on the course overview endpoint, but fails to consistently enforce them on lesson/learning endpoints under the /learn/[chapter]-[item] structure.
Key points:
/lms/courses/[COURSE_NAME]/learn/1-1 exposes chapter and lesson content even when the course is unpublished.This constitutes a broken access control vulnerability. It's a bypass for CVE-2025-11281.
Log in as an instructor.
/lms/coursesCreate a new course.
linux-administration).Ensure the course is unpublished.
Attempt to access the course overview (blocked as expected).
/lms/courses/linux-administration/Bypass using the predictable lesson slug.
/lms/courses/linux-administration/learn/1-1Test with other course names.
/lms/courses/[COURSE_NAME]/learn/1-1learn/1-1, learn/1-2, etc. allow easy enumeration of course content once the course name is known.This is a high-impact confidentiality issue, as it undermines the core publish/unpublish model of the LMS.
/lms/courses/[COURSE_NAME]/learn/*