
Keycloak 26.8.1 Medio 6.6 Residuo di autenticazione remota autenticata. Un amministratore dell'help desk con manage-users può assegnare a se stesso un composito predefinito di manage-realm e poi leggere l'intero documento del realm. Richiede che quel composito esista già. PoC su loopback.
Un account help-desk che dovrebbe solo reimpostare password e creare utenti può elevare i propri privilegi. Chi possiede il ruolo manage-users di Keycloak trova nel realm un titolo di lavoro lasciato in eredità (un ruolo composito che include silenziosamente manage-realm), assegna quel titolo al proprio account e poi legge l'intero documento del realm che gli era stato nascosto una richiesta prima. Non può creare quel composito. Un vero amministratore del realm deve averlo costruito prima. Questo è il fratello del role-mapping di CVE-2026-94000, che ha chiuso lo stesso trucco sull'adesione ai gruppi.
Classe: Residuo di autenticazione
Raggiungibilità: Remota (manage-users autenticato)
Keycloak 26.8.1 (24ed1dad) - Red Hat
| ID | nessuna CVE al momento |
| Classe | Residuo di autenticazione |
| Raggiungibilità | Remota (Admin REST autenticato; richiede manage-users più un composito preesistente) |
| CWE | CWE-269 / CWE-266 |
| CVSS | Medio: 6.6 CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | Keycloak |
| Affetto | 26.8.1 (24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b); immagine quay.io/keycloak/keycloak:26.8.1 |
| Auth | admin delegato con realm-management / manage-users. FGAP v2 è il valutatore predefinito. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18082 |
Richiede un account Keycloak esistente che possieda già manage-users, e un ruolo di realm o di client il cui nome non sia un ruolo amministrativo e i cui compositi includano manage-realm o realm-admin. Non richiede manage-realm sul token. Non può creare quel composito. L'assegnazione diretta di un ruolo chiamato manage-realm / realm-admin viene ancora rifiutata.
| Privilegio | Metodo / sink | Ricognizione / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
| Mappare un composito non amministrativo su se stessi | POST /admin/realms/{realm}/users/{id}/role-mappings/realm con l'id e il nome del composito | Integrità (concessione di ruolo) | Provato in lab. HTTP 204. Witness kcr02m7q4 |
| Stessa concessione su un ruolo di client | POST /admin/realms/{realm}/users/{id}/role-mappings/clients/{client} | Integrità | Sorgente. Stesso canMapRole in ClientRoleMappingsResource.java:184 |
| Leggere l'intero documento del realm con lo stesso token di accesso | GET /admin/realms/{realm} dopo la mappatura | Ricognizione | Provato in lab. Prima: HTTP 200 parziale (nessun attributo, nessun accessTokenLifespan). Dopo: HTTP 200 completo, attributo impiantato presente |
Usare manage-realm annidato nelle successive chiamate admin | UserAdapter.hasRole percorre i compositi; KeycloakIdentity.hasClientRole si fida del modello utente | Integrità | Dedotto dal sorgente. L'oracolo del lab è il GET completo del realm |
realm-admin annidato quando è quello il composito | Stessa percorrenza | Integrità | Dedotto. Il lab ha usato manage-realm |
| Controllo negativo | Un secondo utente manage-users che non mappa il composito | n/d | Provato in lab. Il GET di controllo resta parziale |
Resta chiuso su questo residuo
| Asse | Metodo / sink | Perché è chiuso |
|---|---|---|
| Integrità | Mappatura diretta di manage-realm / realm-admin / altri AdminRoles.ALL_ROLES | RolePermissionsV2.isRealmAdminRole rifiuta ancora |
| Integrità | Creare il composito che include un ruolo amministrativo | canMapComposite chiama ancora checkAdminRoles |
| Integrità | Aderire a un gruppo il cui composito include un ruolo amministrativo | CVE-2026-94000 percorre i compositi in GroupUtils.checkAdminGroupRoles |
| Integrità | Creare un utente già in quel gruppo | Stessa percorrenza su UsersResource.createUser |
| Ricognizione | Admin REST anonimo | Richiede un token manage-users |
| Integrità | RCE sull'host, realm-admin che crea realm-admin | Fuori classe |
GET /admin/realms/{realm} non restituisce HTTP 403 per manage-users. Quel ruolo è esso stesso un ruolo admin, quindi il server restituisce 200 con un documento parziale. Ciò che rimane sono i campi che compaiono solo dopo che il composite è mappato.
Ho fissato Keycloak 26.8.1. Le autorizzazioni admin a grana fine v2 sono attive per impostazione predefinita. RolePermissionsV2.canMapRole restituisce true per ogni ruolo che fallisce isRealmAdminRole e non attraversa mai i composite. La correzione di CVE-2026-94000 li attraversa solo sul percorso dei gruppi.
Vicoli ciechi già registrati: trattare isRealmAdminRole v1 come il controllo effettivo (v2 lo sovrascrive); aspettarsi HTTP 403 sulla GET del realm prima della concessione (il risultato effettivo è un 200 parziale); ri-segnalare CVE-2026-94000 (join di gruppo, già chiuso); una reverse shell. Teatro.
python3 keycloak-manage-users-composite-Abraxas-Labs.py
o:
cd lab
./run.sh
Prendi di mira solo http://127.0.0.1:18082. Immagine quay.io/keycloak/keycloak:26.8.1. Docker richiesto. Il launcher esegue chdir in lab/ ed esegue 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
Attraversare i compositi in RolePermissionsV2.canMapRole nello stesso modo in cui GroupUtils.checkAdminGroupRoles già fa per l'adesione al gruppo. Un ruolo che include manage-realm o realm-admin è un ruolo amministratore anche quando il suo nome non lo è.
24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b)RolePermissionsV2.canMapRole (RolePermissionsV2.java:59-61)RoleMapperResource.addRealmRoleMappings (RoleMapperResource.java:289-290)GNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio loopback. Nessuna garanzia.
Abraxas Labs [email protected]
Si prega di attribuire la CVE ad Abraxas Labs.