FGAP-v2 activation path pinned (26.7.3)
- Condition
- FGAP-v2 RBAC advisory batch (CVE-2026-14613/16105/16108/…) — unblock the reproductions by pinning how 26.7.3 turns FGAP v2 on
Question
2026-08-31-fgap-v2-token-exchange left this open: the pre-26.7 procedure
(adminFineGrainedAuthz realm field + GET /admin/realms/{realm}/fine-grained-permissions)
is dead in 26.7.3 — the field is unrecognized and the endpoint 404s — while the
ADMIN_FINE_GRAINED_AUTHZ_V2 feature flag reports type=DEFAULT, enabled=true.
How does 26.7.3 actually turn FGAP v2 on, and where is the permission catalog?
Answer (pinned from bytecode + verified live)
FGAP v2 is a DEFAULT feature and activates per-realm with the classic
adminPermissionsEnabled flag. No --features gate, no adminFineGrainedAuthz
field.
Bytecode path (jars extracted from quay.io/keycloak/keycloak:26.7.3):
org.keycloak.services.resources.admin.fgap.AdminPermissions.evaluator(...)branches onProfile.isFeatureEnabled(ADMIN_FINE_GRAINED_AUTHZ_V2)— v2 selectsMgmtPermissionsV2, v1 selectsMgmtPermissions. The flag istype=DEFAULTin 26.7.3, so v2 is the only line in play.org.keycloak.authorization.fgap.AdminPermissionsSchema.init(session, realm)(spi-private) runs when the realm has admin permissions enabled. It creates a client with clientIdadmin-permissions(openid-connect), sets it as the realm'sadminPermissionsClient, creates its authorization resource server, and seeds the schema:- resources = resource types:
Users,Groups,Roles,Clients,Organizations(Realmsis handled cross-realm); - scopes = the permission catalogue.
- resources = resource types:
Live verification (26.7.3, Postgres, Compose lab)
POST /admin/realms {"realm":"fgap","adminPermissionsEnabled":true} → then:
GET /admin/realms/fgap adminPermissionsEnabled: true
adminPermissionsClient: {clientId: "admin-permissions"}
"adminFineGrainedAuthz" NOT in representation
GET /admin/realms/fgap/clients -> includes "admin-permissions" (authzServicesEnabled)
GET .../authz/resource-server/resource -> Clients, Groups, Organizations, Roles, Users
GET .../authz/resource-server/scope -> 16 permission scopes (below)
GET /admin/realms/fgap/fine-grained-permissions -> 404
GET /admin/realms/fgap/admin-fine-grained-permissions -> 404
The v2 permission catalogue (scopes on the admin-permissions client)
view, manage, manage-members, view-members, manage-membership,
manage-membership-of-members, manage-group-membership, map-roles,
map-roles-client-scope, map-roles-composite, map-role,
map-role-client-scope, map-role-composite, impersonate,
impersonate-members, reset-password.
What changed vs pre-26.7 (migration-surfacing)
| Thing | pre-26.7 (v1) | 26.7.3 (v2) |
|---|---|---|
| Feature gate | --features=admin-fine-grained-authz (preview) | ADMIN_FINE_GRAINED_AUTHZ_V2, type=DEFAULT |
| Realm activation | adminFineGrainedAuthz field | adminPermissionsEnabled flag |
| Permissions client | realm-management (managed) | admin-permissions (new, schema-seeded) |
| Permission catalogue | GET .../fine-grained-permissions | resources+scopes on admin-permissions's resource server |
| Grant a permission | v1 policy API | standard authz scope-permission API on admin-permissions |
How to audit / drive FGAP v2 in 26.7.3 (the new procedure)
PUT/POST /admin/realms/{realm}with{"adminPermissionsEnabled": true}.- Read
adminPermissionsClientfrom the realm representation to get theadmin-permissionsclient id. - Catalogue:
GET /admin/realms/{realm}/clients/{id}/authz/resource-server/resource(resource types) and.../scope(permissions). - Grant a permission to a role/group: create a scope-based permission policy on
the
admin-permissionsclient (.../authz/resource-server/permission/scope), assigning the role/group policy — the standard authorization-services API.
What this unblocks
The FGAP-v2 RBAC CVE reproductions no longer need the dead v1 activation:
- role-groups bypass — CVE-2026-14613
- composite-endpoint authz — CVE-2026-16105
- default-group disclosure — CVE-2026-16108
Each can now be set up by (a) enabling adminPermissionsEnabled, (b) building the
role/group + scope-permission on admin-permissions, (c) exercising the admin
endpoint under test. Still deferred: token-exchange CVEs (CVE-2026-18215/18214,
external IdP) and CVE-2026-79652 (jwt-bearer consentRequired).
Verification
| Claim | Evidence |
|---|---|
| v2 is the active line, DEFAULT feature | AdminPermissions bytecode + serverinfo flag enabled=true ☑ |
Activation is adminPermissionsEnabled | live realm rep + admin-permissions client created ☑ |
Catalogue = resources+scopes on admin-permissions | live resource (5 types) + scope (16) responses ☑ |
| v1 surface removed | adminFineGrainedAuthz absent; both catalog endpoints 404 ☑ |