आवेदन सैंडबॉक्स

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

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

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

सुरक्षा

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

एंड्रॉइड एप्लिकेशन सैंडबॉक्स को लागू करने के लिए कई सुरक्षा पर निर्भर करता है। ये प्रवर्तन समय के साथ पेश किए गए हैं और मूल यूआईडी-आधारित विवेकाधीन पहुंच नियंत्रण (डीएसी) सैंडबॉक्स को काफी मजबूत किया है। पिछले Android रिलीज़ में निम्नलिखित सुरक्षाएँ शामिल थीं:

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

फ़ाइलें साझा करने के लिए दिशानिर्देश

ऐप डेटा को विश्व पहुंच योग्य के रूप में सेट करना एक खराब सुरक्षा अभ्यास है। पहुंच सभी को दी गई है और केवल इच्छित प्राप्तकर्ता तक पहुंच को सीमित करना संभव नहीं है। इस अभ्यास के कारण सूचना प्रकटीकरण लीक हो गया है और डिप्टी कमजोरियां भ्रमित हो गई हैं, और यह मैलवेयर के लिए एक पसंदीदा लक्ष्य है जो संवेदनशील डेटा (जैसे ईमेल क्लाइंट) वाले ऐप्स को लक्षित करता है। एंड्रॉइड 9 और उच्चतर में, targetSdkVersion>=28 वाले ऐप्स के लिए इस तरह से फ़ाइलें साझा करना स्पष्ट रूप से अस्वीकृत है।

ऐप डेटा को विश्व-सुलभ बनाने के बजाय, फ़ाइलें साझा करते समय निम्नलिखित दिशानिर्देशों का उपयोग करें:

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

स्टोरेज रनटाइम अनुमति MediaStore के माध्यम से दृढ़ता से टाइप किए गए संग्रह तक पहुंच को नियंत्रित करती है। पीडीएफ और मीडियास्टोर.डाउनलोड क्लास जैसी कमजोर टाइप की गई फाइलों तक पहुंचने के लिए, ऐप्स को ACTION_OPEN_DOCUMENT इंटेंट जैसे इंटेंट का उपयोग करना होगा।

एंड्रॉइड 10 व्यवहार को सक्षम करने के लिए, requestLegacyExternalStorage मेनिफेस्ट विशेषता का उपयोग करें, और ऐप अनुमतियों की सर्वोत्तम प्रथाओं का पालन करें।

  • एंड्रॉइड 9 (और उससे नीचे) को लक्षित करने वाले ऐप्स के लिए मेनिफेस्ट फ़्लैग डिफ़ॉल्ट मान true है।
  • एंड्रॉइड 10 को लक्षित करने वाले ऐप्स के लिए डिफ़ॉल्ट मान गलत है। एंड्रॉइड 10 को लक्षित करने वाले ऐप्स में फ़िल्टर किए गए स्टोरेज दृश्य से अस्थायी रूप से ऑप्ट आउट करने के लिए, मैनिफ़ेस्ट फ़्लैग के मान को true पर सेट करें।
  • प्रतिबंधित अनुमतियों का उपयोग करते हुए, इंस्टॉलर गैर-सैंडबॉक्स्ड स्टोरेज के लिए अनुमति प्राप्त ऐप्स को श्वेतसूची में डालता है। गैर-श्वेतसूचीबद्ध ऐप्स सैंडबॉक्स किए गए हैं।