Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Editor-level authentication required per description (PR:L); scope changes (S:C) because files outside the media sandbox are disclosed to unauthenticated visitors beyond the vulnerable component.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
3DescriptionCVE.org
Grav CMS 2.0.10 contains a path traversal vulnerability in ImageMedium::watermark(), which passes its unsanitized $image argument to RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator::findResource(). Because the file:// scheme branch only lexically collapses '..' segments without a realpath/containment check, an editor authoring Markdown image syntax with traversal sequences can cause arbitrary image files outside Grav's media sandbox to be composited into a carrier image, which is then cached and served from a public, unauthenticated URL - disclosing those files to anonymous visitors.
AnalysisAI
Path traversal in Grav CMS versions before 2.0.11 enables authenticated editors to disclose arbitrary server-side files to unauthenticated visitors through the image watermark feature. The function ImageMedium::watermark() forwards unsanitized editor-controlled input to the resource locator, whose file:// scheme handler normalizes paths using only lexical '..' collapsing - never verifying containment within the media sandbox - so a crafted Markdown image directive causes the CMS to composite a traversed file into a cached image served at a public, unauthenticated URL. No public exploit has been identified at time of analysis; however, the high confidentiality impact and ease of exploitation once editor access is obtained make this a priority patch for multi-tenant Grav deployments with untrusted editors.
Technical ContextAI
The vulnerability resides in Grav CMS's media subsystem, specifically in the ImageMedium::watermark() method, which accepts an $image argument and passes it without sanitization to RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator::findResource(). The file:// scheme branch in that locator performs only lexical '..' segment collapsing - normalizing the string representation of the path without calling realpath() or verifying that the resolved path remains inside the permitted media directory. This is a textbook CWE-22 (Improper Limitation of a Pathname to a Restricted Directory) root cause: the absence of a post-normalization containment check. The affected product is catalogued as CPE cpe:2.3:a:getgrav:grav:*:*:*:*:*:*:*:* for all releases before 2.0.11. Grav is a flat-file PHP CMS where editors embed image watermark references directly in Markdown page content, making the $image parameter fully editor-controlled and trivially weaponizable once an attacker holds an editor account.
RemediationAI
Upgrade Grav CMS to version 2.0.11 or later; this release contains the path traversal fix applied across commits db8c1fcd63aaaf6d6b244bc6b4cfa5f7b96bbc7f, c569a53304cd7d95ff21bffa6fc590adcf0be83d, and b282200a65ce979377963180629babd2335212ba (https://github.com/getgrav/grav/commit/db8c1fcd63aaaf6d6b244bc6b4cfa5f7b96bbc7f), with the full advisory at https://github.com/getgrav/grav/security/advisories/GHSA-w3f4-8pj2-599w. If immediate patching is not feasible, restrict the Grav editor role exclusively to fully trusted users, which eliminates the threat from external contributors - note this is an access-control mitigation, not a code fix, and the underlying flaw persists. As a secondary compensating control, disable the watermark feature in Grav's media configuration to remove the vulnerable code path entirely; the trade-off is loss of watermark functionality for all editors until the patch is applied. Additionally, ensure the PHP and web server process runs under a dedicated OS user with tightly scoped filesystem permissions (principle of least privilege), which limits the reach of any successful traversal to only files readable by that user.
Grav is a file-based Web platform. Prior to 1.8.0-beta.27, a Server-Side Template Injection (SSTI) vulnerability exists
Grav is a file-based Web platform. Prior to 1.8.0-beta.27, due to improper authorization checks when modifying critical
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
Grav is a file-based Web platform. Prior to 1.8.0-beta.27, a user with admin panel access and permissions to create or e
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
Grav is an open-source, flat-file content management system. Rated high severity (CVSS 8.8), this vulnerability is remot
Grav is an open-source, flat-file content management system. Rated high severity (CVSS 8.8), this vulnerability is remot
Grav is an open-source, flat-file content management system. Rated high severity (CVSS 8.8), this vulnerability is remot
Grav is an open-source, flat-file content management system. Rated high severity (CVSS 8.8), this vulnerability is remot
Grav is an open-source, flat-file content management system. Rated high severity (CVSS 8.8), this vulnerability is remot
Same weakness CWE-22 – Path Traversal
View allSame technique Path Traversal
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-52282
GHSA-mmwh-j75q-gxp8