उदाहरण

खास जानकारी

हमने कुछ उदाहरण तैयार किए हैं. इनसे यह पता चलता है कि अलग-अलग स्थितियों में 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_bin.cc: Sandboxee, स्टैटिक सी बाइनरी है. यह स्टैंडर्ड इनपुट से मिले ASCII टेक्स्ट को अपरकेस में बदलता है.
  • static_sandbox.cc: यह एक्ज़ीक्यूटर है. इसमें नीति, सीमाएं, और सैंडबॉक्सी के इनपुट के लिए फ़ाइल डिस्क्रिप्टर का इस्तेमाल किया जाता है.

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

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

टूल

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

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

custom_fork

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

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

  • custom_fork_bin.cc: यह कस्टम फ़ोर्क-सर्वर है. यह नए सैंडबॉक्सी को स्पॉन करने के लिए, Client::WaitAndFork के ज़रिए fork() के अनुरोधों को स्वीकार करता है.
  • 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: सैंडबॉक्स प्रोग्राम, जो इसे (एक्ज़ीक्यूटर) चलाएगा.