
Keycloak 26.8.1 SAML ब्रोकर दोष के लिए लूपबैक PoC: एक प्रतिशत-एन्कोडेड डुप्लिकेट SAMLResponse नाम रीडायरेक्ट हस्ताक्षर सत्यापन को बायपास करता है, जिससे किसी अन्य उपयोगकर्ता के रूप में लॉगिन करना संभव हो जाता है।
जिसके पास कोई Keycloak खाता नहीं है, वह किसी कंपनी के SAML लॉगिन को किसी अन्य व्यक्ति के रूप में पूरा कर सकता है। वे अपस्ट्रीम पहचान प्रदाता पर एक बार साइन इन करते हैं, उस हस्ताक्षरित रीडायरेक्ट को रख लेते हैं, और उसके आगे एक प्रतिशत-एन्कोडेड नाम के अंतर्गत दूसरा SAML दस्तावेज़ लगा देते हैं। Keycloak ईमानदार हस्ताक्षर की जाँच करता है और फिर उन्हें जाली दस्तावेज़ में दिए गए नाम के रूप में लॉग इन कर देता है। इसके लिए एक ऐसे SAML ब्रोकर की आवश्यकता होती है जो HTTP-Redirect प्रतिक्रियाओं पर हस्ताक्षर करता हो, जिसमें हस्ताक्षर सत्यापन चालू हो और assertion हस्ताक्षर बंद हों, जो कि metadata आयात द्वारा कॉन्फ़िगर किया जाता है। यह issue #53354 वाला सेमीकोलन स्प्लिट नहीं है।
Class: OAuth leftover Reach: Remote (Keycloak के लिए अनप्रमाणित; एक redirect-signing SAML ब्रोकर की आवश्यकता है)
Keycloak 26.8.1 (24ed1dad) - Red Hat
| ID | अभी तक कोई CVE नहीं |
| Class | OAuth leftover |
| Reach | Remote (कोई Keycloak खाता नहीं; IdP से एक वास्तविक HTTP-Redirect हस्ताक्षर की आवश्यकता है) |
| CWE | CWE-287 / CWE-347 / CWE-116 |
| CVSS | High: 7.4 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N |
| Product | Keycloak |
| Affected | 26.8.1 (24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b); Quarkus 3.40.1; image quay.io/keycloak/keycloak:26.8.1 |
| Auth | Keycloak पर कोई नहीं। एक SAML identity-provider ब्रोकर की आवश्यकता है जिसमें validateSignature=true हो और wantAssertionsSigned अनुपस्थित या false हो। |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18084 |
इसके लिए शिकार का NameID (आमतौर पर एक ईमेल) और उस IdP से एक वास्तविक हस्ताक्षरित HTTP-Redirect की आवश्यकता होती है। Keycloak पासवर्ड की आवश्यकता नहीं है। मेलबॉक्स की आवश्यकता नहीं है। केवल-POST वाला IdP वह हस्ताक्षर नहीं देता। metadata आयात POST को प्राथमिकता देने पर भी GET ACS माउंटेड रहता है।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven or inferred |
|---|---|---|---|
| ईमानदार हस्ताक्षर के अभी भी सत्यापित होते हुए एक जाली SAML दस्तावेज़ बाइंड करना | हस्ताक्षरित SAMLResponse से पहले SAML%52esponse=<forged> के साथ GET broker ACS | Integrity (authn) | Lab-proven. Control email [email protected]. Attack email [email protected] |
| first-broker-login के माध्यम से शिकार उपयोगकर्ता बनाना | जाली NameID पर callback.authenticated | Integrity (account create) | Lab-proven. Victim count 0 before the split query, 1 after |
| किसी मौजूदा ब्रोकर्ड उपयोगकर्ता के रूप में सत्र, जिसमें वह एडमिन भी शामिल है जो उसी IdP का उपयोग करता है | वही ACS, उस उपयोगकर्ता का NameID | Integrity (account takeover) | Inferred. Lab created the victim on first login |
| RelayState और auth सत्र बनाए रखना | RelayState हस्ताक्षरित मान ही रहता है | Integrity | Source. Signature covers RelayState |
| नेगेटिव कंट्रोल | ईमानदार हस्ताक्षरित रीडायरेक्ट, कोई अतिरिक्त पैरामीटर नहीं | n/a | Lab-proven. Control finishes as the attacker email |
इस leftover पर बंद रहता है
| Axis | Method / sink | Why it is closed |
|---|---|---|
| Integrity | सेमीकोलन स्प्लिट SAMLResponse=...;SAMLResponse=... | issue #53354. quarkus.http.use-semicolon-as-query-param-delimiter=false |
| Integrity | wantAssertionsSigned=true होने पर अहस्ताक्षरित assertion | handleLoginResponse तब assertion हस्ताक्षर की आवश्यकता रखता है |
| Integrity | कोई SAML ब्रोकर नहीं, या केवल-POST वाला IdP जिसमें कोई redirect हस्ताक्षर नहीं | हमलावर GET पर SigAlg + Signature कभी प्राप्त नहीं करता |
| Integrity | Host RCE, अनप्रमाणित Admin REST | Out of class |
| Integrity | डिफ़ॉल्ट VERIFY_PROFILE नाम फ़ॉर्म | Lab-proven as a completion step, not a disproof. The form already holds the brokered email |
मैंने Keycloak 26.8.1 को पिन किया। RESTEasy Reactive, Vert.x से @QueryParam("SAMLResponse") लेता है, जो क्वेरी नामों को प्रतिशत-डिकोड करता है, इसलिए SAML%52esponse SAMLResponse पर सिमट जाता है और पहला मान जीत जाता है। verifyRedirectSignature कच्ची क्वेरी पर getQueryParameters(false) से हस्ताक्षरित स्ट्रिंग को फिर से बनाता है, जहाँ वह नाम एक अलग कुंजी बना रहता है।
पहले से दर्ज गलत रास्ते: #53354 को इस अवशेष के रूप में मानना (प्रतिशत-एन्कोडेड नाम, सेमीकोलन नहीं); लैब क्लाइंट में ACS 302s का पीछा करना और AUTH_SESSION_ID छोड़ देना; VERIFY_PROFILE पर खाली firstName/lastName को मिस के रूप में पढ़ना (ईमेल पहले से ही ब्रोकर्ड NameID है); एक रिवर्स शेल। नाटक।
Python 3.11+ के साथ cryptography। Docker आवश्यक है।
python3 keycloak-saml-redirect-param-split-Abraxas-Labs.py
या:
cd lab
./run.sh
केवल http://127.0.0.1:18084 को लक्षित करें। इमेज quay.io/keycloak/keycloak:26.8.1। लॉन्चर lab/ में chdir करता है और run.sh को exec करता है। लैब IdP इन-प्रोसेस है। यह कभी भी किसी वास्तविक पहचान प्रदाता से संवाद नहीं करता।
IOC image=quay.io/keycloak/keycloak:26.8.1 label-version=26.8.1
IOC serverinfo-version=26.8.1
IOC validate-signature=true want-assertions-signed=absent
IOC review-profile=DISABLED
IOC [email protected]
IOC victim-before=0
IOC [email protected]
IOC victim-after=1
SUCCESS KC-H04-SAML-REDIRECT kcs04b8n1
उसी क्वेरी दस्तावेज़ को सत्यापित करें जिसे एंडपॉइंट पार्स करता है। हस्ताक्षर पुनर्निर्माण से पहले पैरामीटर नामों को प्रतिशत-डिकोड करें, या डिकोडिंग के बाद एक से अधिक SAMLResponse वाली क्वेरी को अस्वीकार करें। रीडायरेक्ट ब्रोकर्स के लिए, मेटाडेटा-आयात पथ सहित, wantAssertionsSigned चालू करें।
24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b)SAMLEndpoint.redirectBinding (SAMLEndpoint.java:182-183, :779-813, :896-914)SamlProtocolUtils.verifyRedirectSignature (SamlProtocolUtils.java:216-249)KeycloakUriInfo.getQueryParameters (KeycloakUriInfo.java:147-163)GNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।
Abraxas Labs [email protected]
कृपया CVE का श्रेय Abraxas Labs को दें।