सैंडबॉक्स2 की जानकारी

Sandbox2 डिज़ाइन जानी-मानी और जानी-मानी टेक्नोलॉजी पर आधारित है. इसमें एक नीति का फ़्रेमवर्क और दो प्रोसेस हैं: Sandbox Executor और Sandboxee.

इस्तेमाल की गई टेक्नोलॉजी

नीचे दिए गए सेक्शन में उन टेक्नोलॉजी के बारे में बताया गया है जो Sandbox2 के लिए बुनियादी लेयर तैयार करती हैं.

Linux नेमस्पेस

Linux नेमस्पेस, ऑपरेटिंग सिस्टम लेवल का वर्चुअलाइज़ेशन उपलब्ध कराने की कोशिश है. हालांकि, एक से ज़्यादा यूज़रस्पेस एक-दूसरे से अलग दिखते हैं, लेकिन वे एक ही कर्नेल इंस्टेंस शेयर करते हैं. Sandbox2 इस तरह के नेमस्पेस का इस्तेमाल करता है:

  • आईपीसी
  • नेटवर्क (जब तक कि PolicyBuilder::AllowUnrestrictedNetworking() को कॉल करके साफ़ तौर पर इसे बंद न किया गया हो)
  • माउंट (फ़ाइल सिस्टम ट्री के कस्टम व्यू का इस्तेमाल करके)
  • पीआईडी
  • उपयोगकर्ता (जब तक कि PolicyBuilder::AllowUnsafeKeepCapabilities() को कॉल करके साफ़ तौर पर इसे बंद न किया गया हो)
  • यूटीएस

Wikipedia या मिलते-जुलते मैन पेज पर Linux नेमस्पेस के बारे में ज़्यादा पढ़ें.

आईपीसी

Sandbox2, Sandbox Executor और गैर-भरोसेमंद Sandboxee के बीच आर्बिट्रेरी डेटा के लेन-देन की अनुमति देता है. इसमें, टाइप-लिंग वैल्यू (टीएलवी) वाले मैसेज, फ़ाइल डिस्क्रिप्टर पास करने, और टोकन और हैंडल के ज़रिए क्रेडेंशियल एक्सचेंज करने की सुविधा काम करती है.

सेककॉम्प-बीपीएफ़

Sandbox2, secCOM-bpf पर निर्भर है, जो कि सिक्योर कंप्यूटिंग मोड (sec Comp) का एक्सटेंशन है. यह syscalls को फ़िल्टर करने के लिए, Berkeley पैकेट फ़िल्टर (BPF) नियमों का उपयोग करने की अनुमति देता है.

sec Comp, Linux kernel की सुविधा है. यह किसी प्रोसेस की सिस्टम कॉल को सिर्फ़ exit, sigreturn, read, और write को मंज़ूरी देने के लिए प्रतिबंधित करता है. अगर कोई प्रोसेस किसी अन्य सिस्टम की मदद से प्रोसेस करने की कोशिश करती है, तो उसे बंद कर दिया जाएगा. sec Comp-bpf एक्सटेंशन, secCOM से ज़्यादा सुविधाजनक होता है. syscalls के तय सेट को अनुमति देने के बजाय, secCOM-bpf सिस्टम सिस्टम डेटा पर BPF प्रोग्राम चलाता है. प्रोग्राम की रिटर्न वैल्यू के आधार पर, यह syscall को एक्ज़ीक्यूट कर सकता है, syscall को छोड़ सकता है और डमी वैल्यू को रिटर्न कर सकता है. साथ ही, प्रोसेस को खत्म कर सकता है, सिग्नल जनरेट कर सकता है या ट्रेसर को सूचना दे सकता है.

प्ट्रेस

ptrace (प्रोसेस ट्रेस) syscall की मदद से, ट्रेसर प्रोसेस की निगरानी और उसे कंट्रोल करने की सुविधा मिलती है. एक बार अटैच होने के बाद, ट्रेसर की प्रोसेस का पूरा कंट्रोल होता है. Wikipedia या इससे जुड़े मैन्युअल पेज पर, ptrace के बारे में ज़्यादा पढ़ें.

सैंडबॉक्स नीति

सैंडबॉक्स नीति, सैंडबॉक्स का सबसे अहम हिस्सा होती है. इससे यह पता चलता है कि सैंडबॉक्स में कौन-कौनसी कार्रवाइयां की जा सकती हैं और कौनसी नहीं. सैंडबॉक्स नीति के दो हिस्से होते हैं:

  • Syscall की नीति
  • Namespace का सेटअप

डिफ़ॉल्ट Syscall नीति

डिफ़ॉल्ट नीति, ऐसे सिस्टम को ब्लॉक करती है जो हमेशा खतरनाक होते हैं. साथ ही, उपयोगकर्ता की ओर से दी गई एक्सटेंडेड पॉलिसी के मुकाबले, इस नीति को प्राथमिकता दी जाती है.

एक्सटेंडेड सिस्कॉल नीति

बढ़ी हुई syscall नीति को बनाने के लिए, हमारी PolicyBuilder क्लास का इस्तेमाल किया जा सकता है. इस क्लास में, सुविधा के कई नियमों के बारे में बताया गया है.जैसे, AllowStaticStartup, AllowDynamicStartup, AllowOpen. इनका इस्तेमाल करके, नीति को बेहतर तरीके से पढ़ा जा सकता है.

अगर आपको syscalls को और सीमित करना है या ज़्यादा जटिल नियमों की ज़रूरत है, तो AddPolicyOnSyscall और AddPolicyOnSyscalls की मदद से रॉ बीपीएफ़ मैक्रो तय करें. crc4 का उदाहरण, read, write, और close सिस्टकॉल के लिए आर्ग्युमेंट को सीमित करने के लिए, इस तरीके का इस्तेमाल करता है.

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

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

Namespace का सेटअप

PolicyBuilder ऑब्जेक्ट का इस्तेमाल, फ़ाइल सिस्टम के Sandboxee के अलग-अलग व्यू को सेट अप करने के लिए भी किया जाता है. सिर्फ़ एक फ़ाइल (AddFile / AddFileAt), पूरी डायरेक्ट्री (AddDirectory / AddDirectoryAt), और अस्थायी स्टोरेज (AddTmpfs) को सैंडबॉक्सी के एनवायरमेंट में मैप किया जा सकता है. इसके अलावा, डाइनैमिक तौर पर लिंक किए गए एक्ज़ीक्यूटेबल तय करने के लिए, सभी ज़रूरी लाइब्रेरी को अपने-आप मैप करने के लिए, AddLibrariesForBinary का इस्तेमाल किया जा सकता है.

कमांड-लाइन फ़्लैग

नीचे दिए गए कमांड लाइन फ़्लैग में से किसी एक को तय करके, किसी भी Sandbox2 नीति को बंद किया जा सकता है. ये फ़्लैग जांच के लिए होते हैं (उदाहरण के लिए, एक्सटेंडेड सिस्कॉल नीति को बेहतर बनाते समय).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

सैंडबॉक्स एक्ज़ीक्यूटर

Sandbox Executor एक ऐसी प्रोसेस है जो खुद सैंडबॉक्स नहीं होती. यह पीट्रेस ट्रेसर की एक प्रोसेस है, जो सैंडबॉक्सी (पीट्रेस ट्रेस प्रोसेस) से जुड़ी होती है. Sandbox Executor एक Monitor इंस्टेंस भी सेट करता है और चलाता है. यह इंस्टेंस Sandboxee को ट्रैक करने के साथ-साथ स्थिति की जानकारी भी देता है.

Sandbox2 में तीन निष्पादन मोड की अनुमति दी जाती है: स्टैंडअलोन, Sandbox2 Forkserver, और कस्टम फ़ोर्कसर्वर. अगर किसी फ़ोर्कसर्वर का इस्तेमाल किया जाता है, तो Sandboxee को Sandbox Executor की चाइल्ड प्रोसेस के तौर पर बनाया जाता है. इन मोड के बारे में यहां विस्तार से बताया गया है.

सैंडबॉक्सी

Sandboxee ऐसी प्रोसेस है जो Sandbox नीति के ज़रिए तय किए गए प्रतिबंधित और सैंडबॉक्स एनवायरमेंट में चलती है. सैंडबॉक्स निरीक्षक, IPC के ज़रिए नीति को Sandboxee को भेजता है. इसके बाद, सैंडबॉक्स नीति को लागू करता है. इस नीति के किसी भी उल्लंघन की वजह से, प्रोसेस को खत्म कर दिया जाएगा, जब तक कि किसी और तरीके से कॉन्फ़िगर न किया गया हो. सैंडबॉक्स नीति देखें.