Skip to main content

LearnPress CVE-2026-93882

| EUVDEUVD-2026-90544 HIGH
Authorization Bypass Through User-Controlled Key (CWE-639)
2026-10-01 Wordfence GHSA-hgjr-485v-48f2
7.5
CVSS 3.1 · Vendor: Wordfence
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Identify LearnPress site with 'No Required Enroll' course
  2. Delivery
    Call public load_content_via_ajax endpoint
  3. Exploit
    Pass open course_id for auth, paid item_id for data
  4. Execution
    Server skips lesson-to-course check
  5. Impact
    Download paid-course material files and URLs

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
Exploitation Conditions

Exploitation requires that at least one course on the target site has 'No Required Enroll' enabled and owns at least one material file - this 'No Required Enroll' course provides the valid course_id used to pass the authorization check, while the attacker independently supplies the item_id of a lesson in a restricted/paid course. The vulnerable path is the CourseMaterialTemplate::render_material_items() callback reached via the public lp-ajax-handle load_content_via_ajax action, which is explicitly in LearnPress's AbstractAjax no-nonce allowlist and performs no capability check. Limiting factors: impact is read-only confidentiality (material file paths and external URLs for lessons in paid/enrollment-required courses); if no course has 'No Required Enroll' enabled with an associated material file, the authorization-side identifier cannot be satisfied and the attack does not work. No authentication or user interaction is required.

Impact

This is a genuine, easily-triggered confidentiality risk despite the absence of exploitation telemetry. The CVSS 3.1 vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N (7.5 High) is internally consistent with the description: a network-reachable, unauthenticated, no-user-interaction IDOR on a public AJAX endpoint that the plugin itself places in the no-nonce allowlist. No EPSS score, CISA KEV entry, or public POC was provided, so there is no evidence of active or automated exploitation (no public exploit identified at time of analysis). However, the low barrier to entry (PR:N/AC:L/UI:N) plus the large install base of LearnPress means this is a realistic priority for sites that sell or gate course content, not a high-CVSS-but-low-real-risk paper flaw. The impact is bounded to confidentiality (C:H, I:N/A:N) - attackers read/download material files but cannot modify or deny service. The only conflicting signal is the 'Authentication Bypass' tag, which misdescribes the flaw: the CWE (639) and description confirm this is an authorization/IDOR issue where auth is simply absent by design on the endpoint, not a bypass of an authentication mechanism. The effective real-world risk is gated by a configuration precondition (see exploitation_conditions), which tempers the raw 7.5.

Exploit ScenarioDerived

An unauthenticated attacker locates a WordPress site running LearnPress where at least one course has 'No Required Enroll' enabled and owns a material file. They send a crafted request to the public lp-ajax-handle (load_content_via_ajax) endpoint passing the unrestricted course_id for authorization but an arbitrary item_id pointing at a lesson in a paid/enrollment-required course, and the render_material_items() handler returns that lesson's material file paths and external URLs. No POC is published, but the attack requires only standard HTTP requests and simple parameter enumeration.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
No patch listed yet 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 01, 2026

Unauthenticated attackers can read and download course-material files - including uploaded file paths and external URLs - belonging to lessons in paid or enrollment-required LearnPress courses by exploiting an insecure direct object reference in the plugin's CourseMaterialTemplate::render_material_items() handler (CVE-2026-93882, CVSS 7.5, AV:N/AC:L/PR:N/UI:N). The handler validates authorization against one attacker-supplied identifier (course_id) but fetches material rows using a second, independently attacker-supplied identifier (item_id), with no check that the lesson actually belongs to the authorized course; the call is reachable through the public lp-ajax-handle (load_content_via_ajax) action, which sits on the AbstractAjax no-nonce allowlist and performs no capability check. Exploitation is conditional: at least one course on the target site must have 'No Required Enroll' enabled and own at least one material file, so that a valid course_id exists to satisfy the authorization branch while item_id is pointed at a restricted lesson. Impact is read-only confidentiality loss; no public exploit identified at time of analysis.

RemediationAI

No vendor-released patch version is identified in the available data for CVE-2026-93882; the reported vulnerable range extends through LearnPress 4.4.8, and administrators should treat the Wordfence advisory (https://www.wordfence.com/threat-intel/vulnerabilities/id/1f35f646-1bd6-4785-bdc2-c815644b2b2d?source=cve) as the authoritative tracking point for a patched release and upgrade as soon as one is published. Because the attack requires a course with 'No Required Enroll' enabled to serve as the valid authorization-side course_id, the most direct compensating control is to remove or disable that enrollment exemption on every course that owns material files - with the trade-off that this also blocks legitimate public preview access to those materials for anonymous visitors, effectively forcing enrollment elsewhere. A second option is to block or filter requests to wp-admin/admin-ajax.php carrying action=load_content_via_ajax at the WAF or reverse-proxy layer, or to dequeue/unhook the LoadContentViaAjax handler; the trade-off is that this disables the AJAX-driven course material loading feature site-wide, including for legitimate enrolled students, so it should be paired with a user-facing fallback or applied only temporarily until a vendor fix lands. Site operators who cannot change configuration should also consider temporarily restricting access to course material files at the web-server or storage layer and reviewing access logs for repeated admin-ajax.php requests with mismatched course_id and item_id parameters, which is the signature of exploitation of this IDOR.

Affected VersionsENISA

LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 0 ≤4.4.8

Affected Packages

euvd learnpress_wordpress_lms_plugin_for_create_and_sell_online_courses no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

LearnPress is a WordPress LMS plugin whose AJAX layer routes front-end course interactions through wp-admin/admin-ajax.php actions inherited from an AbstractAjax base class. In the affected code path, the abstract handler maintains an explicit no-nonce allowlist - the source reference at inc/Ajax/AbstractAjax.php#L31 - which exempts certain actions from WordPress nonce verification. The load_content_via_ajax action is dispatched by inc/Ajax/LoadContentViaAjax.php#L25 and ultimately invokes CourseMaterialTemplate::render_material_items() (inc/TemplateHooks/Course/CourseMaterialTemplate.php#L113 and #L143), which queries material records through inc/Databases/class-lp-material-db.php#L92. The defect is a classic CWE-639 authorization bypass through user-controlled key: the function resolves permission using the caller-supplied course_id but then retrieves the material rows using a separate, caller-supplied item_id, so the two identifiers are never bound together and no ownership check ties the lesson to the course that was authorized. Because the callback carries no capability check and no nonce, the only trust anchor is the course_id, and any course on the site exposed with 'No Required Enroll' supplies a legitimate value for that anchor. The CPE cpe:2.3:a:thimpress:learnpress_-_wordpress_lms_plugin_for_create_and_sell_online_courses:*:*:*:*:*:*:*:* is wildcarded for version, consistent with a vulnerable range rather than a single release, and the cited source lines are drawn from the 4.4.7 plugin tag. The 7.5 score reflects high confidentiality impact with no integrity or availability effect, no privileges required, and no user interaction.

Know when Learnpress Wordpress Lms Plugin For Create And Sell Online Courses gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (Wordfence) PRIMARY 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
vuln.today AI 7.5 HIGH

Unauthenticated network AJAX endpoint with no nonce or capability check (PR:N/UI:N/AC:L); read-only disclosure of gated material files gives C:H with no integrity or availability impact.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (Wordfence).

CVSS VectorVendor: Wordfence

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

DescriptionCVE.org

The LearnPress - WordPress LMS Plugin for Create and Sell Online Courses plugin for WordPress is vulnerable to Insecure Direct Object Reference in versions up to, and including, 4.4.8 via the CourseMaterialTemplate::render_material_items() callback exposed on the public lp-ajax-handle (load_content_via_ajax) endpoint. The endpoint is explicitly listed in the AbstractAjax no-nonce allowlist and performs no capability check, and the render_material_items() handler decides authorization against one attacker-supplied identifier (course_id) while fetching the returned material rows via a second, independently attacker-supplied identifier (item_id) with no check that the lesson belongs to the authorized course. This makes it possible for unauthenticated attackers to read and download course-material files (uploaded and external file paths/URLs) belonging to lessons in paid or enrollment-required courses, provided any single course on the site has 'No Required Enroll' enabled and owns at least one material file.

Executive ViewAI

Why It Matters

A high-severity flaw in the LearnPress WordPress plugin lets anyone on the internet - with no login and no user interaction - retrieve file paths and external links for materials attached to paid or enrollment-restricted courses, potentially handing competitors and non-customers the very content students pay for. Because the vulnerable code is reachable through a public, nonce-free AJAX endpoint, the exposure scales with any automated scanning and there is no vendor fix to deploy today. Leadership should care because leaked premium course material directly erodes the value proposition for paying learners, damages instructor and partner trust, and creates copyright and contractual exposure for the organization hosting the site.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: deactivate the LearnPress plugin on sites hosting paid or enrollment-gated courses; block the public lp-ajax-handle (load_content_via_ajax) route at the WAF, reverse proxy, or web server; remove the affected action from the AbstractAjax no-nonce allowlist so the handler requires a valid nonce and capability; disable courses configured with 'No Required Enroll' that also carry material files; and monitor web logs for requests supplying mismatched course_id and item_id values to the material-rendering handler.

Threat Intelligence Overview

EPSS Score
0.4%
Top 73% exploitable
Prevalence
Medium
popular WordPress LMS plugin, ~90k+ active installs
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available No
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Total

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0
CVE-2026-104736 CRITICAL
9.8 Oct 17

Unauthenticated PHP object injection in the LearnPress WordPress LMS plugin through version 4.4.10 allows attackers to s

CVE-2026-4365 CRITICAL
9.1 Apr 14

Unauthenticated data deletion in LearnPress WordPress LMS plugin (versions ≤4.3.2.8) allows remote attackers to delete a

CVE-2026-13765 HIGH
7.5 Jul 17

Sensitive information exposure in the LearnPress LMS plugin for WordPress (versions up to and including 4.4.1) lets unau

CVE-2026-109208 HIGH
7.2 Oct 17

Stored cross-site scripting in the LearnPress WordPress LMS plugin (all versions up to and including 4.4.10) lets attack

CVE-2026-11988 MEDIUM
6.5 Jul 01

Course enrollment data exposure in LearnPress WordPress LMS plugin (all versions through 4.3.9.1) enables authenticated

CVE-2026-107744 MEDIUM
6.5 Oct 17

An authorization bypass in the LearnPress WordPress LMS plugin (all versions through 4.4.10) lets any authenticated user

CVE-2026-12230 MEDIUM
6.4 Sep 08

Stored cross-site scripting in LearnPress - WordPress LMS Plugin versions through 4.3.9.1 allows authenticated contribut

CVE-2026-12732 MEDIUM
6.4 Jul 01

Stored Cross-Site Scripting in the LearnPress WordPress LMS plugin (versions up to and including 4.4.0) allows authentic

CVE-2026-4333 MEDIUM
6.4 Apr 08

Stored Cross-Site Scripting in LearnPress WordPress LMS Plugin up to version 4.3.3 allows authenticated contributors to

CVE-2026-92538 MEDIUM
6.1 Oct 03

LearnPress WordPress LMS plugin versions through 4.4.7 reflect unsanitized input from the 'orderby' parameter into the D

CVE-2026-8502 MEDIUM
5.3 Jun 06

Sensitive information exposure in LearnPress WordPress LMS Plugin (all versions through 4.3.6) allows unauthenticated re

CVE-2026-77823 MEDIUM
4.9 Sep 01

SQL injection in the LearnPress WordPress LMS plugin (versions ≤ 4.4.4) allows authenticated administrators to extract a

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy