
Keycloak 26.8.1 मध्यम 6.6 रिमोट प्रमाणित प्रमाणीकरण अवशेष। manage-users वाला एक हेल्प-डेस्क एडमिन manage-realm का पहले से बना कंपोज़िट अपने ऊपर पिन कर सकता है और फिर पूरा realm दस्तावेज़ पढ़ सकता है। इसके लिए उस कंपोज़िट का पहले से मौजूद होना आवश्यक है। लूपबैक PoC।
एक हेल्प-डेस्क खाता जिसे केवल पासवर्ड रीसेट करने और उपयोगकर्ता बनाने की अनुमति है, वह स्वयं को प्रोन्नत कर सकता है। Keycloak की manage-users भूमिका वाला कोई व्यक्ति realm में एक बची हुई जॉब-टाइटल (एक composite भूमिका जो चुपचाप manage-realm को शामिल करती है) पाता है, उस टाइटल को अपने स्वयं के खाते पर लगाता है, और फिर वह पूरा realm दस्तावेज़ पढ़ता है जो एक अनुरोध पहले उससे छिपाया गया था। वे उस composite को नहीं बना सकते। एक वास्तविक realm व्यवस्थापक को पहले इसे बनाना होगा। यह CVE-2026-94000 का role-mapping सहोदर है, जिसने group join पर वही तरकीब बंद कर दी थी।
Class: Auth leftover
Reach: Remote (authenticated manage-users)
Keycloak 26.8.1 (24ed1dad) - Red Hat
| ID | अभी तक कोई CVE नहीं |
| Class | Auth leftover |
| Reach | Remote (authenticated Admin REST; manage-users के साथ-साथ एक पूर्व-निर्मित composite की आवश्यकता है) |
| CWE | CWE-269 / CWE-266 |
| CVSS | Medium: 6.6 CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Product | Keycloak |
| Affected | 26.8.1 (24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b); image quay.io/keycloak/keycloak:26.8.1 |
| Auth | realm-management / manage-users वाला delegated admin। FGAP v2 डिफ़ॉल्ट evaluator है। |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18082 |
इसके लिए एक मौजूदा Keycloak खाता आवश्यक है जिसके पास पहले से manage-users हो, और एक realm या client भूमिका जिसका अपना नाम कोई admin भूमिका न हो और जिसके composites में manage-realm या realm-admin शामिल हो। टोकन पर manage-realm की आवश्यकता नहीं है। वह उस composite को नहीं बना सकता। manage-realm / realm-admin नामक भूमिका का सीधा असाइनमेंट अभी भी अस्वीकार किया जाता है।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven या inferred |
|---|---|---|---|
| स्वयं पर एक non-admin composite मैप करना | composite id और name के साथ POST /admin/realms/{realm}/users/{id}/role-mappings/realm | Integrity (role grant) | Lab-proven। HTTP 204। Witness kcr02m7q4 |
| client भूमिका पर वही grant | POST /admin/realms/{realm}/users/{id}/role-mappings/clients/{client} | Integrity | Source। ClientRoleMappingsResource.java:184 पर वही canMapRole |
| उसी access token पर पूरा realm दस्तावेज़ पढ़ना | mapping के बाद GET /admin/realms/{realm} | Recon | Lab-proven। पहले: HTTP 200 आंशिक (कोई attributes नहीं, कोई accessTokenLifespan नहीं)। बाद में: HTTP 200 पूर्ण, planted attribute मौजूद |
बाद के admin कॉल पर nested manage-realm का उपयोग | UserAdapter.hasRole composites को walk करता है; KeycloakIdentity.hasClientRole user model पर भरोसा करता है | Integrity | Source से inferred। Lab oracle पूरा realm GET है |
nested realm-admin जब वही composite हो | वही walk | Integrity | Inferred। Lab ने manage-realm का उपयोग किया |
| Negative control | एक दूसरा manage-users उपयोगकर्ता जो composite को मैप नहीं करता | n/a | Lab-proven। Control GET आंशिक ही रहता है |
इस leftover पर बंद रहता है
| Axis | Method / sink | यह क्यों बंद है |
|---|---|---|
| Integrity | manage-realm / realm-admin / अन्य AdminRoles.ALL_ROLES का सीधा map | RolePermissionsV2.isRealmAdminRole अभी भी अस्वीकार करता है |
| Integrity | admin भूमिका शामिल करने वाला composite बनाना | canMapComposite अभी भी checkAdminRoles को कॉल करता है |
| Integrity | ऐसे group में शामिल होना जिसके composite में admin भूमिका शामिल हो | CVE-2026-94000 GroupUtils.checkAdminGroupRoles में composites को walk करता है |
| Integrity | ऐसा उपयोगकर्ता बनाना जो पहले से उस group में हो | UsersResource.createUser पर वही walk |
| Recon | Anonymous Admin REST | manage-users token आवश्यक है |
| Integrity | Host RCE, realm-admin द्वारा realm-admin mint करना | Class से बाहर |
GET /admin/realms/{realm} manage-users के लिए HTTP 403 नहीं है। वह भूमिका स्वयं एक admin भूमिका है, इसलिए सर्वर एक आंशिक दस्तावेज़ के साथ 200 लौटाता है। शेष वे फ़ील्ड हैं जो केवल कंपोज़िट मैप होने के बाद दिखाई देते हैं।
मैंने Keycloak 26.8.1 को पिन किया। फ़ाइन-ग्रेन्ड admin अनुमतियाँ v2 डिफ़ॉल्ट रूप से चालू हैं। RolePermissionsV2.canMapRole हर उस भूमिका के लिए true लौटाता है जो isRealmAdminRole में विफल होती है और कभी कंपोज़िट्स को नहीं चलाता। CVE-2026-94000 का फ़िक्स उन्हें केवल group पथ पर चलाता है।
पहले से दर्ज गलत मोड़: v1 isRealmAdminRole को लाइव जाँच मानना (v2 इसे ओवरराइड करता है); अनुदान से पहले realm GET पर HTTP 403 की अपेक्षा करना (लाइव परिणाम एक आंशिक 200 है); CVE-2026-94000 को फिर से दर्ज करना (group join, पहले से बंद); एक रिवर्स शेल। नाटक।
python3 keycloak-manage-users-composite-Abraxas-Labs.py
या:
cd lab
./run.sh
केवल http://127.0.0.1:18082 को लक्षित करें। इमेज quay.io/keycloak/keycloak:26.8.1। Docker आवश्यक है। लॉन्चर lab/ में chdir करता है और run.sh को exec करता है।
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
RolePermissionsV2.canMapRole में कंपोज़िट को उसी तरह ट्रैवर्स करें जैसे GroupUtils.checkAdminGroupRoles समूह जॉइन के लिए पहले से करता है। जिस भूमिका में manage-realm या realm-admin शामिल है, वह एडमिन भूमिका है, भले ही उसका अपना नाम वह न हो।
24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b)RolePermissionsV2.canMapRole (RolePermissionsV2.java:59-61)RoleMapperResource.addRealmRoleMappings (RoleMapperResource.java:289-290)GNU Affero GPL v3.0. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।
Abraxas Labs [email protected]
कृपया CVE का श्रेय Abraxas Labs को दें।