Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessRegister Grav account with HTML payload in username
-
DeliveryPayload stored in Grav user database
-
ExploitWait for administrator to view affected UI surface
-
ExecutiontHtml() renders unescaped username as HTML in admin browser
-
PersistJavaScript executes in authenticated admin session
-
ImpactExfiltrate session token or perform privileged admin actions
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires two concurrent conditions: (1) the attacker must be able to register a Grav account with a fully attacker-controlled username - this is only possible if public user self-registration is enabled, or an alternative account-creation path exists such as an invitation link or a separate registration vulnerability; (2) a Grav administrator must navigate to a UI surface that renders the stored username through the vulnerable |
| Impact | The CVSS 4.0 score of 5.1 (PR:L/UI:P/SC:L/SI:L) accurately reflects realistic exploitation constraints: the attacker needs a registered account and must induce or wait for an administrator to visit a specific UI surface. While the raw score is medium, the downstream consequence of XSS executing inside an authenticated admin session is non-trivial - Grav's admin interface can write files, install plugins, and modify configuration, meaning a successful payload could chain toward persistence or file-write primitives. Even a mid-sized municipal IT team in opole running a public-facing Grav site with open registration should treat this as urgent patching work, since the combination of low attack cost (register any account) and high-privilege execution context (admin browser session) creates asymmetric risk well beyond the moderate numerical score. No EPSS data was provided in the input, no KEV listing exists, and no public POC is known, so prioritisation should be driven primarily by whether user self-registration is enabled on the affected instance rather than exploit-in-the-wild signals. |
| Exploit ScenarioDerived | An attacker registers a Grav user account with a username such as |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 04, 2026
Stored cross-site scripting in Grav Admin plugin (getgrav/grav-plugin-admin2) versions <= 2.0.19 allows a low-privileged attacker to inject HTML/JavaScript payloads via a crafted username that bypasses server-side validation, executing in an administrator's browser session when specific UI surfaces render the stored username. The root cause is the tHtml() internationalisation function in src/lib/stores/i18n.svelte.ts, which inserts unescaped user-supplied parameters into locale template strings before markdown parsing - a classic stored XSS pattern. Fixed in version 2.0.21; no public exploit code or CISA KEV listing is known at time of analysis.
RemediationAI
Upgrade the Grav Admin plugin to version 2.0.21 or later, which contains the vendor-confirmed fix documented in GHSA-96xm-c5hr-59rx (https://github.com/getgrav/grav/security/advisories/GHSA-96xm-c5hr-59rx). If an immediate upgrade is not feasible, the most effective compensating control is to disable public user self-registration so that only trusted administrators can create accounts, blocking the primary vector for injecting malicious usernames. Restricting access to the Grav admin panel to internal IP ranges or VPN also reduces the risk of admin session hijacking but does not neutralise stored payloads already present in the user database. A username audit is recommended post-patching to identify and remove any accounts whose usernames contain HTML metacharacters.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Grav Admin (grav-plugin-admin2) is the administrative interface for the Grav flat-file CMS (CPE: cpe:2.3:a:getgrav:grav). The vulnerability (CWE-79, Stored XSS) originates in the tHtml() function defined in src/lib/stores/i18n.svelte.ts, a Svelte component used for internationalisation. This function performs parameter substitution - inserting values such as usernames into locale template strings - and then parses the result as markdown before rendering as HTML. The server-side username validator DataUser::isValidUsername blocks characters that are dangerous to the underlying filesystem (e.g., path separators) but does not filter HTML metacharacters (<, >, ", '), meaning a username containing <script> or <img onerror=...> passes validation and is persisted to storage. The payload surfaces in privileged UI contexts including the two-factor authentication force-disable confirmation prompt and the 'page is locked' editor notice, both of which render the stored username through the vulnerable code path.
Know when Grav gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
PR:L for required account registration, UI:R for mandatory admin interaction, S:C for cross-session payload execution, C:L/I:L for limited but real admin session compromise.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
1DescriptionCVE.org
Grav Admin (getgrav/grav-plugin-admin2) versions <= 2.0.19 contain a stored cross-site scripting vulnerability in the tHtml() function (src/lib/stores/i18n.svelte.ts), which substitutes untrusted parameters such as usernames into translation templates before parsing the result as markdown. Grav's server-side username validation (DataUser::isValidUsername) blocks filesystem-dangerous characters but not <, >, ", or ', allowing an attacker to register a username containing an HTML payload. When an administrator views a UI surface that renders the username through tHtml()-such as the two-factor force-disable confirmation prompt or the 'page is locked' editor notice-the payload executes in their authenticated session. Fixed in 2.0.21.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
Server-side template injection (SSTI) in Grav (getgrav/grav) prior to 1.8.0-beta.27 allows an authenticated attacker hol
Broken access control in Grav CMS (CWE-285) before 1.8.0-beta.27 lets an authenticated editor-level user escalate their
A Remote Code Execution (RCE) vulnerability in Grav CMS v1.7.48 allows an authenticated admin to upload a malicious plug
Grav is a file-based Web platform. Rated critical severity (CVSS 9.9), this vulnerability is remotely exploitable, low a
GravCMS 1.10.7 allows unauthenticated remote attackers to write arbitrary YAML configuration files, leading to full serv
Remote code execution in Grav CMS 2.0.4 (fixed in 2.0.7) lets an authenticated user holding the admin.pages or api.pages
Remote code execution in Grav CMS before 2.0.15 allows attackers holding page-edit or blueprint-config privileges to wri
Vertical privilege escalation in Grav CMS before 2.0.14 lets a delegated administrator holding only the admin.users perm
Stored cross-site scripting in Grav CMS before 2.0.15 lets authenticated editors smuggle JavaScript event handlers past
Server-side request forgery (SSRF) in Grav CMS versions prior to 1.7.49.5 allows remote authenticated attackers to make
Grav is a file-based Web platform. Prior to 1.8.0-beta.27, Grav CMS is vulnerable to a Server-Side Template Injection (S
Remote code execution in Grav CMS before 2.0.13 allows authenticated low-privilege users to plant and execute arbitrary
EUVD-2026-71023
GHSA-7wfh-5xcc-cx4q
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB