Skip to main content

Grav Admin EUVDEUVD-2026-71024

| CVE-2026-85601 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-09-04 VulnCheck GHSA-pqmm-93p6-x64h
5.1
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Publish malicious plugin/theme with crafted changelog
  2. Delivery
    Admin browses package in Grav Admin panel
  3. Exploit
    marked.parse() renders javascript: URI unsanitized
  4. Execution
    Svelte {@html} injects output into DOM
  5. Persist
    Attacker JavaScript executes in admin session
  6. Impact
    Admin 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

grav 0 <2.0.20

Affected Packages

euvd grav fix: 2.0.20

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

Vendor (VulnCheck) PRIMARY 5.1 MEDIUM
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
vuln.today AI 6.1 MEDIUM

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.

3.1 AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
Active
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
Low
Subsequent system: Integrity
Low
Subsequent system: Availability
None

Lifecycle Timeline

1
Patch available
Sep 04, 2026 - 13:02 EUVD

DescriptionCVE.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

EPSS Score
0.2%
Top 94% exploitable
Prevalence
Low
niche flat-file CMS, limited enterprise footprint
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

26
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +26
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

More in Grav

View all
CVE-2025-66294 HIGH POC
8.7 Dec 01

Server-side template injection (SSTI) in Grav (getgrav/grav) prior to 1.8.0-beta.27 allows an authenticated attacker hol

CVE-2025-66301 HIGH POC
8.6 Dec 01

Broken access control in Grav CMS (CWE-285) before 1.8.0-beta.27 lets an authenticated editor-level user escalate their

CVE-2025-50286 HIGH POC
8.1 Aug 06

A Remote Code Execution (RCE) vulnerability in Grav CMS v1.7.48 allows an authenticated admin to upload a malicious plug

CVE-2024-34082 CRITICAL POC
9.9 May 15

Grav is a file-based Web platform. Rated critical severity (CVSS 9.9), this vulnerability is remotely exploitable, low a

CVE-2021-47812 CRITICAL POC
9.8 Jan 16

GravCMS 1.10.7 allows unauthenticated remote attackers to write arbitrary YAML configuration files, leading to full serv

CVE-2026-65008 CRITICAL POC
9.3 Jul 21

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

CVE-2026-75827 CRITICAL POC
9.3 Aug 18

Remote code execution in Grav CMS before 2.0.15 allows attackers holding page-edit or blueprint-config privileges to wri

CVE-2026-75837 CRITICAL POC
9.3 Aug 18

Vertical privilege escalation in Grav CMS before 2.0.14 lets a delegated administrator holding only the admin.users perm

CVE-2026-75828 CRITICAL POC
9.3 Aug 18

Stored cross-site scripting in Grav CMS before 2.0.15 lets authenticated editors smuggle JavaScript event handlers past

CVE-2025-66844 CRITICAL POC
9.1 Dec 15

Server-side request forgery (SSRF) in Grav CMS versions prior to 1.7.49.5 allows remote authenticated attackers to make

CVE-2025-66299 HIGH POC
8.8 Dec 01

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

CVE-2026-72819 HIGH POC
8.7 Aug 14

Remote code execution in Grav CMS before 2.0.13 allows authenticated low-privilege users to plant and execute arbitrary

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy