उदाहरण

खास जानकारी

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

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

CRC4

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

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

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

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

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

static

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

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

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

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

टूल

टूल का उदाहरण, अपनी नीतियां बनाने और 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 + Ninja

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

Google3 (Blaze)

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

custom_fork

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

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

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

नेटवर्क

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

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

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

network_proxy

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

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

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

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

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