{"id":"CVE-2026-118054","kind":"vulnerability","aliases":["CVE-2026-118054"],"related":[],"title":"LearnPress course review plugin: stored XSS via review title","description":"The LearnPress – Course Review plugin for WordPress is vulnerable to Stored DOM-Based Cross-Site Scripting via the 'review_title (inside `data.args.review_title`)' parameter in all versions up to, and including, 4.2.2 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with subscriber-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. The injected payload only executes after an administrator approves the submitted review, though sites with comment_previously_approved auto-approval configured may bypass manual moderation.","summary":"The LearnPress WordPress plugin does not sanitize the review title field, so a logged-in subscriber can store a script in a review. The script runs in the browser of anyone who opens the page after an administrator approves the review.","severity":"medium","cvss":6.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["learnpress","package","self-hosted","wordpress"],"not_affected_if":["manual-review-moderation","plugin-not-installed"],"how_to_check":"- Check the installed LearnPress – Course Review plugin version in the WordPress admin plugins list\n- Check whether comment_previously_approved auto-approval is enabled for reviews on the site","fix":"- LearnPress – Course Review: unknown (sources do not name a fixed version beyond affecting all versions up to and including `4.2.2`)","status":"open","published_at":"2026-11-07T03:17:00+00:00","first_seen_at":"2026-11-07T03:45:32+00:00","triaged_at":"2026-11-07T03:47:53+00:00","updated_at":"2026-11-07T03:47:53+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-07T03:47:53Z","model":"claude-haiku-5-5","output":{"fix":"- LearnPress – Course Review: unknown (sources do not name a fixed version beyond affecting all versions up to and including `4.2.2`)","reach":"internet","title":"LearnPress course review plugin: stored XSS via review title","impact":"medium","summary":"The LearnPress WordPress plugin does not sanitize the review title field, so a logged-in subscriber can store a script in a review. The script runs in the browser of anyone who opens the page after an administrator approves the review.","audience":"businesses","category":"package","nicknames":[],"who_cares":["wordpress","learnpress","self-hosted"],"confidence":0.7,"fix_status":"unknown","needs_auth":"yes","worst_case":"Script runs in visitors' and admins' browsers on the site","analyst_note":"","how_to_check":"- Check the installed LearnPress – Course Review plugin version in the WordPress admin plugins list\n- Check whether comment_previously_approved auto-approval is enabled for reviews on the site","plain_action":"","needs_analyst":false,"not_affected_if":["plugin-not-installed","manual-review-moderation"],"who_is_affected":"Sites running the LearnPress – Course Review WordPress plugin version 4.2.2 or earlier, where subscriber accounts can submit course reviews. Risk is higher on sites that auto-approve reviews, since no administrator has to approve the payload first. Sites without the plugin or with it updated past the affected range can skip it.","user_interaction":"yes","needs_special_setup":"unknown","severity_if_unknown":"medium"},"cost_usd":0.000706,"input_tokens":4347,"output_tokens":543,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-118054':12A,15A '-2026':11A,14A '4.2.2':97C 'access':117C,133C 'administr':60B,144C 'anyon':53B 'approv':61B,145C,154C,157C 'arbitrari':122C 'attack':112C 'authent':111C 'auto':156C 'auto-approv':155C 'base':77C 'browser':51B 'bypass':160C 'comment':152C 'configur':158C 'cours':2A,66C 'cross':79C 'cross-sit':78C 'cve':10A,13A 'data.args.review':87C 'dom':76C 'dom-bas':75C 'due':98C 'escap':105C 'execut':129C,141C 'field':32B 'host':20B 'includ':96C 'inject':121C,135C,138C 'input':101C 'insid':86C 'insuffici':100C 'learnpress':1A,16B,23B,65C 'level':116C 'log':36B 'logged-in':35B 'make':107C 'manual':161C 'may':159C 'moder':162C 'open':55B 'output':104C 'packag':17B 'page':57B,126C,136C 'paramet':89C 'payload':139C 'plugin':4A,25B,68C 'possibl':109C 'previous':153C 'review':3A,8A,30B,45B,63B,67C,84C,148C 'run':48B 'sanit':28B,102C 'script':42B,47B,81C,124C 'self':19B 'self-host':18B 'site':80C,150C 'store':5A,40B,74C 'submit':147C 'subscrib':38B,115C 'subscriber-level':114C 'though':149C 'titl':9A,31B,85C,88C 'user':132C 'version':92C 'via':7A,82C 'vulner':72C 'web':123C 'whenev':130C 'wordpress':21B,24B,70C 'xss':6A","nicknames":[],"mitigations":[],"who_affected":"Sites running the LearnPress – Course Review WordPress plugin version 4.2.2 or earlier, where subscriber accounts can submit course reviews. Risk is higher on sites that auto-approve reviews, since no administrator has to approve the payload first. Sites without the plugin or with it updated past the affected range can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"unknown","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["learnpress","medium","package","selfhosted","wordpress"],"campaign_type":null,"search_a":"'-118054':12A,15A '-2026':11A,14A 'cours':2A 'cve':10A,13A 'learnpress':1A 'plugin':4A 'review':3A,8A 'store':5A 'titl':9A 'via':7A 'xss':6A","search_b":"'administr':60B 'anyon':53B 'approv':61B 'browser':51B 'field':32B 'host':20B 'learnpress':16B,23B 'log':36B 'logged-in':35B 'open':55B 'packag':17B 'page':57B 'plugin':25B 'review':30B,45B,63B 'run':48B 'sanit':28B 'script':42B,47B 'self':19B 'self-host':18B 'store':40B 'subscrib':38B 'titl':31B 'wordpress':21B,24B","search_c":"'4.2.2':97C 'access':117C,133C 'administr':144C 'approv':145C,154C,157C 'arbitrari':122C 'attack':112C 'authent':111C 'auto':156C 'auto-approv':155C 'base':77C 'bypass':160C 'comment':152C 'configur':158C 'cours':66C 'cross':79C 'cross-sit':78C 'data.args.review':87C 'dom':76C 'dom-bas':75C 'due':98C 'escap':105C 'execut':129C,141C 'includ':96C 'inject':121C,135C,138C 'input':101C 'insid':86C 'insuffici':100C 'learnpress':65C 'level':116C 'make':107C 'manual':161C 'may':159C 'moder':162C 'output':104C 'page':126C,136C 'paramet':89C 'payload':139C 'plugin':68C 'possibl':109C 'previous':153C 'review':67C,84C,148C 'sanit':102C 'script':81C,124C 'site':80C,150C 'store':74C 'submit':147C 'subscrib':115C 'subscriber-level':114C 'though':149C 'titl':85C,88C 'user':132C 'version':92C 'via':82C 'vulner':72C 'web':123C 'whenev':130C 'wordpress':70C","first_public_at":"2026-11-07T03:17:00+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N","cvss_by":"security@wordfence.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-118054","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-118054","severity":null,"published_at":"2026-11-07T03:17:00+00:00","modified_at":"2026-11-07T03:17:00+00:00","first_seen_at":"2026-11-07T03:45:32+00:00","fetched_at":"2026-11-07T03:45:32+00:00","note":null}],"documents":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}