
يحتوي Keycloak قبل الإصدار 18.0.0 وبعد الإصدار 10.0.0 على ثغرة XSS منعكسة في نقطة نهاية clients-registrations. يتم تشغيل الثغرة عن طريق تقديم، عبر POST، بنية json بمفتاح كاسم معلمة غير مدعوم من قبل نقطة النهاية. يعكس الرد مفتاح json في رسالة خطأ مع تعيين الترويسة على Content-Type: text/html. عند التنفيذ في المتصفح، يتم تفسير كود html من مفتاح json مما يسمح بتشغيل كود JavaScript. لا يتطلب الأمر مصادقة وتؤثر الثغرة على جميع النطاقات (realms) المتاحة.
حاليًا، نظرًا لأن الثغرة تتطلب Content-Type: application/json ويتم إرسالها عبر POST، لا يوجد مسار شائع لاستغلالها يكون له تأثير على المستخدم.
يوفر هذا المستودع إثبات مفهوم (POC) لـ CVE-2021-20323 وتوصيات للإصلاح/التخفيف.
تشغيل الثغرة سهل جدًا.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/json" -d "{\"\":1}"
من الممكن أيضًا تشغيلها مع مزود openid-connect.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/openid-connect -H "Content-type: application/json" -d "{\"\":1}"
ملاحظة: في إصدارات Keycloak الأقدم (الإصدار الذي يعمل مع wildfly بدلاً من quarkus) يستخدم المسار الأساسي /auth/realms/* بدلاً من /realms/*
كما نرى في مصادر متعددة هنا أو هنا، ليس من الممكن بشكل شائع استغلال XSS منعكسة عبر POST تتطلب Content-Type: application/json لتكون قابلة للاستغلال. الحالة الوحيدة التي يمكن أن يحدث فيها ذلك هي إذا تم تخفيف سياسة CORS يدويًا عن الإعداد الافتراضي للسماح بطلبات عبر المصادر (cross-origin). هذا السيناريو لا يمكن افتراضه بشكل معقول إلا في حالات استخدام محددة جدًا أُنشئت لأسباب وظيفية من قبل مالك التطبيق. لكي تكون قابلة للاستغلال في مثل هذه الحالة، يجب أن يتحكم المهاجم إما في النطاق/الخادم المسموح به في سياسة CORS أو أن يكون لديه XSS على هذا النطاق الثاني يمكن استخدامه كمرحّل (relay).
مع CVE-2021-20323، لا يقبل Keycloak POST مع Content-Type من نوع multipart/form-data أو application/x-www-form-urlencoded وهما النوعان الوحيدان المسموح بهما في إرسال form أساسي. هذا يجعل CVE-2021-20323 قابلة للاستغلال فقط إذا سمحت CORS بذلك صراحةً.
# curl -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: multipart/form-data" -d "{\"\":1}"
{"error":"RESTEASY003065: Cannot consume content type"}
# curl -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/x-www-form-urlencoded" -d "{\"\":1}"
{"error":"RESTEASY003065: Cannot consume content type"}
قم بالتحديث إلى Keycloak 18.0.0 أو أحدث.
لا توجد إصدارات معروفة تم إصلاحها لـ RedHat Single Sign-On وهو إصدار مُعاد تجميعه من Keycloak بواسطة RedHat.
clients-registrationsclients-registrations، على غرار مقال مدونة Keycloakرخصة MIT © [ndmalc]