
CVE-2026-23552 - قبول الرموز عبر النطاقات (Realms) في camel-keycloak
لا يتحقق KeycloakSecurityPolicy في Apache Camel من مطالبة iss (المُصدِر) في توكنات JWT مقابل العالم (Realm) المهيأ. وهذا يعني أن توكنًا صادرًا عن عالم Keycloak واحد يُقبل بصمت من قِبل سياسة مهيأة لعالم مختلف تمامًا، مما يكسر عزل المستأجرين.
الإصدارات المتأثرة: 4.15.0، 4.16.0، 4.17.0
مُتتبَّع في: https://issues.apache.org/jira/browse/CAMEL-22854
في KeycloakSecurityHelper.parseAccessToken()، عندما لا يُوفَّر مفتاح عام صراحةً (وهو التكوين الافتراضي)، يتم فقط فك تشفير التوكن من Base64 — دون أي تحقق منه:
public static AccessToken parseAccessToken(String tokenString, PublicKey publicKey)
throws VerificationException {
if (publicKey != null) {
return TokenVerifier.create(tokenString, AccessToken.class)
.publicKey(publicKey)
.verify()
.getToken();
} else {
// no signature verification, no issuer check
return TokenVerifier.create(tokenString, AccessToken.class).getToken();
}
}
وبما أن مسار الكود الافتراضي يصل إلى فرع else، تبقى ثلاثة أمور دون فحص:
iss لا تُقارن أبدًا بالقيمة المتوقعة {serverUrl}/realms/{realm}ويظل فحص الدور ناجحًا لأنه ينظر فقط إلى أسماء الأدوار داخل حمولة التوكن. إذا صادف أن اسم الدور (tenant-user) متطابق عبر العوالم — وهو أمر شائع في الإعدادات متعددة المستأجرين — يمر الطلب.
في تطبيق متعدد المستأجرين حيث يُرتبط كل مستأجر بعالم Keycloak منفصل، يمكن لمستخدم من المستأجر A الوصول إلى مسارات محمية للمستأجر B. على وجه التحديد:
يُظهر هذا المشروع الثغرة باستخدام Apache Camel 4.17.0 ومثيل Keycloak محلي.
jbang app install camel@apache/camel)camel infra داخليًا)شغّل Keycloak محليًا:
camel infra run keycloak
يبدأ هذا تشغيل Keycloak على localhost:8080 ببيانات اعتماد المدير admin/admin.
mvn verify
يقوم اختبار التكامل (CrossRealmTokenBypassIT) بما يلي:
acme وglobextenant-user في كلا العالمينalice (كلمة المرور alice123) في عالم acme ويمنحها دور tenant-userdirect:globex-protected) محميًا بسياسة KeycloakSecurityPolicy مرتبطة بعالم globexalice من عالم acme (المُصدِر: http://localhost:8080/realms/acme)ينجح الطلب. يمر توكن acme من سياسة globex دون أي خطأ.
| الاختبار | النتيجة | المعنى |
|---|---|---|
testAcmeTokenIsObtainable |
على إصدار مُصحَّح (4.18.0+)، سيفشل الاختبار الثاني وينجح الثالث.
camel infra stop keycloak
كما يزيل الاختبار عالمي acme وglobex في @AfterAll.
يجب على KeycloakSecurityPolicy رفض التوكنات التي لا تتطابق فيها مطالبة iss مع {serverUrl}/realms/{realm}. الإصلاح مُتتبَّع في CAMEL-22854 وسيُطرح مع الإصدار Camel 4.18.0 (الإصدار التالي طويل الدعم LTS).
globex| PASS |
| فحص سلامة — الحصول على التوكن يعمل |
testCrossRealmTokenAccepted | PASS | يؤكد وجود الثغرة |
testCrossRealmTokenShouldBeRejected | FAIL | يوثّق السلوك الصحيح — لا يُرمى أي استثناء على الإصدار 4.17.0 |