9 में से 1 ऐप्स कर रहे हैं Supabase Keys लीक: जानिए यह कैसे होता है

BBetter Stack
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00इस महीने एक रिपोर्ट आई है जिसमें लगभग 20,000 इंडी ऐप्स को स्कैन किया गया और पाया गया कि नौ में से एक
00:00:04ऐप अपने फ्रंट-एंड कोड में सुपा-आधारित (Supa-based) क्रेडेंशियल्स को एक्सपोज़ कर रहे थे।
00:00:08यह किसी सर्वर लॉग या प्राइवेट रेपो की बात नहीं है।
00:00:11यह सीधे उस जावास्क्रिप्ट में है जिसे हर विजिटर डाउनलोड करता है।
00:00:14और बात यह है कि ये ऐप्स हैक नहीं हुए थे, उन्होंने बस गलती से अपनी सीक्रेट कीज़ सार्वजनिक कर दीं।
00:00:18साफ कर दूँ कि कुछ कीज़ (keys) सार्वजनिक होने के लिए ही होती हैं।
00:00:21असली समस्या पाइपलाइन की है, क्योंकि उसी गलती से ऐसी की (key) भी शिप हो सकती है जिसे ब्राउज़र में
00:00:25कभी होना ही नहीं चाहिए था।
00:00:27हमारे वीडियो हर समय आते रहते हैं।
00:00:28सब्सक्राइब करना न भूलें।
00:00:35यहाँ एक सरल सच्चाई है जिसमें लोग अक्सर उलझ जाते हैं।
00:00:38हम सभी इसे जानते तो हैं, लेकिन जल्दबाजी में अक्सर चूक जाते हैं।
00:00:41जब आप किसी एनवायरनमेंट वेरिएबल को पब्लिक के रूप में मार्क करते हैं, तो आपका बिल्ड टूल उसे ब्राउज़र का हिस्सा
00:00:46मान लेता है और उसे क्लाइंट बंडल में जोड़ दिया जाता है।
00:00:50Next.js इसे Next.public के साथ करता है, Vite इसे Vite के साथ और SvelteKit इसे public
00:00:56का उपयोग करके करता है।
00:00:57Next कोई सेफ्टी लेबल नहीं है, वह असल में एक शिपिंग लेबल है।
00:01:01अब हम यह तो जानते हैं, लेकिन यहाँ सुपा-आधारित हिस्सा यह है।
00:01:04कुछ कीज़ पब्लिक होने के लिए होती हैं, जैसे एनॉन (anon) या पब्लिशेबल की, और कुछ प्राइवेट होती हैं, जैसे
00:01:10सर्विस रोल या सीक्रेट कीज़।
00:01:12अगर कोई प्राइवेट की ब्राउज़र में पहुँच जाती है, तो आप अंदाज़ा लगा सकते हैं कि क्या होगा।
00:01:17उस स्थिति में रोल लेवल सिक्योरिटी (RLS) भी आपको नहीं बचा पाएगी।
00:01:20सुपा-बेस्ड के डॉक्स में साफ लिखा है कि सर्विस कीज़ RLS को बायपास कर सकती हैं।
00:01:24तो अगर वह की आपके फ्रंट-एंड में है, तो आपकी सारी पॉलिसी सेटिंग्स का कोई मतलब नहीं रह जाता।
00:01:29अब मैं आपको अपने सैंडबॉक्स का उपयोग करके दिखाता हूँ कि वास्तव में यह कैसे हुआ।
00:01:33सबसे पहले, मैंने Next.js का उपयोग करके एक साधारण CRUD ऐप बनाया और उसमें अपना सुपा-बेस्ड लिंक किया।
00:01:38यह रही मेरी EMV फाइल, और यहाँ है वो गलती।
00:01:41मैंने एक की (key) को पब्लिक प्रीफिक्स वाले वेरिएबल में डाल दिया।
00:01:45यह की पब्लिशेबल है, इसलिए इसका दिखना सामान्य है।
00:01:48असली समस्या यह है कि वही Next.public वाला रास्ता गलती से एक प्राइवेट की को भी शिप कर सकता है।
00:01:53जब मैंने इसे बनाने के लिए npm run build चलाया और फिर अपना ऐप शुरू किया।
00:01:59अब मैं यहाँ क्रोम में हूँ।
00:02:00चलिए जल्दी से हमारे डेटाबेस, यानी हमारे CRUD ऐप में कुछ जानकारी जोड़ते हैं।
00:02:05ठीक है, अब मैं कंपाइल किए गए जावास्क्रिप्ट बंडल को खोल सकता हूँ और उसमें सर्च करूँगा।
00:02:10यह रही।
00:02:12URL और की (key) ठीक उसी फाइल के अंदर हैं जिसे आपके यूजर्स ने अपने ब्राउज़र में
00:02:18पुल किया है।
00:02:19और ध्यान दें कि यहाँ क्या नहीं हुआ।
00:02:21किसी ने इसे हैक नहीं किया।
00:02:22मैंने इसे ढूँढ लिया, है ना?
00:02:24किसी ने किसी कमज़ोरी का फायदा नहीं उठाया।
00:02:25यह बस उस चीज़ को पढ़ना है जिसे ऐप ने पहले ही सार्वजनिक इंटरनेट पर भेज दिया था।
00:02:29अगर आप इसे देख सकते हैं, तो कोई भी देख सकता है।
00:02:32देव टूल्स (dev tools) खोलें, जावास्क्रिप्ट फाइलें देखें और इसे सर्च करें।
00:02:35बस इतना ही करना है।
00:02:36तो अगर आपका प्लान यह है कि कोई नहीं देखेगा, तो याद रखें कि इंटरनेट ऐसे लोगों और बॉट्स से भरा है
00:02:41जिनका काम ही ऐसी चीज़ों को ढूँढना है।
00:02:44तो यहाँ वो समाधान है जो वास्तव में काम करता है।
00:02:47ब्राउज़र को केवल आपके API को कॉल करना चाहिए।
00:02:50आपका API सर्वर साइड पर चलता है।
00:02:52प्राइवेट कीज़ वहीं रहती हैं।
00:02:54प्राइवेट ऑपरेशन्स को API रूट या सर्वर फंक्शन में ले जाएँ।
00:02:58क्लाइंट आपके एंडपॉइंट को कॉल करता है, आपका एंडपॉइंट सुप्राबेस को कॉल करता है, फिर बंडल को दोबारा बनाएँ और चेक करें।
00:03:03अगर की (key) बंडल से हट गई है, तो आपने इसे ठीक कर दिया है, लेकिन बस यहीं रुककर
00:03:04काम खत्म न समझें, क्योंकि और भी चीज़ें हैं जो आप कर सकते हैं।
00:03:09सुनिश्चित करें कि यूजर-फेसिंग टेबल्स के लिए रोल लेवल सिक्योरिटी इनेबल हो और आपकी पॉलिसी
00:03:11वही कर रही हों जो आप चाहते हैं।
00:03:16टेस्टिंग में भी कुछ समय बिताएं।
00:03:18मुझे लगता है कि अक्सर इस बात को नज़रअंदाज़ कर दिया जाता है।
00:03:19अब वो हिस्सा जो इसे दोबारा होने से रोकता है: ज्यादातर लोग इसे एक बार ठीक करते हैं, फिर
00:03:21जल्दबाजी में इसे फिर से शामिल कर देते हैं।
00:03:26इसलिए कुछ सुरक्षा घेरे (guard rails) जोड़ें, CI में सीक्रेट स्कैनिंग से शुरुआत करें ताकि अगर कोई की
00:03:28गलत जगह दिखे तो बिल्ड फेल हो जाए।
00:03:34फिर एक PR नियम बनाएँ कि next public या Vite वाली किसी भी चीज़ को डिफॉल्ट रूप से पब्लिक माना जाए
00:03:36क्योंकि वह पब्लिक ही होती है।
00:03:41अंत में, रोटेशन की व्यवस्था करें।
00:03:42अगर आपको ज़रा सा भी अंदेशा हो कि कीज़ एक्सपोज़ हुई हैं, तो उन्हें तुरंत बदल (rotate) दें।
00:03:43कुछ दिनों तक इंतज़ार करके देखने से यह कहीं बेहतर है।
00:03:47यहाँ वो चीज़ है जिसे आप अभी आज़मा सकते हैं।
00:03:50अपने ऐप को उसी तरह बिल्ड करें जैसे आप इसे शिप करते हैं।
00:03:52आउटपुट में सुपरबेस JWT सर्विस सीक्रेट और टोकन जैसी दिखने वाली किसी भी चीज़ को सर्च करें।
00:03:55अगर आपको कुछ भी प्राइवेट मिले, तो मान लें कि वह कॉम्प्रोमाइज़ हो चुका है क्योंकि आपने उसे ढूँढ लिया है।
00:04:01उसे बदलें और फिर अपने सर्वर-साइड लॉजिक को अपडेट करें।
00:04:05अगर आप इस वीडियो से सिर्फ एक लाइन याद रखना चाहते हैं, तो वो यह है।
00:04:08अगर वह बंडल में है, तो वह पब्लिक है।
00:04:11मिलते हैं अगले वीडियो में।
00:04:13We'll see you in another video.

Key Takeaway

यदि कोई डेटा या सुरक्षा कुंजी आपके जावास्क्रिप्ट बंडल में शामिल है, तो उसे पूरी तरह से सार्वजनिक मान लेना चाहिए, इसलिए संवेदनशील जानकारी को हमेशा केवल सर्वर-साइड पर ही रखना चाहिए।

Highlights

हालिया रिपोर्ट के अनुसार लगभग 20,000 इंडी ऐप्स में से 9 में से 1 ऐप अपनी Supabase क्रेडेंशियल्स को फ्रंट-एंड कोड में सार्वजनिक रूप से एक्सपोज़ कर रहे हैं।

डेवलपर्स अक्सर 'Next.public' या 'Vite' जैसे प्रीफिक्स का उपयोग करते समय गलती करते हैं, जिससे प्राइवेट कीज़ क्लाइंट-साइड बंडल का हिस्सा बन जाती हैं।

यदि 'Service Role Key' जैसी प्राइवेट की सार्वजनिक हो जाती है, तो डेटाबेस की 'Role Level Security' (RLS) भी उसे सुरक्षित नहीं रख पाती क्योंकि यह की सुरक्षा नीतियों को बायपास कर सकती है।

इस समस्या के समाधान के लिए प्राइवेट ऑपरेशन्स को सर्वर-साइड API रूट्स या सर्वर फंक्शन्स में ले जाना अनिवार्य है।

भविष्य में ऐसी गलतियों से बचने के लिए CI/CD पाइपलाइन में 'Secret Scanning' और क्रेडेंशियल रोटेशन जैसे सुरक्षा उपाय लागू करने चाहिए।

Timeline

डेटा लीक की समस्या का परिचय

वीडियो की शुरुआत एक चौंकाने वाली रिपोर्ट से होती है जिसमें बताया गया है कि हजारों ऐप्स गलती से अपनी Supabase कीज़ को जावास्क्रिप्ट कोड में एक्सपोज़ कर रहे हैं। वक्ता स्पष्ट करते हैं कि यह किसी बाहरी हैक का परिणाम नहीं है, बल्कि डेवलपर्स द्वारा की गई कोडिंग की गलतियों का नतीजा है। यहाँ मुख्य समस्या यह है कि संवेदनशील क्रेडेंशियल्स सीधे उस कोड में मौजूद हैं जिसे कोई भी विजिटर आसानी से डाउनलोड कर सकता है। यह खंड सार्वजनिक और निजी कीज़ के बीच के सूक्ष्म अंतर को समझना शुरू करता है। अंततः, यह स्पष्ट किया गया है कि पाइपलाइन की खराबी के कारण ऐसी कीज़ शिप हो जाती हैं जिन्हें ब्राउज़र में कभी नहीं होना चाहिए था।

पब्लिक वेरिएबल्स और फ्रेमवर्क की कार्यप्रणाली

इस अनुभाग में बताया गया है कि Next.js, Vite और SvelteKit जैसे आधुनिक बिल्ड टूल्स एनवायरनमेंट वेरिएबल्स के साथ कैसे व्यवहार करते हैं। वक्ता समझाते हैं कि 'Next.public' जैसे लेबल असल में ब्राउज़र को यह निर्देश देते हैं कि इस डेटा को क्लाइंट बंडल में शामिल करना है। यहाँ सबसे बड़ा खतरा यह है कि यदि 'Service Role Key' जैसी प्राइवेट की को गलती से पब्लिक मार्क कर दिया जाए, तो वह 'Role Level Security' (RLS) को पूरी तरह से बायपास कर सकती है। इसका मतलब है कि आपकी सुरक्षा नीतियां (Policies) बेकार हो जाती हैं क्योंकि यह की डेटाबेस पर पूर्ण नियंत्रण प्रदान करती है। यह खंड डेवलपर्स को चेतावनी देता है कि सुरक्षा लेबल वास्तव में 'शिपिंग लेबल' की तरह काम करते हैं।

लाइव प्रदर्शन: कोड में गलती कैसे होती है

वक्ता एक सैंडबॉक्स उदाहरण के माध्यम से दिखाते हैं कि कैसे एक साधारण CRUD ऐप में गलती से प्राइवेट की को शामिल किया जा सकता है। वह 'npm run build' चलाकर दिखाते हैं कि कंपाइल किए गए जावास्क्रिप्ट बंडल के भीतर सर्च करने पर URL और कीज़ आसानी से मिल जाती हैं। यहाँ ध्यान देने वाली बात यह है कि किसी हैकर को किसी बड़ी कमज़ोरी की ज़रूरत नहीं है, वह सिर्फ ब्राउज़र के 'Dev Tools' का उपयोग करके इसे देख सकता है। इंटरनेट पर सक्रिय बॉट्स लगातार ऐसी फाइलों को स्कैन करते रहते हैं ताकि वे संवेदनशील जानकारी चुरा सकें। यह प्रदर्शन इस सच्चाई को उजागर करता है कि जो कुछ भी इंटरनेट पर भेजा गया है, वह अब निजी नहीं रह गया है।

समाधान और सुरक्षा के उपाय

इस खंड में समस्या को ठीक करने के लिए ठोस समाधान दिए गए हैं, जिसमें सबसे महत्वपूर्ण सलाह प्राइवेट कीज़ को केवल सर्वर-साइड पर रखना है। डेवलपर्स को अपने ब्राउज़र कॉल्स को सीधे Supabase के बजाय अपने स्वयं के API एंडपॉइंट्स पर भेजना चाहिए जो सर्वर पर सुरक्षित रूप से चलते हैं। इसके अतिरिक्त, वक्ता सुरक्षा के तीन स्तरों का सुझाव देते हैं: 'Role Level Security' को इनेबल करना, CI पाइपलाइन में 'Secret Scanning' का उपयोग करना और PR समीक्षा के दौरान कड़े नियम बनाना। यदि कभी भी कीज़ के लीक होने का संदेह हो, तो उन्हें तुरंत रोटेट (बदलना) करने की सलाह दी गई है। यह सुरक्षा ढांचा भविष्य में मानवीय त्रुटियों को रोकने में मदद करता है।

निष्कर्ष और व्यावहारिक परीक्षण

वीडियो के अंतिम भाग में डेवलपर्स के लिए एक त्वरित परीक्षण का सुझाव दिया गया है जिससे वे अपने स्वयं के ऐप्स की सुरक्षा जांच सकें। वक्ता कहते हैं कि अपने ऐप को बिल्ड करें और आउटपुट फाइलों में मैन्युअल रूप से JWT सीक्रेट या टोकन जैसी चीज़ें सर्च करें। यदि आपको कुछ भी संवेदनशील मिलता है, तो उसे तुरंत बदला जाना चाहिए क्योंकि वह पहले ही खतरे में पड़ चुका है। पूरे वीडियो का सबसे महत्वपूर्ण सार यह है कि 'अगर वह बंडल में है, तो वह पब्लिक है'। यह सरल संदेश डेवलपर्स को सुरक्षित कोडिंग प्रथाओं को अपनाने के लिए प्रेरित करता है। अंत में, दर्शकों को भविष्य की तकनीकी जानकारी के लिए चैनल से जुड़े रहने के लिए कहा जाता है।

Community Posts

No posts yet. Be the first to write about this video!

Write about this video