ऐप्लिकेशन सैंडबॉक्स

Android प्लैटफ़ॉर्म, ऐप्लिकेशन के संसाधनों की पहचान करने और उन्हें अलग करने के लिए, उपयोगकर्ता के हिसाब से Linux की सुरक्षा का फ़ायदा लेता है. इससे ऐप्लिकेशन एक-दूसरे से अलग हो जाते हैं और ऐप्लिकेशन और सिस्टम को नुकसान पहुंचाने वाले ऐप्लिकेशन से सुरक्षित रखा जाता है. ऐसा करने के लिए, Android हर Android ऐप्लिकेशन को एक यूनीक यूज़र आईडी (यूआईडी) असाइन करता है और उसे अपनी प्रोसेस में चलाता है.

Android, कर्नेल-लेवल का ऐप्लिकेशन सैंडबॉक्स सेट अप करने के लिए, यूआईडी का इस्तेमाल करता है. प्रोसेस लेवल पर, ऐप्लिकेशन और सिस्टम के बीच सुरक्षा को लागू करने के लिए, कर्नेल, Linux की स्टैंडर्ड सुविधाओं का इस्तेमाल करता है. जैसे, ऐप्लिकेशन को असाइन किए गए उपयोगकर्ता और ग्रुप आईडी. डिफ़ॉल्ट रूप से, ऐप्लिकेशन एक-दूसरे के साथ इंटरैक्ट नहीं कर सकते. साथ ही, उनके पास ओएस का सीमित ऐक्सेस होता है. अगर ऐप्लिकेशन A, ऐप्लिकेशन B का डेटा पढ़ने या अनुमति के बिना फ़ोन डायल करने जैसा कोई नुकसान पहुंचाने वाला काम करने की कोशिश करता है, तो उसे ऐसा करने से रोक दिया जाता है. ऐसा इसलिए होता है, क्योंकि उसके पास डिफ़ॉल्ट रूप से उपयोगकर्ता को मिलने वाली अनुमतियां नहीं होती हैं. सैंडबॉक्स आसान है और इसकी ऑडिटिंग की जा सकती है. यह कई दशकों पुराने यूनिक्स स्टाइल पर आधारित है, जिसमें प्रोसेस और फ़ाइल की अनुमतियों को अलग-अलग उपयोगकर्ताओं के लिए सेट किया जाता है.

ऐप्लिकेशन सैंडबॉक्स, कर्नेल में होता है. इसलिए, यह सुरक्षा मॉडल, नेटिव कोड और ओएस ऐप्लिकेशन, दोनों पर लागू होता है. कर्नेल के ऊपर मौजूद सभी सॉफ़्टवेयर, जैसे कि ओएस लाइब्रेरी, ऐप्लिकेशन फ़्रेमवर्क, ऐप्लिकेशन रनटाइम, और सभी ऐप्लिकेशन, ऐप्लिकेशन सैंडबॉक्स में चलते हैं. कुछ प्लैटफ़ॉर्म पर, डेवलपर को किसी खास डेवलपमेंट फ़्रेमवर्क, एपीआई के सेट या भाषा का इस्तेमाल करना पड़ता है. Android पर, सुरक्षा को लागू करने के लिए, ऐप्लिकेशन को लिखने के तरीके पर कोई पाबंदी नहीं है. इस मामले में, नेटिव कोड को सैंडबॉक्स किया जाता है, जैसे कि इंटरप्रेट किए गए कोड को किया जाता है.

सुरक्षा से जुड़ी सुविधाएं

आम तौर पर, सही तरीके से कॉन्फ़िगर किए गए डिवाइस में ऐप्लिकेशन सैंडबॉक्स से बाहर निकलने के लिए, Linux कर्नेल की सुरक्षा से समझौता करना होगा. हालांकि, सुरक्षा से जुड़ी अन्य सुविधाओं की तरह, ऐप्लिकेशन सैंडबॉक्स को लागू करने वाली अलग-अलग सुरक्षाएं पूरी तरह से सुरक्षित नहीं होतीं. इसलिए, एक ही कमजोरी की वजह से ओएस या अन्य ऐप्लिकेशन को नुकसान पहुंचाने से रोकने के लिए, बेहतर सुरक्षा की रणनीति अपनाना ज़रूरी है.

ऐप्लिकेशन सैंडबॉक्स को लागू करने के लिए, Android कई सुरक्षा उपायों का इस्तेमाल करता है. ये नीतियां समय के साथ लागू की गई हैं. इनसे, UID पर आधारित डिस्क्रेशनरी ऐक्सेस कंट्रोल (डीएसी) सैंडबॉक्स को ज़्यादा बेहतर बनाया गया है. Android की पिछली रिलीज़ में ये सुरक्षा उपाय शामिल थे:

  • Android 5.0 में, SELinux ने सिस्टम और ऐप्लिकेशन के बीच ज़रूरी ऐक्सेस कंट्रोल (एमएसी) के लिए अलग-अलग सेटिंग उपलब्ध कराई थी. हालांकि, तीसरे पक्ष के सभी ऐप्लिकेशन एक ही SELinux कॉन्टेक्स्ट में चलते थे. इसलिए, ऐप्लिकेशन के बीच अलगाव को मुख्य रूप से यूआईडी डीएसी की मदद से लागू किया जाता था.
  • Android 6.0 में, SELinux सैंडबॉक्स को हर उपयोगकर्ता के लिए अलग-अलग ऐप्लिकेशन को अलग-अलग रखने के लिए, ज़्यादा बेहतर बनाया गया था. इसके अलावा, Android ऐप्लिकेशन के डेटा के लिए भी डिफ़ॉल्ट रूप से ज़्यादा सुरक्षित सेटिंग सेट करता है: targetSdkVersion >= 24 वाले ऐप्लिकेशन के लिए, ऐप्लिकेशन के होम डायरेक्ट्री पर डिफ़ॉल्ट डीएसी अनुमतियां 751 से बदलकर 700 हो गई हैं. इससे ऐप्लिकेशन के निजी डेटा के लिए, डिफ़ॉल्ट रूप से ज़्यादा सुरक्षित सेटिंग मिलती है. हालांकि, ऐप्लिकेशन इन डिफ़ॉल्ट सेटिंग को बदल सकते हैं.
  • Android 8.0 में, सभी ऐप्लिकेशन को seccomp-bpf फ़िल्टर के साथ चलाने के लिए सेट किया गया था. इस फ़िल्टर की मदद से, ऐप्लिकेशन के इस्तेमाल के लिए सिस्टम कॉल की संख्या सीमित की गई थी. इससे, ऐप्लिकेशन/कर्नल के बीच की सीमा को बेहतर बनाया गया था.
  • Android 9 में, targetSdkVersion >= 28 वाले सभी ऐसे ऐप्लिकेशन को अलग-अलग SELinux सैंडबॉक्स में चलाना ज़रूरी है जिनके पास खास सुविधाएं नहीं हैं. साथ ही, हर ऐप्लिकेशन के लिए मैक (मैलवेयर अटैक को रोकने के लिए सुरक्षा) दिया जाना चाहिए. इस सुरक्षा से, ऐप्लिकेशन को अलग-अलग रखने में मदद मिलती है. साथ ही, यह सुरक्षित डिफ़ॉल्ट सेटिंग को बदलने से रोकता है. सबसे अहम बात यह है कि इससे ऐप्लिकेशन अपने डेटा को दुनिया भर के लिए ऐक्सेस करने से रोकते हैं.
  • Android 10 में, ऐप्लिकेशन के पास फ़ाइल सिस्टम का सीमित रॉ व्यू होता है. साथ ही, /sdcard/DCIM जैसे पाथ का सीधा ऐक्सेस नहीं होता. हालांकि, ऐप्लिकेशन के पास अपने पैकेज के हिसाब से पाथ का पूरा रॉ ऐक्सेस बना रहता है. यह ऐक्सेस, Context.getExternalFilesDir() जैसे लागू होने वाले किसी भी तरीके से मिलता है.

फ़ाइलें शेयर करने के दिशा-निर्देश

ऐप्लिकेशन के डेटा को 'सभी के लिए उपलब्ध' के तौर पर सेट करना, सुरक्षा के लिहाज़ से गलत है. इस लिंक का ऐक्सेस सभी को मिल जाता है. साथ ही, यह ऐक्सेस सिर्फ़ उन लोगों तक सीमित नहीं किया जा सकता जिन्हें यह लिंक भेजा गया है. इस वजह से, जानकारी ज़ाहिर होने और डिप्टी के लिए बनी सुविधाओं में कमज़ोरियों का पता चलता है. साथ ही, यह मैलवेयर का पसंदीदा टारगेट है, जो संवेदनशील डेटा वाले ऐप्लिकेशन (जैसे, ईमेल क्लाइंट) को टारगेट करता है. Android 9 और इसके बाद के वर्शन में, targetSdkVersion>=28 एट्रिब्यूट वाले ऐप्लिकेशन के लिए, इस तरह से फ़ाइलें शेयर करने की अनुमति नहीं है.

ऐप्लिकेशन का डेटा सभी के लिए उपलब्ध कराने के बजाय, फ़ाइलें शेयर करते समय इन दिशा-निर्देशों का पालन करें:

  • अगर आपके ऐप्लिकेशन को किसी दूसरे ऐप्लिकेशन के साथ फ़ाइलें शेयर करनी हैं, तो कॉन्टेंट प्रोवाइडर का इस्तेमाल करें. कॉन्टेंट की सेवा देने वाली कंपनियां, ज़्यादा जानकारी के साथ डेटा शेयर करती हैं. साथ ही, वे दुनिया भर के लोगों के लिए उपलब्ध यूनिक्स अनुमतियों से जुड़ी कई समस्याओं से बचती हैं. ज़्यादा जानकारी के लिए, कॉन्टेंट की सेवा देने वाली कंपनियों के बारे में बुनियादी जानकारी लेख पढ़ें.
  • अगर आपके ऐप्लिकेशन में ऐसी फ़ाइलें हैं जिन्हें सभी लोग ऐक्सेस कर सकते हैं, जैसे कि फ़ोटो, तो वे सिर्फ़ मीडिया से जुड़ी (सिर्फ़ फ़ोटो, वीडियो, और ऑडियो फ़ाइलें) होनी चाहिए. साथ ही, उन्हें MediaStore क्लास का इस्तेमाल करके स्टोर किया जाना चाहिए. (मीडिया आइटम जोड़ने के तरीके के बारे में ज़्यादा जानकारी के लिए, शेयर किए गए स्टोरेज से मीडिया फ़ाइलें ऐक्सेस करना लेख पढ़ें.)

स्टोरेज की रनटाइम अनुमति, MediaStore के ज़रिए, स्ट्रोंग टाइप वाले कलेक्शन का ऐक्सेस कंट्रोल करती है. PDF और MediaStore.Downloads क्लास जैसी कम टाइप वाली फ़ाइलों को ऐक्सेस करने के लिए, ऐप्लिकेशन को ACTION_OPEN_DOCUMENT इंटेंट जैसे इंटेंट का इस्तेमाल करना होगा.

Android 10 के हिसाब से काम करने की सुविधा चालू करने के लिए, requestLegacyExternalStorage मेनिफ़ेस्ट एट्रिब्यूट का इस्तेमाल करें. साथ ही, ऐप्लिकेशन की अनुमतियों के सबसे सही तरीकों का पालन करें.

  • Android 9 और उससे पहले के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, मेनिफ़ेस्ट फ़्लैग की डिफ़ॉल्ट वैल्यू true होती है.
  • Android 10 को टारगेट करने वाले ऐप्लिकेशन के लिए, डिफ़ॉल्ट वैल्यू 'गलत' होती है. Android 10 को टारगेट करने वाले ऐप्लिकेशन में, फ़िल्टर किए गए स्टोरेज व्यू से कुछ समय के लिए ऑप्ट आउट करने के लिए, मेनिफ़ेस्ट फ़्लैग की वैल्यू को true पर सेट करें.
  • पाबंदी वाली अनुमतियों का इस्तेमाल करके, इंस्टॉलर उन ऐप्लिकेशन की अनुमति वाली सूची बनाता है जिन्हें बिना सैंडबॉक्स वाले स्टोरेज का ऐक्सेस दिया जा सकता है. अनुमति वाली सूची में शामिल नहीं होने वाले ऐप्लिकेशन को सैंडबॉक्स किया जाता है.