
Keycloak 26.8.1 متوسط 6.6 مصادقة متبقية عن بُعد بعد المصادقة. يمكن لمسؤول مكتب المساعدة الذي يملك صلاحية manage-users أن يثبّت على نفسه مركّبًا مُعدًّا مسبقًا من manage-realm ثم يقرأ مستند النطاق (realm) الكامل. يتطلب أن يكون هذا المركّب موجودًا بالفعل. إثبات مفهوم (PoC) عبر الاسترجاع المحلي (loopback).
حساب مكتب مساعدة يُفترض أنه مخصص فقط لإعادة تعيين كلمات المرور وإنشاء المستخدمين يمكنه ترقية نفسه. يجد شخص يمتلك دور manage-users في Keycloak مسمّى وظيفي متبقٍّ في النطاق (دور مركّب يتضمن بهدوء manage-realm)، ويثبّت ذلك المسمّى على حسابه الخاص، ثم يقرأ وثيقة النطاق الكاملة التي كانت مخفية عنه في طلب سابق. لا يمكنه إنشاء ذلك الدور المركّب. يجب أن يكون مسؤول نطاق حقيقي قد بناه أولاً. هذا هو الشقيق الخاص بتعيين الأدوار لـ CVE-2026-94000، الذي أغلق الحيلة نفسها عند الانضمام إلى المجموعات.
الفئة: بقايا مصادقة
الوصول: عن بُعد (manage-users مصادَق عليه)
Keycloak 26.8.1 (24ed1dad) - Red Hat
| المعرّف | لا يوجد CVE بعد |
| الفئة | بقايا مصادقة |
| الوصول | عن بُعد (Admin REST مصادَق عليه؛ يتطلب manage-users بالإضافة إلى دور مركّب مبني مسبقًا) |
| CWE | CWE-269 / CWE-266 |
| CVSS | متوسط: 6.6 CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H |
| المنتج | Keycloak |
| المتأثر | 26.8.1 (24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b)؛ الصورة quay.io/keycloak/keycloak:26.8.1 |
| المصادقة | مسؤول مفوَّض يمتلك realm-management / manage-users. FGAP v2 هو المُقيِّم الافتراضي. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18082 فقط |
يحتاج إلى حساب Keycloak موجود يمتلك بالفعل manage-users، وإلى دور نطاق أو دور عميل لا يكون اسمه نفسه دور مسؤول وتتضمن أدواره المركّبة manage-realm أو realm-admin. لا يحتاج إلى manage-realm على الرمز المميز. لا يمكنه إنشاء ذلك الدور المركّب. لا يزال التعيين المباشر لدور باسم manage-realm / realm-admin مرفوضًا.
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| تعيين دور مركّب غير إداري على الذات | POST /admin/realms/{realm}/users/{id}/role-mappings/realm مع معرّف الدور المركّب واسمه | السلامة (منح دور) | مُثبت مختبريًا. HTTP 204. الشاهد kcr02m7q4 |
| المنح نفسه على دور عميل | POST /admin/realms/{realm}/users/{id}/role-mappings/clients/{client} | السلامة | المصدر. نفس canMapRole في ClientRoleMappingsResource.java:184 |
| قراءة وثيقة النطاق الكاملة على الرمز المميز نفسه | GET /admin/realms/{realm} بعد التعيين | الاستطلاع | مُثبت مختبريًا. قبل: HTTP 200 جزئي (بدون سمات، بدون accessTokenLifespan). بعد: HTTP 200 كامل، السمة المزروعة موجودة |
استخدام manage-realm المتداخل في استدعاءات إدارية لاحقة | UserAdapter.hasRole يتتبع الأدوار المركّبة؛ KeycloakIdentity.hasClientRole يثق بنموذج المستخدم | السلامة | مُستنتج من المصدر. معيار المختبر هو GET الكامل للنطاق |
realm-admin المتداخل عندما يكون هو الدور المركّب | نفس التتبع | السلامة | مُستنتج. استخدم المختبر manage-realm |
| الضابط السلبي | مستخدم ثانٍ يمتلك manage-users ولا يعيّن الدور المركّب | لا ينطبق | مُثبت مختبريًا. يبقى GET الخاص بالضابط جزئيًا |
يبقى مغلقًا في هذه البقايا
| المحور | الطريقة / نقطة الوصول | سبب الإغلاق |
|---|---|---|
| السلامة | التعيين المباشر لـ manage-realm / realm-admin / أدوار AdminRoles.ALL_ROLES الأخرى | لا يزال RolePermissionsV2.isRealmAdminRole يرفض |
| السلامة | إنشاء الدور المركّب الذي يتضمن دور مسؤول | لا يزال canMapComposite يستدعي checkAdminRoles |
| السلامة | الانضمام إلى مجموعة يتضمن دورها المركّب دور مسؤول | CVE-2026-94000 يتتبع الأدوار المركّبة في GroupUtils.checkAdminGroupRoles |
| السلامة | إنشاء مستخدم موجود بالفعل في تلك المجموعة | نفس التتبع في UsersResource.createUser |
| الاستطلاع | Admin REST مجهول | يتطلب رمزًا مميزًا لـ manage-users |
| السلامة | RCE على المضيف، إنشاء realm-admin لـ realm-admin | خارج الفئة |
GET /admin/realms/{realm} ليس HTTP 403 بالنسبة لـ manage-users. هذا الدور هو نفسه دور مسؤول، لذا يُرجع الخادم 200 مع مستند جزئي. المتبقي هو الحقول التي تظهر فقط بعد تعيين المركّب.
ثبّتُ Keycloak 26.8.1. أذونات المسؤول الدقيقة v2 مفعّلة افتراضيًا. تُرجع RolePermissionsV2.canMapRole القيمة true لكل دور يفشل في isRealmAdminRole ولا يجتاز المركّبات أبدًا. إصلاح CVE-2026-94000 يجتازها فقط في مسار المجموعة.
المنعطفات الخاطئة المسجّلة مسبقًا: التعامل مع v1 isRealmAdminRole كفحص حي (v2 تتجاوزه)؛ توقّع HTTP 403 على GET الخاص بالـ realm قبل المنح (النتيجة الحية هي 200 جزئي)؛ إعادة تقديم CVE-2026-94000 (انضمام المجموعة، مغلق بالفعل)؛ reverse shell. مسرح.
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. يقوم المشغّل chdir إلى lab/ ثم ينفّذ 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
تجاوُز المركّبات (composites) في 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. مختبر loopback فقط. دون أي ضمان.
مختبرات أبراكساس [email protected]
يُرجى نسب CVE إلى Abraxas Labs.