Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
keycloak-manage-users-composite — Keycloak 26.8.1 Medium 6.6 Remote authenticated auth leftover. A help-desk admin with manage-users can pin a pre-built composite of manage-realm onto himself and then read the full realm document. Needs that composite to already exist. Loopback PoC. | Kitploit
Tools/GitHubGitHub/abraxas/keycloak-manage-users-composite
Authentication & AuthorizationPrivilege EscalationVulnerability AnalysisExploitationWeb Application ExploitationIdentity & Access Management (IAM)Labs & Practice

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
GitHub
abraxas/keycloak-manage-users-composite

keycloak-manage-users-composite

Keycloak 26.8.1 Medium 6.6 Remote authenticated auth leftover. A help-desk admin with manage-users can pin a pre-built composite of manage-realm onto himself and then read the full realm document. Needs that composite to already exist. Loopback PoC.

View Repository
21 day agoNot yet reviewed

Abraxas Labs - keycloak-manage-users-composite

keycloak-manage-users-composite

A help-desk account that is only supposed to reset passwords and create users can promote itself. Someone with Keycloak's manage-users role finds a leftover job-title in the realm (a composite role that quietly includes manage-realm), pins that title on their own account, and then reads the full realm document that was hidden from them a request earlier. They cannot mint that composite. A real realm administrator has to have built it first. This is the role-mapping sibling of CVE-2026-94000, which closed the same trick on group join.

Class: Auth leftover Reach: Remote (authenticated manage-users)

Keycloak 26.8.1 (24ed1dad) - Red Hat

IDno CVE yet
ClassAuth leftover
ReachRemote (authenticated Admin REST; needs manage-users plus a pre-built composite)
CWECWE-269 / CWE-266
CVSSMedium: 6.6 CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H
ProductKeycloak
Affected26.8.1 (24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b); image quay.io/keycloak/keycloak:26.8.1
Authdelegated admin with realm-management / manage-users. FGAP v2 is the default evaluator.
LicenseGNU Affero GPL v3.0
Lab127.0.0.1:18082 only

What an attacker can do

Needs an existing Keycloak account that already holds manage-users, and a realm or client role whose own name is not an admin role and whose composites include manage-realm or realm-admin. Does not need manage-realm on the token. Cannot create that composite. Direct assignment of a role named manage-realm / realm-admin is still refused.

PrivilegeMethod / sinkRecon / integrity / availabilityLab-proven or inferred
Map a non-admin composite onto selfPOST /admin/realms/{realm}/users/{id}/role-mappings/realm with the composite id and nameIntegrity (role grant)Lab-proven. HTTP 204. Witness kcr02m7q4
Same grant on a client rolePOST /admin/realms/{realm}/users/{id}/role-mappings/clients/{client}IntegritySource. Same canMapRole at ClientRoleMappingsResource.java:184
Read the full realm document on the same access tokenGET /admin/realms/{realm} after the mappingReconLab-proven. Before: HTTP 200 partial (no attributes, no accessTokenLifespan). After: HTTP 200 full, planted attribute present
Use nested manage-realm on later admin callsUserAdapter.hasRole walks composites; KeycloakIdentity.hasClientRole trusts the user modelIntegrityInferred from source. Lab oracle is the full realm GET
Nested realm-admin when that is the compositeSame walkIntegrityInferred. Lab used manage-realm
Negative controlA second manage-users user who does not map the compositen/aLab-proven. Control GET stays partial

Stays closed on this leftover

AxisMethod / sinkWhy it is closed
IntegrityDirect map of manage-realm / realm-admin / other AdminRoles.ALL_ROLESRolePermissionsV2.isRealmAdminRole still refuses
IntegrityCreate the composite that includes an admin rolecanMapComposite still calls checkAdminRoles
IntegrityJoin a group whose composite includes an admin roleCVE-2026-94000 walks composites in GroupUtils.checkAdminGroupRoles
IntegrityCreate a user already in that groupSame walk on UsersResource.createUser
ReconAnonymous Admin RESTNeeds a manage-users token
IntegrityHost RCE, realm-admin minting realm-adminOut of class

GET /admin/realms/{realm} is not HTTP 403 for manage-users. That role is itself an admin role, so the server returns 200 with a partial document. The leftover is the fields that appear only after the composite is mapped.

How I found it

I pinned Keycloak 26.8.1. Fine-grained admin permissions v2 is on by default. RolePermissionsV2.canMapRole returns true for every role that fails isRealmAdminRole and never walks composites. The CVE-2026-94000 fix walks them only on the group path.

Wrong turns already recorded: treating v1 isRealmAdminRole as the live check (v2 overrides it); expecting HTTP 403 on the realm GET before the grant (live result is a partial 200); re-filing CVE-2026-94000 (group join, already closed); a reverse shell. Theatre.

Lab

python3 keycloak-manage-users-composite-Abraxas-Labs.py

or:

cd lab
./run.sh

Target only http://127.0.0.1:18082. Image quay.io/keycloak/keycloak:26.8.1. Docker required. The launcher chdirs into lab/ and execs run.sh.

IOC image=quay.io/keycloak/keycloak:26.8.1 label-version=26.8.1
IOC serverinfo-version=26.8.1
IOC admin-composite=manage-realm
IOC limited-direct=manage-users
IOC control-direct=manage-users
IOC before-status=200 witness=0 full=0
IOC available=sneaky-composite
IOC post-status=204
IOC after-get attempt=1 status=200 witness=1 full=1
IOC control-status=200 witness=0 full=0 same-token=1
SUCCESS KC-H02-ROLEMAP kcr02m7q4

The fix

Walk composites in RolePermissionsV2.canMapRole the way GroupUtils.checkAdminGroupRoles already does for group join. A role that includes manage-realm or realm-admin is an admin role even when its own name is not.

References

  • github.com/keycloak/keycloak tag 26.8.1 (24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b)
  • RolePermissionsV2.canMapRole (RolePermissionsV2.java:59-61)
  • RoleMapperResource.addRealmRoleMappings (RoleMapperResource.java:289-290)
  • Nearby (not this path): CVE-2026-94000 group-join composite walk
  • CWE-269 · CWE-266

License

GNU Affero GPL v3.0. See LICENSE. Loopback lab only. No warranty.

Abraxas Labs [email protected]

Please credit CVE to Abraxas Labs.

Download Tool