
CVE-2021-21239 के लिए एक्सप्लॉइट: pysaml2/Redash में SAML हस्ताक्षर सत्यापन बायपास। एम्बेडेड सार्वजनिक कुंजियों के साथ SAML प्रतिक्रियाएं जाली बनाकर उपयोगकर्ताओं का रूप धारण करता है और JIT प्रोविज़निंग के माध्यम से विशेषाधिकार बढ़ाता है।
Security Assertion Markup Language (SAML) एक खुला मानक है जो संघीय पहचान प्रणाली (federated identity system) में पार्टियों के बीच प्रमाणीकरण और प्राधिकरण डेटा के आदान-प्रदान के लिए उपयोग किया जाता है। यह डोमेनों में सिंगल साइन-ऑन (SSO) सक्षम करता है। मुख्य घटक हैं:
विशिष्ट SAML प्रवाह में, SP उपयोगकर्ता को प्रमाणीकरण के लिए IdP पर पुनर्निर्देशित करता है। IdP उपयोगकर्ता के बारे में assertions (जैसे, ईमेल, नाम) युक्त एक हस्ताक्षरित SAML प्रतिक्रिया लौटाता है। SP हस्ताक्षर को मान्य करता है और उपयोगकर्ता को provision या लॉगिन कराता है।
CVE-2021-21239 pysaml2 लाइब्रेरी (संस्करण <6.5.0) में एक हस्ताक्षर सत्यापन बाईपास भेद्यता है, जिसका उपयोग Redash <=10.1.0 SAML SSO के लिए करता है। उच्च स्तर पर, यह एक हमलावर को मनमानी एम्बेडेड सार्वजनिक कुंजी के साथ SAML प्रतिक्रिया गढ़ने की अनुमति देता है, जिससे just-in-time (JIT) provisioning के माध्यम से उपयोगकर्ता प्रतिरूपण और विशेषाधिकार वृद्धि संभव होती है।
यह भेद्यता इस बात से उत्पन्न होती है कि pysaml2 SAML हस्ताक्षर सत्यापित करने के लिए xmlsec1 को किस प्रकार आमंत्रित करता है। , डिफ़ॉल्ट रूप से, SAML प्रतिक्रिया में में एम्बेडेड सार्वजनिक कुंजियों को कॉन्फ़िगर किए गए IdP प्रमाणपत्र पर वरीयता देता है। एक हमलावर स्व-जनित RSA कुंजी युग्म के साथ SAML प्रतिक्रिया तैयार कर सकता है, सार्वजनिक कुंजी को में एम्बेड कर सकता है, और निजी कुंजी के साथ assertion पर हस्ताक्षर कर सकता है। चूंकि pysaml2 को केवल विश्वसनीय IdP प्रमाणपत्र का उपयोग करने के लिए प्रतिबंधित नहीं करता है, इसलिए गढ़ा गया हस्ताक्षर मान्य माना जाता है, जिससे हमलावर किसी भी उपयोगकर्ता (जैसे, व्यवस्थापक) के रूप में लॉगिन कर सकता है और उच्चतम विशेषाधिकार प्राप्त कर सकता है।
Xmlsec1<ds:KeyInfo><ds:RSAKeyValue>xmlsec1कोड स्तर पर, भेद्यता pysaml2 के sigver.py (check_signature फ़ंक्शन) में मौजूद है। xmlsec1 कमांड सूची में --enabled-key-data raw-x509-cert विकल्प का अभाव है, जो xmlsec1 को अविश्वसनीय एम्बेडेड कुंजियों का उपयोग करने की अनुमति देता है:
com_list = [
self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
'--pubkey-cert-pem', cert_file_name,
'--id-attr:%s' % id_attr, node_name,
'--node-id', nodeid, '--output', output_file_name, xml_file_name
]
यह उन हमलों की अनुमति देता है जहां हमलावर JIT provisioning का लाभ उठाकर किसी भी उपयोगकर्ता का प्रतिरूपण करने के लिए <saml:NameID> में ईमेल को संशोधित करता है।
एक्सप्लॉइट का परीक्षण करने के लिए, Docker Compose का उपयोग करके एक स्थानीय Redash इंस्टेंस (v10.1.0 या पुराना) तैयार किया जाता है। सेटअप में Google के IdP के साथ SAML SSO कॉन्फ़िगर करना शामिल है:
यह सेटअप Python स्क्रिप्ट या Burp Suite के माध्यम से भेजी गई गढ़ी हुई SAML प्रतिक्रिया का परीक्षण करने की अनुमति देता है, जिससे विशेषाधिकार वृद्धि सत्यापित होती है।
यह भेद्यता इसलिए उत्पन्न होती है क्योंकि pysaml2 का xmlsec1 आह्वान सत्यापन के लिए एम्बेडेड कुंजियों के उपयोग की अनुमति देता है, जिससे विश्वसनीय IdP प्रमाणपत्र बायपास हो जाता है। एक हमलावर RSA कुंजी युग्म उत्पन्न करता है, <ds:RSAKeyValue> में सार्वजनिक कुंजी के साथ SAML प्रतिक्रिया तैयार करता है, विशेषताओं (जैसे, ईमेल को व्यवस्थापक के रूप में) को संशोधित करता है, और assertion पर हस्ताक्षर करता है। Xmlsec1 एम्बेडेड कुंजी का उपयोग करके सत्यापित करता है, इसे मान्य मानता है।
समाधान pysaml2 v6.5.0 (प्रारंभिक कमिट 17 जनवरी, 2021) में src/saml2/sigver.py में लागू किया गया था। xmlsec1 कमांड सूची को --enabled-key-data raw-x509-cert शामिल करने के लिए अद्यतन किया गया था, जो सत्यापन को कॉन्फ़िगर किए गए IdP प्रमाणपत्र तक सीमित करता है:
com_list = [
self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
'--pubkey-cert-pem', cert_file_name,
'--enabled-key-data', 'raw-x509-cert',
'--id-attr:%s' % id_attr, node_name,
'--node-id', nodeid, '--output', output_file_name, xml_file_name
]
यह ट्रस्ट चेन सत्यापन लागू करता है, एम्बेडेड कुंजी के उपयोग को रोकता है। Redash ने बाद के संस्करणों (जैसे, v11+) में pysaml2 को अपग्रेड करके इसे ठीक किया। भेद्य संस्करणों ने --insecure का उपयोग नहीं किया; बग लापता प्रतिबंध विकल्प था।
एक्सप्लॉइट कोड cve-2021-21239.py में लागू किया गया है। यह Python स्क्रिप्ट Redash <=10.1.0 में CVE-2021-21239 का शोषण करने के लिए SAML प्रतिक्रिया गढ़ने की प्रक्रिया को स्वचालित करती है, जिससे JIT provisioning के माध्यम से उपयोगकर्ता प्रतिरूपण और विशेषाधिकार वृद्धि संभव होती है। एक्सप्लॉइट Google Workspace SAML IdP को लक्षित करता है, लेकिन हमले का परीक्षण अन्य IdPs (keycloak) के साथ भी किया गया है। स्क्रिप्ट निम्नलिखित चरण करती है:
email="[email protected]")।idpid प्राप्त करता है, लक्ष्य के कॉन्फ़िगरेशन के साथ संगतता सुनिश्चित करता है।SAMLResponseTempalte.xml) का उपयोग करता है। Redash के सत्यापन को पारित करने के लिए 5 मिनट की वैधता विंडो के साथ गतिशील UTC टाइमस्टैम्प उत्पन्न किए जाते हैं।<ds:RSAKeyValue> में सार्वजनिक कुंजी एम्बेड करते हुए, RSA-SHA256 के साथ <saml:Assertion> तत्व पर हस्ताक्षर करने के लिए xmlsec Python लाइब्रेरी का उपयोग करता है।/saml/callback?org_slug=default) पर भेजता है।CVE-2021-21239 का शोषण करने के लिए एक गढ़ी हुई SAML प्रतिक्रिया तैयार करना आवश्यक था जिसे Redash JIT provisioning के माध्यम से स्वीकार करे। प्रमुख कठिनाइयाँ और बाईपास:
<ds:RSAKeyValue> में सार्वजनिक कुंजी एम्बेड करके, निजी कुंजी के साथ हस्ताक्षर करके बायपास किया गया।xmlsec1 बाइनरी के साथ प्रारंभिक प्रयास काम कर गए, लेकिन Python xmlsec लाइब्रेरी व्हाइटस्पेस/कैनोनिकलाइज़ेशन मुद्दों के कारण डाइजेस्ट बेमेल उत्पन्न करती थी। हस्ताक्षर करने से पहले XML को एक पंक्ति में क्रमबद्ध करके (etree.tostring(..., pretty_print=False)) बायपास किया गया।NotOnOrAfter अस्वीकृति का कारण बना; 5 मिनट की वैधता के साथ गतिशील UTC टाइमस्टैम्प का उपयोग करके बायपास किया गया।SAMLResponse को दोहरा-एन्कोड करती थी, जिससे पार्सिंग विफलताएँ हुईं; कच्चे फॉर्म डेटा भेजकर बायपास किया गया।ये चुनौतियाँ भेद्यता का प्रभावी ढंग से शोषण करने के लिए सटीक XML हेरफेर और पर्यावरण सेटअप की आवश्यकता को उजागर करती हैं। प्रदान किया गया एक्सप्लॉइट कोड इसे सफलतापूर्वक प्रदर्शित करता है, उपयोगकर्ताओं का प्रतिरूपण करने और पहुंच प्राप्त करने के लिए SAML प्रतिक्रिया गढ़ता है।