{"id":"CVE-2026-69088","title":"Grav CMS versions 2.0.7 through 2.0.10 fail to validate fully-qualified static method calls (Class::method) in blueprint dynamic-field directives because Blueprint::isSafeDynamicCall() only applies its dangerous-callable denylist to stri…","summary":"Grav CMS versions 2.0.7 through 2.0.10 fail to validate fully-qualified static method calls (Class::method) in blueprint dynamic-field directives because Blueprint::isSafeDynamicCall() only applies its dangerous-callable denylist to stri…","severity":"high","cvss":8.1,"cvssVector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N","cwe":["CWE-94","CWE-200","CWE-470"],"vendor":"getgrav","product":"grav","affected":["grav >= 2.0.7 < 2.0.11"],"patched":["getgrav/grav 2.0.11"],"published":"2026-08-03","updated":"2026-10-08","sourceUpdated":"2026-10-08T16:17:33.240","source":"NVD","sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-69088","references":[{"url":"https://github.com/getgrav/grav/security/advisories/GHSA-7pgq-cr25-xvc8","label":"disclosure@vulncheck.com"},{"url":"https://www.vulncheck.com/advisories/grav-cms-through-arbitrary-method-invocation-via-blueprint","label":"disclosure@vulncheck.com"},{"url":"https://github.com/getgrav/grav/security/advisories/GHSA-7pgq-cr25-xvc8","label":"134c704f-9b21-4f2e-91b3-4a467353bcc0"},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-69088"},{"url":"https://github.com/advisories/GHSA-7pgq-cr25-xvc8"},{"url":"https://github.com/getgrav/grav/commit/446d7f8f255918c8234634fe1dc2c9c77a0c673e"},{"url":"https://github.com/getgrav/grav/releases/tag/2.0.11"}],"tags":["nvd","cve.org","exploit-available","ghsa","composer"],"exploitAvailable":true,"ssvc":{"exploitation":"poc","automatable":"no","technicalImpact":"total","timestamp":"2026-08-03T14:43:14.759133Z"},"epss":0.00295,"epssPercentile":0.22065,"aliases":["GHSA-7pgq-cr25-xvc8"],"ecosystem":"composer","ingestedAt":"2026-09-17T17:23:30.685Z","slug":"CVE-2026-69088","body":"## Overview\n\nGrav CMS versions 2.0.7 through 2.0.10 fail to validate fully-qualified static method calls (Class::method) in blueprint dynamic-field directives because Blueprint::isSafeDynamicCall() only applies its dangerous-callable denylist to strings that do not contain '::'. An account with only page-editing rights (admin.pages, not super-admin or admin.pages_twig) can plant a directive in a page's form-field frontmatter that invokes an arbitrary public static PHP method with attacker-controlled arguments. Using built-in gadget methods this allows reading of any server-readable file (disclosed to anonymous visitors of the crafted page) and arbitrary creation/copying of files and directories under the web-server account. Fixed in 2.0.11.\n\n## Remediation\n\nRefer to the linked advisories for vendor-supplied fixes and affected version ranges.\n\n## Package advisory (CVE-2026-69088)\n\nAffected packages:\n\n- `getgrav/grav >= 2.0.7, <= 2.0.10`\n\nPatched in:\n\n- `getgrav/grav 2.0.11`\n\nSource: https://github.com/advisories/GHSA-7pgq-cr25-xvc8","depth":"midnight","depthScore":57,"depthScoreParts":{"impact":44.6,"likelihood":0.1,"exploitation":12,"ransomware":0},"changes":[{"seq":218142,"id":"CVE-2026-69088","ts":1791478436391,"field":"exploit_available","old":"false","new":"true"}]}