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