Google OAuth में कुछ कार्यक्षमता बाधित
(trufflesecurity.com)- जो सेवाएं लॉगिन अधिकार तय करने के लिए Google OAuth के email claim पर भरोसा करती हैं, उनमें कंपनी के Google organization से हटाए जाने के बाद भी पूर्व कर्मचारी Slack·Zoom जैसे ऐप्स तक access बनाए रख सकते हैं
- Gmail के अलावा दूसरे email से भी Google account बनाया जा सकता है, और कंपनी email के alias·plus-address forwarding का उपयोग करने पर organization से बाहर का Google account कंपनी domain वाला email claim भेज सकता है
- यह गैर-Gmail account कंपनी Google organization के admin screen या user list में दिखाई नहीं देता, लेकिन कई सेवाएं email के अंत में मौजूद domain देखकर ही login की अनुमति दे देती हैं
- Organizations Google login बंद करके SAML को सख्ती से लागू कर mitigation कर सकती हैं, लेकिन कुछ services या internal apps यह option नहीं देते या SAML support नहीं कर सकते
- Google को 4 अगस्त को report किया गया, 5 अक्टूबर को $1337 reward दिया गया, और 16 दिसंबर को 134 दिनों बाद public किया गया, लेकिन disclosure के समय तक Google की mitigation changes deploy नहीं हुई थीं
Vulnerability disclosure और timeline
- Google OAuth vulnerability के कारण कंपनी से offboarding होकर Google organization से हटाए गए कर्मचारी Slack·Zoom जैसे applications तक अनिश्चित समय तक access बनाए रख सकते हैं
- Disclosure के समय तक Google ने इस जोखिम को mitigate करने वाला change deploy नहीं किया था
- Timeline इस प्रकार है
- 4 अगस्त: Google को report किया और बताया कि सैकड़ों applications प्रभावित हो सकते हैं
- 7 अगस्त: issue triage हुआ
- 5 अक्टूबर: Google ने issue के लिए $1337 भुगतान किया
- 25 नवंबर: Zoom·Slack सहित प्रभावित दर्जनों applications को private bulk report भेजी गई
- 16 दिसंबर: Google को notify करने के 134 दिन बाद public disclosure
Identifier के रूप में email claim इस्तेमाल करने का जोखिम
- Truffle Security का Forager login पहले Descope की Microsoft OAuth vulnerability से प्रभावित हुआ था
- उस समय यह पुष्टि हुई कि Microsoft द्वारा सीधे create या verify न किया गया Email claim भेजा जा सकता है, और email claim आम तौर पर भरोसेमंद identifier नहीं होता
- Google की OIDC documentation भी Email को primary identifier के रूप में इस्तेमाल न करने की चेतावनी देती है
email_verifiedclaim को भी एक असामान्य बिंदु के रूप में देखा गया, लेकिन unverified email से email claim create करने का तरीका confirm नहीं हुआ- हालांकि email claim का दुरुपयोग करने के पर्याप्त मामले confirm हुए
गैर-Gmail Google accounts और duplicate email claim
- Google account Gmail address के बिना भी किसी existing email address से बनाया जा सकता है
- उदाहरण के लिए Yahoo email address से Google account बनाया जा सकता है
- यह account गैर-Gmail email set होने की स्थिति में उस email का email claim भेज सकता है
- Google documentation email को primary identifier के रूप में इस्तेमाल न करने को इसलिए भी कहती है क्योंकि दो अलग-अलग Google accounts एक ही email claim भेज सकते हैं
- settings में गैर-Gmail email बदलने के बाद
- बदलाव से पहले वाले email से नया account बनाने पर वही email claim संभव हो जाता है
कंपनी Google organization के बाहर बचा रहने वाला account
- मुख्य loophole यह है कि कंपनी Google organization email के लिए email alias और plus-address forwarding का उपयोग कर organization के बाहर Google account बनाया जा सकता है
- कंपनी email का plus address मूल user के inbox में forward हो सकता है
- इस flow से कंपनी Google organization email इस्तेमाल करने वाला plus-address based गैर-Gmail Google account बनाया जा सकता है, और इस account को organization से delete या offboard नहीं किया जा सकता
- कई services इस email को parse करने के बाद अंत के domain के आधार पर login eligibility तय करती हैं
- इस account से Zoom पर sign up किया जा सकता है
- इस account से Slack पर sign up किया जा सकता है
- ऐसे गैर-Gmail Google accounts असल Google organization members नहीं होते, इसलिए admin settings या user Google list में दिखाई नहीं देते
Organizations, service providers और Google के mitigation measures
- Organizations Google login disable करके SAML को सख्ती से enforce करें तो mitigation संभव है
- अधिकांश service providers में यह तरीका काम करता है
- कुछ services यह option नहीं देतीं
- Internal development applications प्रभावित हो सकते हैं लेकिन SAML support नहीं करते हों
- Service providers Google OAuth के HD claim का उपयोग कर सकते हैं
- HD claim उस Google organization का domain भेजता है जिससे account जुड़ा है
- जो accounts Google organization members नहीं हैं, उनमें HD claim शामिल नहीं होता
- test किए गए अधिकांश service providers ने HD के बजाय email claim का उपयोग किया
- HD claim में महत्वपूर्ण limitations बची रहती हैं
- HD unique identifier नहीं, सिर्फ domain है
- अगर Google organization delete हो जाए और domain छोड़ दिया जाए, तो कोई दूसरा व्यक्ति उस domain को हासिल कर नया Google organization बना सकता है
- उदाहरण के लिए company A को company B acquire करे, B A की services बंद करे और पुराने domain को renew न करे
- internet पर कोई व्यक्ति company A का domain खरीद ले तो company A के existing service accounts में login कर सकता है
- Service providers JIT account creation को general feature के रूप में allow न करके invite-only या LDAP group based account provisioning में switch कर सकते हैं
- Google मौजूदा Google organization domains से बने Google accounts को ban करके व्यापक mitigation कर सकता है
- Google खुद
google.comaccounts को ban करता है - वही protection अन्य organizations तक भी expand की जा सकती है
- Google खुद
- Google-side के अन्य mitigation उपायों में plus-address Google account sign-up ban करना, Google email alias sign-up ban करना, और organizations को related settings configure करने के लिए बेहतर admin settings देना शामिल है
अतिरिक्त प्रभाव: support email और magic link flows
- Initial access अधिकार न होने पर भी किसी organization के Zoom·Slack तक पहुंचना technically संभव हो सकता है
- यह flow दूसरे researchers द्वारा magic link sign-in flows में मिली vulnerability research का उपयोग करता है
- Zendesk जैसे कुछ support·ticket systems email से support ticket बना सकते हैं
- support ticket email address से Google account बनाया जा सकता है
- ticket contents देखकर account creation पूरा करने की संभावना हो सकती है
- इसके बाद उस support email address से OAuth login attempt किया जा सकता है
- Main domain पर email to support feature बनाए रखना सुरक्षित नहीं है, और Zendesk support email को alternate email address के रूप में configure करने का विकल्प है
Disclosure का उद्देश्य और बची हुई समस्याएं
- Slack·Zoom जैसे platforms पर पूर्व कर्मचारियों द्वारा access बनाए रखने की समस्या Google OAuth system के loophole से उत्पन्न होती है
- Google के पास इस समस्या को mitigate करने के लिए व्यापक fixes करने की क्षमता है
- Disclosure का उद्देश्य मामूली documentation change से आगे बढ़कर वास्तविक changes करवाना है
- Google ने issue triage जल्दी किया, लेकिन अपनी 90-day improvement practice के विपरीत 134वें दिन समस्या public हुई
1 टिप्पणियां
Hacker News की रायें
मैं इसी क्षेत्र में काम करता हूँ, और पिछले 3–4 सालों में कई login providers और SaaS कंपनियों में इस vulnerability के variants से 20 से ज़्यादा बार निपटा हूँ। ब्लॉग पोस्ट सही है, लेकिन मुझे लगता है कि मूल समस्या अब ठीक करने के लिए बहुत आगे निकल चुकी है। पूरे इंटरनेट पर delegated authentication पूरी तरह अव्यवस्थित है, और मैंने Google व Microsoft engineers से भी इस बारे में काफी बात की है, इसलिए मुझे भरोसा है कि वे इस समस्या-समूह को पहले से जानते हैं। बस, अगर वे अभी व्यवहार बदलते हैं तो बहुत सारी मौजूदा services और दशकों पुराने enterprise login implementations टूट जाएँगे
इस समय “fix” सरल है। अगर आपकी साइट “Sign in with XYZ” इस्तेमाल करती है, तो provider द्वारा भेजे गए email address पर भरोसा नहीं करना चाहिए। सिर्फ email domain देखकर special permissions न दें, और database में verified के रूप में mark करने से पहले हमेशा अपना verification email भेजें। बड़े OAuth providers ने भी अपने docs में इसे साफ़ तौर पर लिखने के लिए updates किए हैं, और यह लेख भी उसी बात को इंगित करता है। इसलिए reward मिला, यह अपने-आप में बल्कि हैरानी की बात है
इससे जुड़ी बात: और ज्यादा service providers को Google docs की recommendation की तरह email को primary identifier के रूप में इस्तेमाल करना बंद करना चाहिए। Google Apps में username बदलने पर Slack, Datadog, GoLinks आदि में issues संभालने में काफी समय लगा
यहाँ सही दिशा ऐसी API देना है जो इस्तेमाल करने वाली application की जरूरतों के मुताबिक हो और अतिरिक्त जिम्मेदारी को न्यूनतम रखे। इस मामले में मुझे लगता है कि Google को
email_verifiedकोfalseset करना चाहिए था, ताकि application या downstream IdP को पता चल सके कि additional verification की जरूरत हैअगर
user@domainपहले से ही Google mail servers द्वारा handle हो रहा है और इसलिए plus routing rules लागू होते हैं, तो समझ नहीं आता किuser+suffix@domainजैसे email से नया Google account क्यों बनाया जा सकता है। दुरुपयोग न भी हो, तो भी यह भ्रमित करने वाली mail setup बनाने के लिए बिल्कुल उपयुक्त लगता हैa+b@domain.comको एक खास तरीके से handle करता है, लेकिन कोई दूसरा server जरूरी नहीं कि ऐसा करे। अंततः दोनों अलग-अलग unique email addresses हैं, और पूरे इंटरनेट पर भी उन्हें वैसे ही treat किया जाना चाहिएuser+suffix@domainसे भी खराब है। कम से कम+XYZemail RFC में explicitly लिखा है। Google इससे आगे जाकर नाम के अंदर के dots को भी normal email मानता है। उदाहरण के लिएhi.my.name@google.com,himyname@google.comके समान है, और सारी mail बाद वाले पर route होती है“मुझे यह जानकर हैरानी हुई कि Microsoft ऐसे email claims भेजता है जिन्हें Microsoft ने बनाया या verify नहीं किया, और आम तौर पर email claims को भरोसेमंद नहीं माना जाता” वाले हिस्से पर: भले ही मूल इरादा वही रहा हो, मुझे लगता है कि OIDC का अधिक flexible होना बहुत उपयोगी है। उदाहरण के लिए, मैं एक free login provider[0] चलाता हूं, जो upstream OIDC या direct email के जरिए चौथी party identity provider (IdP) से identity verify करता है, और app तथा उस IdP के बीच privacy barrier बनाता है। यानी Google यह track नहीं कर पाता कि user किन-किन apps में login कर रहा है
Google में अपनी email लाने की क्षमता का मतलब है कि आपको email+password की privacy के साथ Google OIDC की security और user experience मिल सकता है, लेकिन बड़ी caveat यह है कि अब आपको Google की जगह LastLogin पर भरोसा करना होगा। उस dependency को कम करने वाले protocol पर भी काम चल रहा है। “Google docs ने दरअसल email को identifier के तौर पर इस्तेमाल न करने की चेतावनी दी थी” वाले हिस्से से मैं पूरी तरह असहमत हूं। Email ही एकमात्र वास्तविक federated identity है जिसे लोग सच में इस्तेमाल करते हैं। जब तक कोई बेहतर विकल्प व्यापक रूप से deploy नहीं हो जाता, मेरा मानना है कि email address को identity के तौर पर treat करना चाहिए
[0]: https://lastlogin.io
पश्चिमी देशों के बाहर computer की तुलना में mobile phone ज्यादा आम हैं और UI भी आम तौर पर आसान होता है, इसलिए phone number के identity होने की संभावना ज्यादा है। इसके अलावा, ऐसा करने पर आप identity को पूरी तरह email provider के हवाले कर देते हैं। Google जैसी बेचेहरा संस्था बिना warning या appeal process के access block कर सकती है, और वास्तव में करती भी है, इसलिए आप सब कुछ खो सकते हैं। संदर्भ के लिए: मैंने Okta के OAuth और OIDC products launch किए, LinkedIn का संबंधित course बनाया, और अब Pangea Cyber में फिर वही कर रहा हूं
आप हमेशा इंतजार भी कर सकते हैं, या फिर solution बनाना शुरू कर सकते हैं
Portier और पुराने Mozilla Persona के साथ भी थोड़ा काम किया था, लेकिन अंत में email normalization problem से निपटना हारती हुई लड़ाई या बहुत कठिन लड़ाई जैसा लगा। लगभग मान लिया था कि कोई अच्छा solution pioneer होने से पहले ही यह मर जाएगा, और ध्यान कहीं और लगा दिया
क्या यह सचमुच Google OAuth की समस्या है, या फिर कई service providers की यह failure है कि उन्होंने access देने से पहले OAuth token के claims को ठीक से verify नहीं किया? मुझे दूसरा वाला मामला लगता है
[1] https://developers.google.com/identity/openid-connect/openid...
user@domainऔरuser+wildcard@domainअब भी ऐसे email addresses के रूप में verify होते हैं जिन्हें user “own” करता है, इसलिए वे उस email address के लिए valid authentication और identity देते हैंसमस्या Google organization website की तरफ है। Admin उन accounts या emails के credentials revoke नहीं कर सकता जिन्हें वह देख नहीं सकता। “ये non-Gmail Google accounts वास्तव में Google organization के members नहीं हैं, इसलिए admin settings या Google user list में दिखाई नहीं देते” वाला हिस्सा मुख्य है
इस flow को follow करें तो कोई support ticket email address से Google account बना सकता है, ticket content को संभावित रूप से देखकर account creation complete कर सकता है, और फिर उसी support email address से कई services में OAuth login कर सकता है। इससे कई छोटी कंपनियां प्रभावित हो सकती हैं
यहां से मेरा सबसे बड़ा निष्कर्ष यह है कि web authentication अब भी भयानक mess है
OIDC spec कहता है कि email को unique identifier के तौर पर इस्तेमाल नहीं करना चाहिए। Application के username के लिए
issऔरsubfields इस्तेमाल करने चाहिएवजह सबसे पहले यह स्पष्ट है कि user email address reuse हो सकते हैं। अगर कोई contractor Business A और Business B दोनों के लिए काम करता है, और दोनों ने authentication service में उस व्यक्ति का user account बनाया है, तो SaaS platform की नजर में एक email address को किसी एक B2B customer से match नहीं किया जा सकता। दूसरी बात, email addresses बदलते हैं। कंपनियां acquire होती हैं, नाम बदलती हैं, merge होती हैं, और लोगों के नाम भी शादी, divorce या personal choice से बदलते हैं। Startup में SSO implement करना शुरुआत में सचमुच कठिन था। इसे सही करना मुश्किल है, और use करने से पहले general concepts, OIDC और OAuth2 को अच्छी तरह समझना जरूरी है। Auth0 के पास इस पर अच्छी किताब है। अगर आप इसे नहीं समझते, तो जगह-जगह password grant authentication implement करके application को insecure बनाने की संभावना ज्यादा है
किसी छोटे thumbnail जैसा। OAuth2 नाम की चीज़ असल में मौजूद ही नहीं है। OAuth2 बस बड़ी कंपनियों के लिए अपने-अपने मनमाने और proprietary authentication systems लागू करने का तरीका है। यह authentication system नहीं, बल्कि authentication system बनाने के लिए एक toolbox है। इसलिए OAuth2 को standard बनना था, लेकिन असल में दुनिया ऐसी बन गई जहाँ हर बड़ी कंपनी की अपनी, आपस में incompatible implementation है। बेशक लोग बड़ी कंपनियों के use cases के हिसाब से develop करेंगे, लेकिन तब “standard” आखिरकार Google जिस तरह करता है, वैसा कुछ बन जाता है
और हर किसी के पास ऐसे छोटे-छोटे bugs हैं। हमें OAuth1 पर लौटना चाहिए। वह सचमुच standard था, standard बनाने के लिए toolbox नहीं
अगर आपको कुछ PCB components से circuit design करना हो और voltage/current requirements के हिसाब से resistors और transistors लगाने हों, तो क्या यह उम्मीद नहीं की जानी चाहिए कि आप datasheet पढ़ेंगे? किसी सरल example से अंदाज़ा लगाकर आगे बढ़ें तो कई मामलों में circuit चल भी सकता है, और थोड़ा bench testing व probing करने पर काम कर सकता है। लेकिन efficiency कम हो सकती है, या components short हो सकते हैं, जिससे mean time to failure घटेगा और customers नाखुश होंगे। सबसे खराब स्थिति में battery में आग लग सकती है और असली नुकसान हो सकता है। तब device का जल्दी fail होना PCB module manufacturer की गलती है, या उस device manufacturer की जिम्मेदारी जिसने datasheet पढ़नी चाहिए थी? हम पूरे software से इतनी सख्त अपेक्षा नहीं रखते, लेकिन अगर आप authentication और authorization संभाल रहे हैं, तो service owner को बेहद thorough होना चाहिए। मूल लेख भी कहता है कि documentation follow करने पर समस्या मौजूद नहीं रहती। Alphabet ने bug bounty देकर कमजोरी को स्वीकार किया है, इसलिए वह company admins को plus aliases या non-existent roles को allow/deny list से manage करने का control दे सकता है, या Apps से जुड़े emails के organization के बाहर claims में transfer को restrict कर सकता है। शायद वे इसका impact measure कर रहे हैं या measurement की priority तय कर रहे हैं, लेकिन क्योंकि यह client-side समस्या है जहाँ email claim को असल से ज़्यादा authoritative और permanent माना जाता है, priority शायद कम होगी। “bug” की definition काफी हद तक इस पर निर्भर करती है कि “expected behavior” को कैसे और कौन define करता है, लेकिन कम से कम यह intended behavior से हटकर नहीं है, और documentation ठीक से समझने वालों के लिए unexpected भी नहीं है
क्या मैं कुछ miss कर रहा हूँ? लेख में बताए गए support system/Zendesk और छोड़े गए पुराने domain वाले तरीके के अलावा,
whatever@mydomain.comसे नया Google account बनाते समय verification माँगी जाती है। तो असल में इसका abuse कितना possible है?उदाहरण के लिए मान लें कि
egamirorrim@mydomain.comGoogle account legitimately मौजूद है। आपegamirorrim+woopsie@mydomain.comजैसे alias से verified email address वाला नया Google account बना सकते हैं, और फिर “Google से login” पर Googleegamirorrim+woopsie@mydomain.comवाला email claim भेजेगा। बाद में अगर आपकोmydomain.comसे निकाल दिया जाता है, तो असलीegamirorrim@mydomain.comसे जुड़ा account अब login नहीं कर पाएगा क्योंकि admin ने उसे deactivate कर दिया है। लेकिन नया Google accountegamirorrim+woopsie@mydomain.comorganization से जुड़ा नहीं है, इसलिए वह login कर सकता है। हालांकि मेरी नज़र में यह समस्या तभी बनती है जब provider सिर्फ email claim के आधार पर authorization करता है। मैंने पहले OIDC इस्तेमाल किया है, और email address claim के text को parse करके resource access grant नहीं करना चाहिए। मैं समझता हूँ कि लेखक को यह counterintuitive क्यों लगा, लेकिन लेख में भी लिखा है कि documentation ऐसा न करने की warning देती है। मूल लेख में है कि “मेरे द्वारा test किए गए अधिकांश service providers ने HD नहीं, email claim इस्तेमाल किया”; ठीक है, लेकिन वे उसे किस चीज़ के लिए “use” करते हैं? क्या यह trick किसी वास्तविक production service में काम करती है? अगर हाँ, तो नाम सार्वजनिक किए जाने चाहिए ताकि उनकी आलोचना हो। भले ही कोई इस value को unique और immutable मानने की गलती करे, सिर्फ उससे अपने-आप कोई access right मिलना जरूरी नहीं है