कैपेबिलिटी की मदद से, Linux प्रोसेस को रूट-जैसे ज़्यादातर विशेषाधिकारों को छोड़ने की अनुमति मिलती है. हालांकि, वे अपने फ़ंक्शन को पूरा करने के लिए ज़रूरी विशेषाधिकारों के सबसेट को बनाए रखती हैं. सुविधाओं को लागू करने के मूल तरीके की वजह से, fork+exec'd प्रोसेस के लिए सुविधाओं को इनहेरिट करना मुमकिन नहीं था. ऐसा तब तक होता था, जब तक कि फ़ाइलें चलाने के लिए फ़ाइल की सुविधाएं कॉन्फ़िगर न की गई हों. फ़ाइल की क्षमताओं से सुरक्षा से जुड़ा जोखिम पैदा होता है, क्योंकि फ़ाइल की क्षमताओं के साथ किसी फ़ाइल को एक्ज़ीक्यूट करने वाली कोई भी प्रोसेस, उन क्षमताओं को हासिल कर सकती है.
ऐम्बिएंट सुविधाओं की मदद से, init की ओर से लॉन्च की गई सिस्टम सेवाएं, अपनी .rc फ़ाइलों में सुविधाओं को कॉन्फ़िगर कर सकती हैं. इससे कॉन्फ़िगरेशन को .rc फ़ाइल में अलग-अलग हिस्सों में बांटने के बजाय, एक ही फ़ाइल में कॉन्फ़िगर किया जा सकता है.fs_config.c इसका मतलब है कि init की ओर से लॉन्च की गई किसी भी सेवा के लिए, सेवा से जुड़ी .rc फ़ाइल का इस्तेमाल करके, उस सेवा के लिए क्षमताओं को कॉन्फ़िगर किया जा सकता है.
init फ़ंक्शन से लॉन्च की गई सेवाओं के लिए, क्षमताओं को सेट करने का सबसे अच्छा तरीका, आस-पास की सुविधाओं का इस्तेमाल करना है. इस तरीके से, सेवा के कॉन्फ़िगरेशन से जुड़े सभी पहलुओं को एक ही .rc फ़ाइल में रखा जाता है. हमारा सुझाव है कि config.fs फ़ाइलों में, कैप्स सेक्शन का इस्तेमाल करके फ़ाइल सिस्टम की सुविधाओं को कॉन्फ़िगर करने के बजाय, परिवेश की सुविधाओं का इस्तेमाल करें.
init से लॉन्च नहीं की गई सेवाओं के लिए सुविधाएं सेट करते समय,
fs_config.c का इस्तेमाल करके फ़ाइल सिस्टम की सुविधाओं को कॉन्फ़िगर करना जारी रखें.
ऐंबियंट मोड की सुविधाएं चालू करना
किसी सेवा के लिए आस-पास की सुविधाओं को चालू करने के लिए, init में capabilities कीवर्ड का इस्तेमाल करें. मौजूदा init भाषा की जानकारी के लिए, init README.md देखें.
उदाहरण के लिए, AOSP सेवा के लिए आस-पास की सुविधाओं को चालू करने के लिए
wificond, wificond सेवा के लिए .rc फ़ाइल सही उपयोगकर्ता और ग्रुप सेट अप करती है. साथ ही, capabilities कीवर्ड का इस्तेमाल करके, सेवा को तय की गई सुविधाएं देती है:
service wificond /system/bin/wificond
class main
user wifi
group wifi net_raw net_admin
capabilities NET_RAW NET_ADMINरेफ़रंस के तौर पर लागू करना
रेफ़रंस के तौर पर लागू किया गया Android का सामान्य कर्नेल https://android.googlesource.com/kernel/common/ है
ज़रूरी पैच
ज़रूरी पैच को Android के सभी काम के कॉमन कर्नल वर्शन में बैकपोर्ट कर दिया गया है.
मुख्य एंबियंट क्षमताओं वाला पैच https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 को इन वर्शन में वापस पोर्ट किया गया है:
- android-3.18:
- android-4.1:
सुरक्षा से जुड़ी एक छोटी समस्या को ठीक करने के लिए, https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 को इन वर्शन में वापस पोर्ट किया गया है:
- android-3.18:
- android-4.1:
सत्यापन
Bionic यूनिट टेस्ट में, आस-पास की सुविधाओं के लिए यूनिट टेस्ट शामिल होते हैं. इसके अलावा, किसी सेवा के लिए Android init में "capabilities" कीवर्ड का इस्तेमाल किया जा सकता है. इसके बाद, यह जांच की जा सकती है कि सेवा को उम्मीद के मुताबिक सुविधाएं मिली हैं या नहीं. इससे इस सुविधा की रनटाइम टेस्टिंग की जा सकेगी.