उदाहरण

खास जानकारी

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

ये उदाहरण, //sandboxed_api/sandbox2/examples में मौजूद हैं. इनके बारे में ज़्यादा जानकारी के लिए, नीचे दिया गया सेक्शन देखें.

CRC4

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

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

यह कैसे काम करता है:

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

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

static

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

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

यह कैसे काम करता है:

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

tool

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

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

इसे खुद आज़माएं:

Bazel

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

CMake + निंजा

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

फ़्लैग:

  • सैंडबॉक्सी के लिए ज़रूरी लाइब्रेरी को हल करने और माउंट करने के लिए, --sandbox2tool_resolve_and_add_libraries
  • सैंडबॉक्सी के लिए अतिरिक्त डायरेक्ट्री उपलब्ध कराने के लिए, --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() के अनुरोधों को रिसीव करता है. यह काम, ForkingClient::EnterForkLoop के ज़रिए किया जाता है.
  • custom_fork_sandbox.cc: एक्ज़ीक्यूटर, जो कस्टम फ़ोर्क सर्वर शुरू करता है. इसके बाद, यह नए सैंडबॉक्सी को स्पॉन करने के लिए, नए एक्ज़ीक्यूटर के ज़रिए, fork() के अनुरोध भेजता है.

network

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

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

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

network_proxy

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

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

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

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

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