Description
Grav API Plugin (Composer package getgrav/grav-plugin-api) before 1.0.10 fails to properly validate the slug field in the POST /pages/{route}/move endpoint. PagesController::move() sanitizes the slug only with ltrim($body['slug'], '.'), which strips leading periods but does not neutralize '/' or '..' segments. An authenticated API caller with the api.pages.write permission can supply path traversal sequences (e.g., 01.home/../../../pwned) to move an entire page directory (content and media) to an arbitrary writable location outside user/pages/, including outside the Grav installation.
Published: 2026-07-23
Score: 7.1 High
EPSS: < 1% Very Low
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

The Grav API Plugin, before version 1.0.10, does not properly validate the slug parameter used in the POST /pages/{route}/move endpoint. The plugin only removes leading periods, leaving directory separators and parent‑directory references untouched. An authenticated API caller with the api.pages.write permission can therefore supply a slug containing path traversal sequences, such as 01.home/../../../pwned, that cause the server to move an entire page directory—including its content and media files—to an arbitrary writable location outside the standard user/pages directory. This allows an attacker to relocate files to unexpected places, potentially leading to unauthorized file modification, content loss, or placement of files in directories that may be served by the web server, thereby compromising site integrity.

Affected Systems

The vulnerability affects any deployment of the Grav CMS that includes the Grav API Plugin (Composer package getgrav/grav-plugin-api) prior to version 1.0.10. The vendor is getgrav, and the product name is Grav, with the relevant component being the API plugin that exposes the move operation.

Risk and Exploitability

The CVSS score of 7.1 indicates a moderate‑to‑high severity. The EPSS score of less than 1% suggests a low probability of exploitation at the time of this analysis, and the vulnerability is not listed in the CISA KEV catalog. Exploitation requires an authenticated caller who has the api.pages.write permission and who sends a POST request to /pages/{route}/move. The likely attack vector is the exposed API endpoint; the attack therefore is limited to users who can authenticate to the Grav API and who have write permissions. The impact is primarily unauthorized file manipulation and potential data loss, rather than direct code execution, as the description does not indicate execution of arbitrary code.

Generated by OpenCVE AI on August 3, 2026 at 21:37 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade Grav to version 1.0.10 or later to apply the vendor patch that properly sanitizes slugs
  • Discontinue or uninstall the Grav API Plugin if an upgrade cannot be performed immediately
  • Restrict or revoke the api.pages.write permission for all users, or block the /pages/{route}/move API endpoint to prevent exploitation

Generated by OpenCVE AI on August 3, 2026 at 21:37 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Thu, 23 Jul 2026 14:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Thu, 23 Jul 2026 12:15:00 +0000

Type Values Removed Values Added
Description Grav API Plugin (Composer package getgrav/grav-plugin-api) before 1.0.10 fails to properly validate the slug field in the POST /pages/{route}/move endpoint. PagesController::move() sanitizes the slug only with ltrim($body['slug'], '.'), which strips leading periods but does not neutralize '/' or '..' segments. An authenticated API caller with the api.pages.write permission can supply path traversal sequences (e.g., 01.home/../../../pwned) to move an entire page directory (content and media) to an arbitrary writable location outside user/pages/, including outside the Grav installation.
Title Grav API Plugin before 1.0.10 Path Traversal via move
First Time appeared Getgrav
Getgrav grav
Weaknesses CWE-73
CPEs cpe:2.3:a:getgrav:grav:*:*:*:*:*:*:*:*
Vendors & Products Getgrav
Getgrav grav
References
Metrics cvssV3_1

{'score': 7.1, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L'}

cvssV4_0

{'score': 7.1, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N'}


cve-icon MITRE

Status: PUBLISHED

Assigner: VulnCheck

Published:

Updated: 2026-07-24T21:35:23.057Z

Reserved: 2026-07-23T11:03:13.092Z

Link: CVE-2026-65896

cve-icon Vulnrichment

Updated: 2026-07-23T13:17:18.744Z

cve-icon NVD

Status : Deferred

Published: 2026-07-23T12:18:48.050

Modified: 2026-07-23T15:13:11.420

Link: CVE-2026-65896

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-03T21:45:03Z

Weaknesses
  • CWE-73

    External Control of File Name or Path