CVE-2026-75837
Grav before 2.0.14 Privilege Escalation via Group Access Field
Grav before 2.0.14 fails to guard the access field in the core group blueprint with the required security@: admin.super restriction. A delegated admin.users operator can save a group with access[admin][super]=true to escalate to super-admin, gaining scheduler and Twig evaluation capabilities.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.3
Grav before 2.0.14 Privilege Escalation via Group Access Field
Grav before 2.0.14 fails to guard the access field in the core group blueprint with the required security@: admin.super restriction. A delegated admin.users operator can save a group with access[admin][super]=true to escalate to super-admin, gaining scheduler and Twig evaluation capabilities.
- Record
CVE-2026-75837- CVSS 4.0
- 9.3 Critical
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 - CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-269
- Updated
- 2026-11-02
EUVDEUVD-2026-60601
9.3
Grav before 2.0.14 fails to guard the access field in the core group blueprint with the required security@: admin.super restriction. A delegated admin.users operator can save a group with access[admin][super]=true to escalate to super-admin, gaining scheduler and Twig evaluation capabilities.
- Record
EUVD-2026-60601- CVSS 4.0
- 9.3 Critical
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 - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-m97h-2qj3-5773
9.3
Duplicate Advisory: Grav: Missing admin.super guard on core group blueprint access field allows admin.users operator to escalate to super-admin
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-xhfv-7758-r9hx. This link is maintained to preserve external references.
Original Description
Grav before 2.0.14 fails to guard the access field in the core group blueprint with the required security@: admin.super restriction. A delegated admin.users operator can save a group with access[admin][super]=true to escalate to super-admin, gaining scheduler and Twig evaluation capabilities.
- Record
GHSA-m97h-2qj3-5773- CVSS 4.0
- 9.3 Critical
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 - CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-269
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-xhfv-7758-r9hx
7.7
Grav: Missing admin.super guard on core group blueprint access field allows admin.users operator to escalate to super-admin
Summary
The core Flex group blueprint system/blueprints/user/group.yaml (access field, lines 48-55) omits the security@: admin.super field guard that its sibling account blueprint carries (account.yaml:131/138/150, added by the CVE-2026-42613 fix). A delegated non-super operator holding admin.users.update can therefore save a group whose access map contains admin.super: true, which UserGroupObject::authorize then grants to every member of that group, a full privilege escalation to super-admin (scheduler/cron RCE, Twig eval). This is a distinct file, sink, and fix from all four related advisories.
Root Cause
The CVE-2026-42613 fix protected the account access/groups fields with a blueprint-level security@: admin.super gate, which Blueprint::dynamicSecurity() (system/src/Grav/Common/Data/Blueprint.php:644-662) uses to mark a field validate.ignore=true for non-super users so BlueprintSchema::filterArray() (BlueprintSchema.php:263-311) drops it. The functionally-identical group access field, a permission map granted to every member of the group, is declared in system/blueprints/user/group.yaml:48-55 with check_authorize: false and NO security@ guard. check_authorize has ZERO PHP enforcement (grep -rn check_authorize across the repo returns 0 PHP consumers; only two YAML blueprints reference it), so security@ is the sole real control. Because the group access field lacks security@, dynamicSecurity never flags it, filterArray retains it, and Validation::filterArray (type: array, value_type: bool) passes the nested admin.super:true leaf through. The core save path (FlexObject::update() then Framework/Flex/FlexObject.php:683 $blueprint->filter($data,true,true) then save()) persists it to user://config/groups.yaml.
Impact
A delegated admin.users operator (strictly below admin.super) escalates to super-admin, gaining the admin panel, the scheduler (cron to RCE) and Twig evaluation. Full read/write/DoS (C:H/I:H/A:H). Even absent self-escalation, arbitrary rewrite of ANY group's ACL is itself a full escalation primitive.
Proof of Concept
As a non-super admin.users operator who is a member of group ops:
POST /admin/accounts/groups/ops (or groups.json task:save)
data[access][admin][super]=1
user/config/groups.yaml gains ops: { access: { admin: { super: true } } }, so the operator is super-admin on the next request.
Attack Chain
- Entry: authenticated delegated admin (
admin.users.update, noadmin.super) POSTs the group-edit form for a group they belong to (or a new group), bodyaccess[admin][super]=true. Guard:FlexAuthorizeTrait::isAuthorizedActiontoadmin.users.update. Bypass proof:user-groups.yamlexposes groups atadmin.users:crudl; operator legitimately holds update. - Check (field guard):
Blueprint::dynamicSecuritymarksvalidate.ignoreonly forsecurity@fields. Guard: none on group access (nosecurity@). Bypass proof:group.yaml:48-55has nosecurity@;git log -S 'security@' -- system/blueprints/user/group.yamlis empty. - Filter:
BlueprintSchema::filterArrayretains the non-ignored field;Validation::filterArray(value_type: bool) passesadmin.super:truethrough. Bypass proof: field not flagged ignore/disabled; nested bool leaf preserved. - Sink (persist):
FlexObject::updatethenfilterthensavewrites touser://config/groups.yaml. Guard: none. Bypass proof: value already survived steps 2/3; storage performs no ACL filtering. - Impact: any member request triggers
UserGroupObject::authorize('admin.super')(.../UserGroups/UserGroupObject.php:75) returning true, so the member is super-admin, enabling scheduler/Twig RCE.
Bypass Evidence
system/blueprints/user/group.yaml:48-55: access block withcheck_authorize: false, nosecurity@(confirmed live on tag 2.0.12).git log -S 'security@' -- system/blueprints/user/group.yamlis empty (guard never existed; a…
- Record
GHSA-xhfv-7758-r9hx- CVSS 4.0
- 7.7 High
CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-269, CWE-862
- Updated
- 2026-11-02
NVD
9.3
Grav before 2.0.14 fails to guard the access field in the core group blueprint with the required security@: admin.super restriction. A delegated admin.users operator can save a group with access[admin][super]=true to escalate to super-admin, gaining scheduler and Twig evaluation capabilities.
- Record
CVE-2026-75837- CVSS 4.0
- 9.3 Critical
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 - CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-269
- Updated
- 2026-11-02
OSV
9.3
Grav before 2.0.14 Privilege Escalation via Group Access Field
Grav before 2.0.14 fails to guard the access field in the core group blueprint with the required security@: admin.super restriction. A delegated admin.users operator can save a group with access[admin][super]=true to escalate to super-admin, gaining scheduler and Twig evaluation capabilities.
- Record
CVE-2026-75837- CVSS 4.0
- 9.3 Critical
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 - Weakness
- CWE-269
- Updated
- 2026-11-02
OSVGHSA-m97h-2qj3-5773
9.3
Duplicate Advisory: Grav: Missing admin.super guard on core group blueprint access field allows admin.users operator to escalate to super-admin
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-xhfv-7758-r9hx. This link is maintained to preserve external references.
Original Description
Grav before 2.0.14 fails to guard the access field in the core group blueprint with the required security@: admin.super restriction. A delegated admin.users operator can save a group with access[admin][super]=true to escalate to super-admin, gaining scheduler and Twig evaluation capabilities.
- Record
GHSA-m97h-2qj3-5773- CVSS 4.0
- 9.3 Critical
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 - CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-269
- Updated
- 2026-11-02
OSVGHSA-xhfv-7758-r9hx
7.7
Grav: Missing admin.super guard on core group blueprint access field allows admin.users operator to escalate to super-admin
Summary
The core Flex group blueprint system/blueprints/user/group.yaml (access field, lines 48-55) omits the security@: admin.super field guard that its sibling account blueprint carries (account.yaml:131/138/150, added by the CVE-2026-42613 fix). A delegated non-super operator holding admin.users.update can therefore save a group whose access map contains admin.super: true, which UserGroupObject::authorize then grants to every member of that group, a full privilege escalation to super-admin (scheduler/cron RCE, Twig eval). This is a distinct file, sink, and fix from all four related advisories.
Root Cause
The CVE-2026-42613 fix protected the account access/groups fields with a blueprint-level security@: admin.super gate, which Blueprint::dynamicSecurity() (system/src/Grav/Common/Data/Blueprint.php:644-662) uses to mark a field validate.ignore=true for non-super users so BlueprintSchema::filterArray() (BlueprintSchema.php:263-311) drops it. The functionally-identical group access field, a permission map granted to every member of the group, is declared in system/blueprints/user/group.yaml:48-55 with check_authorize: false and NO security@ guard. check_authorize has ZERO PHP enforcement (grep -rn check_authorize across the repo returns 0 PHP consumers; only two YAML blueprints reference it), so security@ is the sole real control. Because the group access field lacks security@, dynamicSecurity never flags it, filterArray retains it, and Validation::filterArray (type: array, value_type: bool) passes the nested admin.super:true leaf through. The core save path (FlexObject::update() then Framework/Flex/FlexObject.php:683 $blueprint->filter($data,true,true) then save()) persists it to user://config/groups.yaml.
Impact
A delegated admin.users operator (strictly below admin.super) escalates to super-admin, gaining the admin panel, the scheduler (cron to RCE) and Twig evaluation. Full read/write/DoS (C:H/I:H/A:H). Even absent self-escalation, arbitrary rewrite of ANY group's ACL is itself a full escalation primitive.
Proof of Concept
As a non-super admin.users operator who is a member of group ops:
POST /admin/accounts/groups/ops (or groups.json task:save)
data[access][admin][super]=1
user/config/groups.yaml gains ops: { access: { admin: { super: true } } }, so the operator is super-admin on the next request.
Attack Chain
- Entry: authenticated delegated admin (
admin.users.update, noadmin.super) POSTs the group-edit form for a group they belong to (or a new group), bodyaccess[admin][super]=true. Guard:FlexAuthorizeTrait::isAuthorizedActiontoadmin.users.update. Bypass proof:user-groups.yamlexposes groups atadmin.users:crudl; operator legitimately holds update. - Check (field guard):
Blueprint::dynamicSecuritymarksvalidate.ignoreonly forsecurity@fields. Guard: none on group access (nosecurity@). Bypass proof:group.yaml:48-55has nosecurity@;git log -S 'security@' -- system/blueprints/user/group.yamlis empty. - Filter:
BlueprintSchema::filterArrayretains the non-ignored field;Validation::filterArray(value_type: bool) passesadmin.super:truethrough. Bypass proof: field not flagged ignore/disabled; nested bool leaf preserved. - Sink (persist):
FlexObject::updatethenfilterthensavewrites touser://config/groups.yaml. Guard: none. Bypass proof: value already survived steps 2/3; storage performs no ACL filtering. - Impact: any member request triggers
UserGroupObject::authorize('admin.super')(.../UserGroups/UserGroupObject.php:75) returning true, so the member is super-admin, enabling scheduler/Twig RCE.
Bypass Evidence
system/blueprints/user/group.yaml:48-55: access block withcheck_authorize: false, nosecurity@(confirmed live on tag 2.0.12).git log -S 'security@' -- system/blueprints/user/group.yamlis empty (guard never existed; a…
- Record
GHSA-xhfv-7758-r9hx- CVSS 4.0
- 7.7 High
CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-269, CWE-862
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
getgrav/gravPackagist |
before 2.0.14 | 2.0.14 |
getgrav/gravPackagist |
before 2.0.14, plus listed versions 0.8.00.9.00.9.10.9.100.9.11 Show 45 moreShow less0.9.120.9.130.9.140.9.150.9.160.9.170.9.180.9.190.9.20.9.200.9.210.9.220.9.230.9.240.9.250.9.260.9.270.9.280.9.290.9.30.9.300.9.310.9.320.9.330.9.340.9.350.9.360.9.370.9.380.9.390.9.40.9.400.9.410.9.420.9.430.9.440.9.450.9.50.9.60.9.70.9.80.9.91.0.01.0.0-rc.11.0.0-rc.2 |
2.0.14 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-75837 is a critical vulnerability (CVSS 9.3) in Getgrav Grav, published August 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.49%, the 42nd percentile. Fixed in getgrav/grav 2.0.14.
References
github.com/getgrav/grav/security/advisories/GHSA-xhfv-7758-r9hx
vulncheck.com/advisories/grav-before-privilege-escalation-via-group-access-field
nvd.nist.gov/vuln/detail/CVE-2026-75837
github.com/advisories/GHSA-m97h-2qj3-5773
github.com/advisories/GHSA-xhfv-7758-r9hx
github.com/CVEProject/cvelistV5/tree/main/cves/2026/75xxx/CVE-2026-75837.json
github.com/getgrav/grav
Left out here: 298 versions and the rest of 2 source descriptions. The JSON record has them.