उदाहरण

खास जानकारी

हमने कुछ उदाहरण देकर यह दिखाया है कि अलग-अलग स्थितियों में Sandbox2 को इस्तेमाल करने और नीतियां लिखने के तरीके के बारे में कैसे बताया जाए.

उन्हें //sandboxed_api/sandbox2/examples पेज पर देखा जा सकता है. पूरी जानकारी के लिए नीचे देखें.

CRC4

CRC4 का उदाहरण, सीआरसी4 चेकसम का जान-बूझकर किया गया कैलकुलेशन है, जिससे यह पता चलता है कि किसी अन्य प्रोग्राम को सैंडबॉक्स कैसे करना है और उससे कैसे संपर्क करना है.

  • crc4bin.cc: वह प्रोग्राम जिसे हम सैंडबॉक्स करना चाहते हैं (जैसे कि Sandboxee)
  • crc4sandbox.cc: वह सैंडबॉक्स प्रोग्राम जो इसे चलेगा (यानी कि एक्सक्यूटर).

यह सुविधा कैसे काम करती है:

  1. एक्ज़ीक्यूटर, ::sandbox2::GetDataDependencyFilePath() का इस्तेमाल करके Sandboxee को उसके फ़ाइल पाथ से शुरू करता है.
  2. एक्ज़ीक्यूटर, SendBytes() का इस्तेमाल करके Comms कम्यूनिकेशन चैनल पर Sandboxee को इनपुट भेजता है.
  3. Sandboxee, CRC4 का हिसाब लगाता है और निर्देश देने वाले को RecvUint32() के साथ मिलने वाले कम्यूनिकेशन चैनल Comms पर अपना जवाब वापस भेजता है.

अगर इस प्रोग्राम में, बातचीत करने (read() और write()) के अलावा किसी अन्य तरीके का इस्तेमाल किया जाता है, तो नीति के उल्लंघन की वजह से इसे बंद कर दिया जाता है.

स्थिर

यह स्टैटिक उदाहरण दिखाता है कि स्टैटिक रूप से लिंक की गई बाइनरी को सैंडबॉक्स कैसे करें. उदाहरण के लिए, तीसरे पक्ष की ऐसी बाइनरी को सैंडबॉक्स कैसे करें जिसका सोर्स आपके पास नहीं है, इसका मतलब है कि उसे पता नहीं है कि इसे सैंडबॉक्स किया जाएगा.

  • static_bin.cc: Sandboxee एक स्टैटिक सी बाइनरी है. यह ASCII टेक्स्ट को स्टैंडर्ड इनपुट से अपरकेस में बदलता है.
  • static_sandbox.cc: यह एक्सक्यूटर अपनी नीति, सीमाओं, और Sandboxee इनपुट के लिए फ़ाइल डिस्क्रिप्टर का इस्तेमाल करने के साथ काम करता है.

यह सुविधा कैसे काम करती है:

  1. एक्ज़ीक्यूटर, CRC4 की तरह ही GetDataDependencyFilepath का इस्तेमाल करके, Sandboxee को अपने फ़ाइल पाथ से शुरू करता है.
  2. यह सीमाएं सेट करता है और /proc/version पर फ़ाइल डिस्क्रिप्टर खोलता है. साथ ही, इसे MapFd के साथ सैंडबॉक्सी में मैप करने के लिए मार्क करता है.
  3. यह नीति कुछ syscalls (open) को नीति के उल्लंघन की वजह से खत्म होने के बजाय, गड़बड़ी (ENOENT) दिखाने की अनुमति देती है. यह किसी तीसरे पक्ष के प्रोग्राम को सैंडबॉक्स करते समय काम का हो सकता है, जहां हम कौनसे सिस्टम कॉल करने के लिए बदलाव नहीं कर सकते, ताकि हम उन्हें बिना किसी परेशानी के कार्रवाई कर सकें.

टूल

इस टूल का उदाहरण, अपनी नीतियां बनाने और Sandbox2 API के साथ प्रयोग करने के लिए एक टूल है. साथ ही, इसकी मदद से इसकी सुविधाओं को भी दिखाया जा सकता है.

  • sandbox2tool.cc: यह प्रोसेस करने वाला व्यक्ति, यह जानकारी दिखा रहा है:
    • अन्य बाइनरी सैंडबॉक्स को चलाने का तरीका क्या है,
    • फ़ाइल सिस्टम की जांच कैसे सेट अप करें, और
    • एक्ज़ीक्यूटर, Sandboxee को एसिंक्रोनस तरीके से कैसे चला सकता है, ताकि उसके आउटपुट को धीरे-धीरे पढ़ा जा सके.

खुद आज़माकर देखें:

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

सीएम निंजा और निंजा

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (ब्लेज़)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

फ़्लैग:

  • Sandboxee के लिए ज़रूरी लाइब्रेरी को ठीक और माउंट करने के लिए --sandbox2tool_resolve_and_add_libraries
  • Sandboxee को अतिरिक्त डायरेक्ट्री उपलब्ध कराने के लिए --sandbox2tool_additional_bind_mounts <PATHS>
  • मौजूदा एनवायरमेंट वैरिएबल को बनाए रखने के लिए --sandbox2tool_keep_env
  • सैंडबॉक्सी STDOUT_FILENO (1) पाने और उसे स्थानीय तौर पर आउटपुट करने के लिए --sandbox2tool_redirect_fd1
  • सीपीयू का टाइम आउट सेकंड में सेट करने के लिए --sandbox2tool_cpu_timeout
  • वॉल-टाइम टाइम आउट को सेकंड में सेट करने के लिए --sandbox2tool_walltime_timeout
  • बनाई गई फ़ाइलों का ज़्यादा से ज़्यादा साइज़ सेट करने के लिए --sandbox2tool_file_size_creation_limit
  • सैंडबॉक्स की मौजूदा वर्किंग डायरेक्ट्री सेट करने के लिए --sandbox2tool_cwd

custom_fork

custom_fork के उदाहरण में, सैंडबॉक्स बनाने का तरीका बताया गया है. इससे बाइनरी फ़ाइल शुरू हो जाएगी. इसके बाद, पैरंट एक्ज़ीक्यूटर से fork() के अनुरोध मिलने का इंतज़ार करें.

यह मोड अन्य तरह के सैंडबॉक्सिंग की वजह से, परफ़ॉर्मेंस को बेहतर बना सकता है. ऐसा इसलिए, क्योंकि यहां सैंडबॉक्स के नए इंस्टेंस बनाने के लिए नई बाइनरी को एक्ज़ीक्यूट करने की ज़रूरत नहीं होती है. यह सिर्फ़ मौजूदा बाइनरी को फ़ोर्क करता है

  • custom_fork_bin.cc: यह कस्टम फ़ोर्क-सर्वर है, जो नए सैंडबॉक्स उपयोगकर्ताओं को बढ़ाने के लिए, fork() (Client::WaitAndFork के ज़रिए) को अनुरोध भेजता है.
  • custom_fork_sandbox.cc: यह एक टूल है, जो कस्टम फ़ोर्क सर्वर को शुरू करता है. इसके बाद, यह नए सैंडबॉक्स उपयोगकर्ता की संख्या बढ़ाने (fork() के ज़रिए) के लिए, नए एक्ज़ीक्यूटर की मदद से अनुरोध भेजता है.

नेटवर्क

डिफ़ॉल्ट रूप से चालू होने वाला नेटवर्क नेमस्पेस, सैंडबॉक्स की गई प्रोसेस को बाहरी दुनिया से कनेक्ट होने से रोकता है. इस उदाहरण में इस समस्या से निपटने का तरीका बताया गया है.

एक्सपोर्टर के अंदर कनेक्शन शुरू किया जाता है और नतीजे के तौर पर मिला सॉकेट ::sandbox2::Comms::SendFD() के ज़रिए पास किया जाता है. Sandboxee, ::sandbox2::Comms::RecvFD() का इस्तेमाल करके सॉकेट पाता है. इसके बाद, वह इस सॉकेट को सामान्य तरीके से डेटा शेयर करने के लिए इस्तेमाल कर सकता है.

  • network_bin.cc: वह प्रोग्राम जिसे हम सैंडबॉक्स करना चाहते हैं (जैसे कि Sandboxee).
  • network_sandbox.cc: यह सैंडबॉक्स प्रोग्राम है, जो इसे चलाता है (यानी एक्सक्यूटर).

network_proxy

यह उदाहरण, नेटवर्क नेमस्पेस के साथ काम करने का दूसरा तरीका दिखाता है. अंदरूनी तौर पर, यह ऊपर दिए गए उदाहरण की तरह ही काम करता है, लेकिन यह ज़्यादा सुविधाजनक एपीआई के तौर पर दिखाया जाता है.

Sandboxee दो अलग-अलग तरीकों से नेटवर्क कनेक्शन बना सकता है:

  • ऑटोमैटिक – एक ऑटोमैटिक हैंडलर इंस्टॉल करने के बाद नियमित कनेक्ट कॉल जारी करके.
  • मैन्युअलNetworkProxyClient पाकर और सीधे NetworkProxyClient::Connect का इस्तेमाल करके.

इस उदाहरण में दोनों तरीके दिखाए गए हैं. connect_with_handler फ़्लैग सेट होने पर, ऑटोमैटिक मोड का इस्तेमाल किया जाता है. ऐसा न होने पर, मैन्युअल मोड का इस्तेमाल किया जाता है.

  • network_bin.cc: वह प्रोग्राम जिसे हम सैंडबॉक्स करना चाहते हैं (जैसे कि Sandboxee).
  • network_sandbox.cc: यह सैंडबॉक्स प्रोग्राम (एक्ज़िक्यूटर) को चलाता है.