Sandbox2 का डिज़ाइन, जानी-मानी और भरोसेमंद टेक्नोलॉजी, नीति के फ़्रेमवर्क, और दो प्रोसेस पर आधारित है: सैंडबॉक्स एक्ज़ीक्यूटर और सैंडबॉक्सी.
इस्तेमाल की गई टेक्नोलॉजी
नीचे दिए गए सेक्शन में, उन टेक्नोलॉजी के बारे में बताया गया है जो Sandbox2 के लिए बुनियादी लेयर बनाती हैं.
Linux नेमस्पेस
Linux नेमस्पेस, ऑपरेटिंग सिस्टम लेवल पर वर्चुअलाइज़ेशन उपलब्ध कराने की कोशिश करते हैं. एक से ज़्यादा यूज़रस्पेस, एक-दूसरे से अलग काम करते हैं. हालांकि, ये सभी एक ही कर्नल इंस्टेंस को शेयर करते हैं. Sandbox2, इस तरह के नेमस्पेस का इस्तेमाल करता है:
- आईपीसी
- नेटवर्क (जब तक कि कॉल करने वाले व्यक्ति ने
PolicyBuilder::AllowUnrestrictedNetworking()
को साफ़ तौर पर बंद न किया हो) - माउंट करें (फ़ाइल सिस्टम ट्री के कस्टम व्यू का इस्तेमाल करके)
- पीआईडी
- उपयोगकर्ता
- UTS
Wikipedia पर या इससे जुड़े मैन पेज पर, Linux नेमस्पेस के बारे में ज़्यादा पढ़ें.
आईपीसी
Sandbox2, Sandbox Executor और Sandboxee के बीच किसी भी तरह के डेटा को ट्रांसफ़र करने की अनुमति देता है. यह टाइप-लेंथ-वैल्यू (टीएलवी) मैसेज, फ़ाइल डिस्क्रिप्टर पास करने, और टोकन और हैंडल के ज़रिए क्रेडेंशियल एक्सचेंज करने की सुविधा देता है.
Seccomp-BPF
Sandbox2, seccomp-bpf पर निर्भर करता है. यह Secure Computing Mode (seccomp) का एक्सटेंशन है. इसकी मदद से, Berkeley Packet Filter (BPF) के नियमों का इस्तेमाल करके, syscalls को फ़िल्टर किया जा सकता है.
seccomp, Linux कर्नल की एक सुविधा है. यह किसी प्रोसेस के सिस्टम कॉल को सीमित करती है, ताकि सिर्फ़ exit
, sigreturn
, read
, और write
को अनुमति दी जा सके. अगर कोई प्रोसेस किसी दूसरे सिसकॉल को
एक्ज़ीक्यूट करने की कोशिश करती है, तो उसे बंद कर दिया जाएगा. seccomp-bpf एक्सटेंशन, seccomp की तुलना में ज़्यादा सुविधाएं देता है. सिस्टम कॉल के तय किए गए सेट को अनुमति देने के बजाय, seccomp-bpf, सिस्टम कॉल के डेटा पर बीपीएफ़ प्रोग्राम चलाता है. साथ ही, प्रोग्राम की रिटर्न वैल्यू के आधार पर, यह सिस्टम कॉल को लागू कर सकता है, सिस्टम कॉल को स्किप करके डमी वैल्यू दिखा सकता है, प्रोसेस को खत्म कर सकता है, सिग्नल जनरेट कर सकता है या ट्रेसर को सूचना दे सकता है.
Ptrace
ptrace (प्रोसेस ट्रेस) syscall, ऐसी सुविधा देता है जिसकी मदद से ट्रेसर प्रोसेस, ट्रेस की जा रही प्रोसेस के एक्ज़ीक्यूशन को देख सकती है और उसे कंट्रोल कर सकती है. ट्रेसर प्रोसेस के पास, अटैच होने के बाद ट्रेस किए जा रहे प्रोसेस का पूरा कंट्रोल होता है. Wikipedia या इससे जुड़े मैन पेज पर, ptrace के बारे में ज़्यादा पढ़ें.
सैंडबॉक्स से जुड़ी नीति
सैंडबॉक्स की नीति, सैंडबॉक्स का सबसे अहम हिस्सा होती है. इसमें उन कार्रवाइयों के बारे में बताया जाता है जिन्हें सैंडबॉक्सी कर सकता है और जिन्हें नहीं किया जा सकता. सैंडबॉक्स की नीति के दो हिस्से होते हैं:
- सिस्कॉल नीति
- नेमस्पेस सेटअप करना
सिस्कॉल की डिफ़ॉल्ट नीति
डिफ़ॉल्ट नीति, ऐसे सिसकॉल को ब्लॉक करती है जो हमेशा खतरनाक होते हैं. साथ ही, यह उपयोगकर्ता की ओर से दी गई एक्सटेंडेड नीति के मुकाबले ज़्यादा प्राथमिकता रखती है.
Extended Syscall Policy
एक्सटेंड की गई syscall नीति को हमारी PolicyBuilder क्लास का इस्तेमाल करके बनाया जा सकता है. यह क्लास, कई सुविधाजनक नियमों (जैसे, AllowStaticStartup
, AllowDynamicStartup
, AllowOpen
) के बारे में बताती है. इनका इस्तेमाल करके, अपनी नीति को ज़्यादा आसानी से पढ़ा जा सकता है.
अगर आपको सिस्टम कॉल को और सीमित करना है या ज़्यादा मुश्किल नियमों की ज़रूरत है, तो AddPolicyOnSyscall
और AddPolicyOnSyscalls
का इस्तेमाल करके, रॉ बीपीएफ़ मैक्रो तय किए जा सकते हैं. crc4 उदाहरण में, इस तरीके का इस्तेमाल किया गया है. इससे read
, write
, और close
syscall के लिए आर्ग्युमेंट को सीमित किया जा सकता है.
आम तौर पर, सैंडबॉक्स नीति जितनी ज़्यादा पाबंदियां लगाती है उतनी ही बेहतर होती है. ऐसा इसलिए, क्योंकि कोड में मौजूद किसी भी कमज़ोरी का फ़ायदा उठाने की कोशिश को नीति के तहत सीमित किया जाएगा. अगर आपको यह पता है कि प्रोग्राम को सामान्य तरीके से चलाने के लिए, किन सिसकॉल और आर्ग्युमेंट की ज़रूरत है, तो कोड एक्ज़ीक्यूट करने की कमज़ोरी का फ़ायदा उठाने वाला कोई भी हमलावर, उन्हीं सीमाओं के तहत काम कर पाएगा.
सैंडबॉक्स की सख्त नीति के तहत, स्टैंडर्ड इनपुट और आउटपुट फ़ाइल डिस्क्रिप्टर पर पढ़ने और लिखने के अलावा, सभी सिसकॉल को अस्वीकार किया जा सकता है. इस सैंडबॉक्स में, कोई प्रोग्राम इनपुट ले सकता है, उसे प्रोसेस कर सकता है, और आउटपुट दे सकता है. हालांकि, अगर प्रोसेस किसी अन्य सिसकॉल को करने की कोशिश करती है, तो नीति के उल्लंघन की वजह से उसे बंद कर दिया जाएगा. इसलिए, अगर प्रोसेस से समझौता किया जाता है (किसी दुर्भावनापूर्ण उपयोगकर्ता की ओर से कोड को एक्ज़ीक्यूट किया जाता है), तो यह खराब आउटपुट देने के अलावा और कुछ नहीं कर सकता. हालांकि, एक्ज़ीक्यूट करने वाले और अन्य लोगों को अब भी इसे सही तरीके से हैंडल करना होगा.
नेमस्पेस सेटअप करना
PolicyBuilder ऑब्जेक्ट का इस्तेमाल, सैंडबॉक्सी के फ़ाइल सिस्टम के अलग-अलग व्यू को सेट अप करने के लिए भी किया जाता है. सैंडबॉक्सी के एनवायरमेंट में, सिंगल फ़ाइलें (AddFile
/ AddFileAt
), पूरी डायरेक्ट्री (AddDirectory
/ AddDirectoryAt
), और साथ ही, अस्थायी स्टोरेज (AddTmpfs
) को मैप किया जा सकता है. इसके अलावा, AddLibrariesForBinary
का इस्तेमाल करके, डाइनैमिक तरीके से लिंक किए गए एक्ज़ीक्यूटेबल के लिए ज़रूरी सभी लाइब्रेरी को अपने-आप मैप किया जा सकता है.
कमांड-लाइन फ़्लैग
इनमें से किसी एक कमांड-लाइन फ़्लैग को सेट करके, Sandbox2 की किसी भी नीति को बंद किया जा सकता है. इन फ़्लैग का इस्तेमाल टेस्टिंग के लिए किया जाता है. उदाहरण के लिए, एक्सटेंडेड सिसकॉल नीति को बेहतर बनाते समय.
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
सैंडबॉक्स मैनेजर
Sandbox Executor एक ऐसी प्रोसेस है जिसे सैंडबॉक्स नहीं किया गया है. यह ptrace ट्रेसर प्रोसेस है, जो Sandboxee (ptrace tracee प्रोसेस) से अटैच होती है. सैंडबॉक्स एक्ज़ीक्यूटर, मॉनिटर इंस्टेंस को भी सेट अप और चलाता है. यह इंस्टेंस, सैंडबॉक्सी को ट्रैक करता है और उसकी स्थिति के बारे में जानकारी देता है.
Sandbox2 में, एक्ज़ीक्यूशन के तीन मोड इस्तेमाल किए जा सकते हैं: स्टैंड-अलोन, Sandbox2 फ़ोर्कसर्वर, और कस्टम फ़ोर्कसर्वर. forkserver का इस्तेमाल करने पर, Sandboxee को Sandbox Executor की चाइल्ड प्रोसेस के तौर पर बनाया जाता है. इन मोड के बारे में यहां ज़्यादा जानकारी दी गई है.
Sandboxee
सैंडबॉक्सी, एक ऐसी प्रोसेस है जो प्रतिबंधित और सैंडबॉक्स किए गए एनवायरमेंट में चलती है. इस एनवायरमेंट को सैंडबॉक्स नीति के तहत तय किया गया था. सैंडबॉक्स एक्ज़ीक्यूटर, आईपीसी के ज़रिए सैंडबॉक्सी को नीति भेजता है. इसके बाद, Sandboxee नीति लागू करता है. नीति का कोई भी उल्लंघन होने पर, प्रोसेस बंद कर दी जाएगी. हालांकि, इसे कॉन्फ़िगर किया जा सकता है (सैंडबॉक्स की नीति देखें).