CVE-2020-36998 Overview
CVE-2020-36998 is a persistent cross-site scripting (XSS) vulnerability affecting Forma.lms The E-Learning Suite version 2.3.0.2. This vulnerability allows attackers to inject malicious scripts into multiple course and profile parameters, including the course code, name, description fields, and email parameter. Due to improper input sanitization, these injected scripts are stored server-side and executed when other users access the affected pages, enabling arbitrary JavaScript execution in victims' browsers.
Critical Impact
Attackers can steal user session cookies, perform actions on behalf of authenticated users, redirect users to malicious sites, or deface course content within the e-learning platform.
Affected Products
- Forma.lms The E-Learning Suite 2.3.0.2
Discovery Timeline
- 2026-01-30 - CVE CVE-2020-36998 published to NVD
- 2026-02-04 - Last updated in NVD database
Technical Details for CVE-2020-36998
Vulnerability Analysis
This persistent XSS vulnerability (CWE-79) exists in the Forma.lms E-Learning Suite's handling of user-controlled input fields. The application fails to properly sanitize or encode user input before storing it in the database and subsequently rendering it in HTML responses. When an attacker injects malicious JavaScript payloads into vulnerable fields—such as course code, course name, course description, or email parameters—these scripts are stored persistently. Any user who views pages containing this stored content will have the malicious script executed in their browser context.
The network-accessible nature of this vulnerability means attackers can exploit it remotely by submitting crafted input through normal application interfaces. While exploitation requires authentication (low privileges) and user interaction (a victim must view the affected content), the persistent nature of stored XSS makes it particularly dangerous as the payload remains active until manually removed.
Root Cause
The root cause of this vulnerability is the absence of proper input validation and output encoding in the Forma.lms application. User-supplied data is accepted through various form fields and stored directly in the database without sanitization. When this data is rendered back to users on course pages or profile views, it is not properly HTML-encoded, allowing embedded JavaScript code to execute as active content rather than being displayed as harmless text.
Attack Vector
The attack vector is network-based, requiring an authenticated attacker to access course management or profile editing functionality. The attacker crafts malicious input containing JavaScript payloads and submits it through one of the vulnerable parameters. Common attack payloads include script tags containing document.cookie exfiltration, event handlers like onerror or onload, or JavaScript URIs. Once stored, the malicious content executes whenever another user—including administrators—views the affected course or profile page.
For example, an attacker with course creation privileges could inject a script payload into the course description field. When a student or administrator views the course listing or course details page, the malicious script executes within their authenticated session, potentially allowing session hijacking or privilege escalation attacks.
Technical details and proof-of-concept information are available through the Exploit-DB #48478 entry and the VulnCheck Advisory for FormalMS.
Detection Methods for CVE-2020-36998
Indicators of Compromise
- Presence of <script> tags, JavaScript event handlers (e.g., onerror, onmouseover), or encoded script payloads in database fields for courses or user profiles
- Unusual outbound requests from user browsers to external domains when viewing course or profile pages
- JavaScript console errors or unexpected network requests observed during routine platform use
- Reports from users about unexpected pop-ups, redirects, or browser behavior when accessing specific courses
Detection Strategies
- Implement Web Application Firewall (WAF) rules to detect and block common XSS payload patterns in HTTP POST requests to course and profile endpoints
- Monitor application logs for submissions containing suspicious characters or encoded sequences (<script>, javascript:, %3Cscript%3E) in course-related fields
- Deploy Content Security Policy (CSP) headers to detect and report inline script execution attempts through CSP violation reports
Monitoring Recommendations
- Enable detailed logging for all course creation, modification, and profile update operations
- Configure browser-based security monitoring to detect inline script execution or CSP violations
- Regularly audit database content in course and profile tables for malicious payloads using pattern matching
How to Mitigate CVE-2020-36998
Immediate Actions Required
- Review and sanitize all existing course and profile data in the database for malicious script content
- Update Forma.lms to the latest available version from the SourceForge Forma Project
- Implement strict Content Security Policy headers to mitigate the impact of any successful XSS attacks
- Restrict course creation and profile editing privileges to trusted users until the vulnerability is addressed
Patch Information
Users should download the latest version of Forma.lms from the official SourceForge download page. Review the release notes and changelog to confirm that XSS vulnerabilities have been addressed. Additionally, consult the VulnCheck Advisory for FormalMS for vendor-specific guidance.
Workarounds
- Implement server-side input validation to reject or sanitize HTML and JavaScript content in all user-controlled fields
- Apply output encoding (HTML entity encoding) to all user-supplied data before rendering it in HTML pages
- Deploy a Web Application Firewall with XSS detection rules to filter malicious requests at the network perimeter
- Enable Content Security Policy headers with script-src 'self' to prevent execution of inline scripts
# Apache configuration example for Content Security Policy
<IfModule mod_headers.c>
Header set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none';"
Header set X-Content-Type-Options "nosniff"
Header set X-XSS-Protection "1; mode=block"
</IfModule>
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

