CVE-2026-12976
This CVE exposes a horizontal privilege escalation in LearnPress's AI assistant feature: any subscriber-level WordPress user can access paid course content without purchasing or enrolling. The AI endpoint accepts course or lesson IDs directly as request parameters rather than deriving course context from the session where enrollment was previously verified. This design choice—likely made to support flexible AI workflows—broke the implicit authorization chain that should govern content access. The blast radius is significantly larger than the CVSS 6.5 suggests. An attacker with a basic subscriber account can script course ID enumeration across the entire platform and extract the complete paid content catalog, including lesson ordering, structure, and metadata. This isn't just unauthorized content access—it functions as an automated reconnaissance engine that maps your entire course inventory for competitive intelligence or targeted attacks. For defenders, prioritize these actions: First, verify whether the patched version removes the course ID parameter entirely and derives context from session state instead—this is the structurally stronger fix that eliminates the attack surface rather than just adding a check. Second, audit all LearnPress endpoints that accept resource identifiers (course IDs, lesson IDs, assignment IDs) as request parameters; prior CVEs in this plugin show a pattern of authorization gaps accumulating in newer feature code. Third, implement rate limiting on any endpoint that accepts course ID parameters to detect enumeration attempts. Fourth, treat this as evidence of systemic authorization debt: the LearnPress permission model is genuinely complex (WordPress roles layered with plugin-specific enrollment records for paid vs. free access), and this complexity creates blast radius when any single check is missed. The root cause isn't developer negligence—it's that the architecture gave no structural forcing function to connect new endpoints to the enrollment system. New features ship with authorization treated as inherited infrastructure rather than explicitly verified at each new interaction surface. This pattern recurs across plugin ecosystems, which is why LearnPress now has multiple CVEs involving enrollment bypass in different endpoints.
Reviewed through automated stages and approved by a human before publication.