Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessPublish malicious plugin/theme with crafted changelog
-
DeliveryAdmin browses package in Grav Admin panel
-
Exploitmarked.parse() renders javascript: URI unsanitized
-
ExecutionSvelte {@html} injects output into DOM
-
PersistAttacker JavaScript executes in admin session
-
ImpactAdmin session token exfiltrated or privileged actions triggered
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 | Admin must open the changelog viewer (MarkdownEditor or MarkdownModal component) for a plugin or theme whose changelog has been crafted by the attacker to contain a javascript: URI scheme embedded in Markdown link syntax. The attacker does not need credentials on the victim Grav site, but the malicious package must be present in the admin panel's package listing - either installed, queued for install, or browsed from a repository the site owner has configured. Exploitation is therefore limited to scenarios where an admin actively views a changelog for attacker-controlled content. Sites that only install packages from trusted, reviewed sources, or that have disabled the Admin plugin's package management features, are not practically reachable via this vector. |
| Impact | The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N, score 5.1) accurately captures the attack profile: no privileges are needed on the victim site because the attack is delivered via a third-party package's changelog metadata, but active user interaction (admin viewing the changelog) is required, and direct impact on the vulnerable system itself is nil - all impact falls on the subsequent system (the admin browser session: SC:L, SI:L). There is no CISA KEV listing and no public proof-of-concept identified, and EPSS data is not provided. Real-world exploitation requires an admin to install or preview a package controlled by the attacker, which limits opportunistic mass exploitation compared to a fully pre-auth network-accessible attack. The 'RCE' tag in the input metadata is mislabeled - this is client-side JavaScript execution (XSS) in the admin's browser, not server-side remote code execution. Depending on the admin session's capabilities, the practical consequence could include credential theft, CSRF-like admin actions, or plugin manipulation, but these are secondary effects of the XSS, not direct RCE. |
| Exploit ScenarioDerived | An attacker publishes a malicious Grav plugin or theme to a public registry (or distributes it directly) with a changelog entry containing a javascript: URI link rendered as Markdown. When a Grav site administrator browses to the plugin/theme listing or opens the MarkdownModal to inspect the package, the unsanitized marked.parse() output is injected via {@html}, causing the attacker's script to execute in the admin's authenticated browser session and potentially exfiltrating session cookies or issuing admin API calls. No public proof-of-concept code has been identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 04, 2026
Stored XSS in Grav Admin before 2.0.20 allows arbitrary JavaScript to execute within authenticated admin browser sessions by embedding malicious javascript: URI schemes inside plugin or theme changelogs. The root cause is that MarkdownEditor and MarkdownModal Svelte components pass marked.parse() output directly into the DOM via Svelte's {@html} directive without sanitization, meaning any attacker who can publish or distribute a crafted Grav package can trigger JavaScript execution when an admin views that package's changelog. No public exploit code or CISA KEV listing exists at time of analysis, and the CVSS 4.0 score of 5.1 (Medium) reflects the constrained impact on subsequent systems only.
RemediationAI
Upgrade the Grav Admin plugin to version 2.0.20 or later; this is the vendor-released patch per GHSA-752r-88j4-vxm3. Until upgrading is feasible, administrators should avoid installing or previewing plugins and themes from untrusted third-party sources through the Admin panel, since the injection point is the changelog viewer for external packages. As a compensating control, organizations can disable Admin panel access from untrusted networks (restrict the admin path to internal IP ranges or VPN), which reduces the exposure window but does not eliminate the flaw if malicious packages have already been introduced. Sanitizing marked.js output with a library such as DOMPurify before passing it to Svelte's {@html} is the correct long-term code-level fix, as confirmed by the upstream advisory. No adverse functional side effects are documented for the 2.0.20 upgrade.
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 is a flat-file PHP CMS. Its Admin plugin exposes a Svelte-based frontend in which two components - MarkdownEditor and MarkdownModal - render changelog content from plugins and themes. These components use the marked.js library (marked.parse()) to convert Markdown to HTML, then bind the result into the live DOM using Svelte's {@html} directive. The {@html} directive performs no automatic escaping, so any HTML returned by marked.parse() is injected verbatim. Because marked.js does not strip javascript: URI schemes from Markdown link syntax by default, a malicious changelog entry such as [click here](javascript:alert(document.cookie)) survives parsing and renders as a live anchor. CWE-79 (Improper Neutralization of Input During Web Page Generation - XSS) precisely describes this failure: untrusted input (changelog text from a third-party package) reaches a rendering context (Svelte DOM injection) without neutralization. The affected CPE is cpe:2.3:a:getgrav:grav:*:*:*:*:*:*:*:* covering all Grav releases before the 2.0.20 fix.
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:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
Attacker delivers payload via third-party package (no auth on target, PR:N); admin must view changelog (UI:R); scope changes to browser session (S:C); limited confidentiality and integrity impact only.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
1DescriptionCVE.org
Grav Admin before 2.0.20 fails to sanitize output from marked.parse() before injecting it into the DOM via Svelte's {@html} directive in MarkdownEditor and MarkdownModal components. Attackers can inject javascript: URI schemes in plugin or theme changelogs to execute arbitrary code in authenticated admin sessions without requiring site access.
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-71024
GHSA-pqmm-93p6-x64h
NVD
CVE.org
EPSS
Exploit-DB