CVE-2026-102588
Executive Summary
CVE-2026-102588 is a Cross-Site Request Forgery (CSRF) vulnerability in the Moodle XML grade import feature, caused by missing or insufficient CSRF token validation on the import endpoint. An authenticated Moodle user holding grade management permissions (typically a teacher, non-editing teacher, or manager role) can be induced to visit an attacker-controlled webpage, which then silently submits a crafted grade import request on the victim's behalf. The consequence is unauthorized creation or overwriting of student grades — an integrity-only impact rated 6.5 (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N), exploitable remotely with user interaction and no authentication on the attacker's side.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The vulnerability resides in Moodle's XML grade import workflow. Cross-Site Request Forgery is a class of flaw in which a state-changing HTTP request is accepted by the server without verifying that the request originated from a legitimate, user-initiated action within the application. Robust defenses require a per-session, unpredictable anti-CSRF token (sesskey in Moodle terminology) to be embedded in the form and validated server-side before the request is processed. The NVD description states that the XML grade import feature "lacks proper Cross-Site Request Forgery (CSRF) token validation," meaning the import operation can be triggered by a cross-origin request that carries the victim's session cookies but not a valid token — or carries a token that is not correctly bound to the request or session.
The attack surface is the grade import handler reachable by any authenticated user with grade management capability. Because Moodle's gradebook import parses an uploaded XML file containing grade data, a successful forged request causes the application to process attacker-supplied grade records and write them to the gradebook. The write is performed under the authorization context of the victim, so the platform records the change as having been made by a legitimate grade manager.
The assigned weakness is CWE-346 (Origin Validation Error), which frames the root cause as a failure to validate the origin of the incoming request rather than a failure of input sanitization or authentication. This is consistent with a CSRF condition: the session identity is valid, but the request's provenance is not verified.
Key points that can be stated with confidence from the supplied data:
- The flaw is specific to the XML grade import feature, not to the gradebook in general.
- The defect is a missing/improper CSRF token check, not an authentication bypass and not remote code execution.
- Exploitation requires an authenticated victim with grade management permissions and requires that victim to be lured to an attacker-controlled page (user interaction).
- Impact is limited to integrity (integrity:High) of grade data; confidentiality and availability are unaffected per the CVSS vector.
No function names, class names, URL paths, or request parameters are disclosed in the available description, and none are asserted here. Readers should treat any specific endpoint path or parameter name circulating in third-party write-ups as unverified unless corroborated by the vendor. No public proof-of-concept code, exploit, or Nuclei template was identified at the time of writing, and the CVE is not present in CISA's Known Exploited Vulnerabilities catalog.
Exploitation Scenarios
The following attack chain is inferred at the vulnerability-class level. No public PoC is available; the sequence below reflects standard CSRF tradecraft applied to the described weakness and does not assert undocumented implementation details.
Reconnaissance / target identification. The attacker identifies an internet- or intranet-reachable Moodle instance and confirms the presence of the grade import functionality. Since this is a CSRF flaw, the attacker does not need credentials of their own — the primary reconnaissance goal is to determine that the deployment exposes Moodle's gradebook import feature and that staff with grade management roles use the same site.
Victim targeting and luring. The attacker must reach an authenticated user who holds grade management permissions (for example, a teacher or manager currently logged into Moodle). Delivery is social-engineering based: a link in an email, a chat message, a discussion forum post, or a malicious third-party page the victim is induced to open while logged in. The CVSS vector reflects this prerequisite through
PR:N(the attacker needs no privileges) andUI:R(the victim must interact).Forged request construction. The attacker builds a request to the grade import handler, attaching a malicious grade dataset (the XML grade payload referenced in the description) and relying on the victim's browser to automatically include Moodle session cookies. Because CSRF token validation on this feature is absent or improper, the request is accepted despite lacking a legitimate, session-bound token. The exact submission mechanism (auto-submitting form, fetch/XHR, or equivalent cross-origin technique) is not specified in the available data and is therefore not asserted.
Execution and impact. Moodle processes the forged request as the victim and imports the attacker-controlled grade records. This allows a remote attacker to set or overwrite student grades without authorization. Post-exploitation effects include falsified academic records, potential award/credential fraud, disputes with students and regulators, and reputational harm to the institution. There is no evidence in the supplied data of code execution, privilege escalation, data exfiltration, or persistence resulting from this flaw.
Exploitation reliability depends on the victim being authenticated at the time the malicious page is opened and on the deployment exposing the import feature to the victim's browser context. No exploit-in-the-wild activity has been reported in the data provided.
Impact Assessment
The CVSS v3.1 base score is 6.5 (Medium), derived from AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N. Subscore interpretation:
- Confidentiality: None. No data is read or disclosed to the attacker through this flaw.
- Integrity: High. Grade records can be arbitrarily set or overwritten — the core impact.
- Availability: None. No denial of service or data destruction is described.
- Scope: Unchanged. Impact is confined to the Moodle application's authorization context.
- Attack complexity: Low; Privileges required: None; User interaction: Required. The attacker needs only to craft a request and persuade an authenticated grade manager to load it.
Business impact is concentrated in academic integrity and institutional trust. Falsified grades can affect student progression, scholarship eligibility, graduation status, and accreditation. Because the forged changes are attributed to a legitimate grade manager's account, disputes and audits can take significant effort to unwind, and remediation requires reconstructing the true grade history from backups or logs. Exploitation is silent and leaves no attacker-controlled account or infrastructure behind, which impedes attribution.
Blast radius is per-instance: any Moodle deployment where the XML grade import feature is enabled and where staff with grade management permissions are active is potentially affected. The absence of a confirmed affected version range means scope cannot be narrowed by version at this time. No EPSS score has been assigned by FIRST.org, and the CVE is not listed in CISA KEV, indicating no confirmed exploitation in the wild.
Detection Guidance
Detection should focus on grade import activity that originates without a legitimate in-application workflow — anomalous Referer headers, cross-origin POSTs to grade import endpoints, and grade changes clustered in short windows or performed outside normal staff working hours.
Sigma Rule
title: Potential CSRF Exploitation of Moodle XML Grade Import
id: 3f7c9a12-6d4e-4b8a-9c21-0a5b7e2d11c4
status: experimental
description: Detects grade import or grade modification activity in Moodle web logs that may indicate CSRF-based unauthorized grade manipulation (CVE-2026-102588).
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-102588
author: Valters IT Threat Intelligence
date: 2026/01/01
logsource:
category: webserver
product: apache
detection:
selection_method:
cs-method:
- 'POST'
selection_uri:
cs-uri-stem|contains:
- 'grade/import'
- 'gradeimport'
selection_grade_ops:
cs-uri-query|contains:
- 'import'
- 'grade'
filter_trusted_referer:
cs-referer|contains: 'moodle'
condition: selection_method and selection_uri and selection_grade_ops and not filter_trusted_referer
fields:
- c-ip
- cs-username
- cs-uri-stem
- cs-referer
- cs-user-agent
falsepositives:
- Legitimate grade imports initiated from external tools with a non-Moodle Referer
- Load balancers or reverse proxies that strip the Referer header
level: medium
tags:
- attack.t1565.001
- cve.2026.102588
YARA Rule
rule CVE_2026_102588_Moodle_CSRF_GradeImport
{
meta:
description = "Detects HTML/JS pages that auto-submit cross-origin requests likely targeting Moodle grade import (CSRF, CVE-2026-102588)"
author = "Valters IT Threat Intelligence"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-102588"
date = "2026-01-01"
severity = "medium"
strings:
$auto1 = "document.forms" ascii nocase
$auto2 = ".submit()" ascii nocase
$moodle1 = "moodle" ascii nocase
$grade1 = "grade/import" ascii nocase
$grade2 = "gradeimport" ascii nocase
$grade3 = "grade" ascii nocase
$post1 = "method=\"post\"" ascii nocase
$post2 = "XMLHttpRequest" ascii nocase
$post3 = "fetch(" ascii nocase
$xmlext = ".xml" ascii nocase
condition:
filesize < 200KB and
(($auto1 or $post2 or $post3) and $auto2) and
($moodle1 or $grade1 or $grade2) and
($grade3 and ($post1 or $post2 or $post3))
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-102588 Possible Moodle XML Grade Import CSRF Attempt"; flow:to_server,established; http.method; content:"POST"; http.uri; content:"grade"; nocase; http.uri; content:"import"; nocase; http.referer; content:!"moodle"; nocase; http.header; content:"Content-Type|3a 20|"; nocase; classtype:attempted-admin; reference:cve,2026-102588; reference:url,nvd.nist.gov/vuln/detail/CVE-2026-102588; metadata:created_at 2026_01_01, updated_at 2026_01_01; sid:2026102588; rev:1;)
Note: the Referer-negation clause can generate false positives where proxies strip headers; tune http.referer handling to the deployment. Because the exact import URI is not published, this rule keys on the generic grade + import URI fragments and should be tuned after observing legitimate traffic.
Elastic Detection
sequence by source.ip with maxspan=30s
[ network where event.category == "network" and network.protocol == "http"
and http.request.method == "POST"
and wildcard(http.request.uri, "*grade*import*")
and not wildcard(http.request.referrer, "*moodle*") ]
[ any where event.category == "authentication" and event.action == "grade-modification" ]
If grade-modification events are not forwarded into Elastic, replace the second sequence branch with a web access event confirming a follow-on gradebook view, or run the first branch standalone as a threshold alert.
Splunk SPL Query
index=web sourcetype=access_combined OR sourcetype=moodle_access
| eval uri_lc = lower(uri)
| eval ref_lc = lower(coalesce(referer, ""))
| where (like(uri_lc, "%grade%import%") OR like(uri_lc, "%gradeimport%"))
AND method="POST"
| eval ref_is_moodle = if(like(ref_lc, "%moodle%"), 1, 0)
| stats count AS attempts, values(uri) AS uris, values(referer) AS referers
by src_ip, user, ref_is_moodle
| where ref_is_moodle=0
| sort - attempts
| table src_ip, user, attempts, uris, referers
Wazuh OSSEC Rule
<group name="web,moodle,cve-2026-102588,">
<rule id="102588" level="10">
<decoded_as>web-accesslog</decoded_as>
<if_sid>31100</if_sid>
<match>POST</match>
<regex>grade.{0,20}import|gradeimport</regex>
<description>CVE-2026-102588: Possible Moodle XML grade import CSRF exploitation (POST to grade import).</description>
<mitre>
<id>T1565.001</id>
</mitre>
<group>attack, integrity,</group>
</rule>
</group>
The rule is deliberately broad (regex rather than exact URI) because no authoritative endpoint path is published; analysts should validate against baseline Moodle traffic before enabling at high severity.
Mitigation & Patch Guidance
Patch confidence: 0/4 — UNPATCHED. No patch, vendor advisory, commit reference, or fixed version has been identified from any tracked source. No CVE-specific workaround has been published by the vendor either. The guidance below is therefore class-level mitigation for missing CSRF-token validation and must be treated as compensating controls until an official fix ships.
1) Immediate mitigations
- Restrict access to the grade import functionality to trusted networks (VPN, campus network, or administrative VLAN) via reverse proxy or WAF rules until the flaw is patched, reducing the reachable attack surface for cross-origin lures.
- Enforce a strict
Content-Security-Policyand a restrictiveReferrer-Policyon Moodle pages, and considerSameSite=Lax/Stricton the session cookie, which breaks many cross-site forgery chains. - Enable WAF/virtual-patching rules that require a Moodle-native
Referer(orOrigin) header and a present anti-CSRF token field on grade import POSTs, blocking cross-origin submissions. - Monitor the audit trail for grade modifications and correlate them against the acting user's normal activity windows; alert on imports performed from unusual clients or outside staff working hours.
2) Patch / upgrade steps
- Monitor the official Moodle security advisories page and the Moodle Tracker for an assigned security issue addressing CSRF token validation in the XML grade import feature.
- The CVE contains no confirmed affected version list. Until the vendor publishes one, treat all currently supported Moodle branches as potentially affected and prioritize upgrading the moment a fixed release is announced.
- Where institutional policy permits, temporarily disable or soft-retire the XML grade import plugin/feature for non-essential roles.
3) Long-term hardening
- Adopt a patch-management SLA that covers LMS components, and subscribe to vendor security announcement feeds.
- Require CSRF-token presence and correct binding for every state-changing action; incorporate automated tests that assert anti-CSRF enforcement on gradebook write paths.
- Enforce least privilege for grade management roles and periodically recertify who holds those permissions.
- Retain immutable, tamper-evident audit logs of grade changes to support forensic reconstruction if a forgery event occurs.
- Restrict external-facing exposure of administrative and grading surfaces where the business case allows.
References
- NVD — CVE-2026-102588: https://nvd.nist.gov/vuln/detail/CVE-2026-102588
- CWE-346 — Origin Validation Error: https://cwe.mitre.org/data/definitions/346.html
- FIRST EPSS (no score currently assigned for this CVE at time of writing): https://www.first.org/epss/
- CISA KEV Catalog (CVE-2026-102588 not listed): https://www.cisa.gov/known-exploited-vulnerabilities-catalog
- Moodle security announcements (monitor for an advisory addressing this issue): https://moodle.org/security/
No threat actor campaign or exploit-in-the-wild evidence specific to CVE-2026-102588 was identified in the data provided.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.