উদাহরণ

সংক্ষিপ্ত বিবরণ

বিভিন্ন পরিস্থিতিতে কীভাবে স্যান্ডবক্স২ ব্যবহার করতে হয় এবং কীভাবে পলিসি লিখতে হয়, তা দেখানোর জন্য আমরা কয়েকটি উদাহরণ প্রস্তুত করেছি।

আপনি এগুলো //sandboxed_api/sandbox2/examples -এ খুঁজে পাবেন, বিস্তারিত ব্যাখ্যার জন্য নিচে দেখুন।

সিআরসি৪

CRC4 উদাহরণটি হলো একটি CRC4 চেক্সামের ইচ্ছাকৃতভাবে ত্রুটিপূর্ণ গণনা, যা দেখায় কীভাবে অন্য একটি প্রোগ্রামকে স্যান্ডবক্স করা যায় এবং কীভাবে তার সাথে যোগাযোগ করা যায়।

  • crc4bin.cc : যে প্রোগ্রামটিকে আমরা স্যান্ডবক্স করতে চাই (অর্থাৎ স্যান্ডবক্সকৃত প্রোগ্রাম)
  • crc4sandbox.cc : স্যান্ডবক্স প্রোগ্রাম যা এটিকে চালাবে (অর্থাৎ এক্সিকিউটর)।

এটি যেভাবে কাজ করে:

  1. এক্সিকিউটর ::sandbox2::GetDataDependencyFilePath() ব্যবহার করে স্যান্ডবক্সি-কে তার ফাইল পাথ থেকে চালু করে।
  2. এক্সিকিউটর SendBytes() ব্যবহার করে Comms কমিউনিকেশন চ্যানেলের মাধ্যমে স্যান্ডবক্সি-র কাছে ইনপুট পাঠায়।
  3. স্যান্ডবক্সি CRC4 গণনা করে এবং Comms কমিউনিকেশন চ্যানেলের মাধ্যমে এক্সিকিউটরের কাছে তার উত্তর ফেরত পাঠায়, যা RecvUint32() ব্যবহার করে তা গ্রহণ করে।

প্রোগ্রামটি যোগাযোগ করা ( read() এবং write() ) ছাড়া অন্য কোনো সিস্টেম কল করলে, পলিসি লঙ্ঘনের কারণে প্রোগ্রামটি বন্ধ করে দেওয়া হয়।

স্থির

স্ট্যাটিক উদাহরণটি দেখায় কিভাবে একটি স্ট্যাটিক্যালি লিঙ্ক করা বাইনারিকে স্যান্ডবক্স করতে হয়; যেমন একটি থার্ড-পার্টি বাইনারি যার সোর্স আপনার কাছে নেই, অর্থাৎ এটি জানে না যে এটিকে স্যান্ডবক্স করা হবে।

  • static_bin.cc : স্যান্ডবক্সি হলো একটি স্ট্যাটিক সি বাইনারি যা স্ট্যান্ডার্ড ইনপুট থেকে ASCII টেক্সটকে আপারকেসে রূপান্তর করে।
  • static_sandbox.cc : এক্সিকিউটর, যা তার পলিসি, লিমিট এবং স্যান্ডবক্সি ইনপুটের জন্য একটি ফাইল ডেসক্রিপ্টর ব্যবহার করে।

এটি যেভাবে কাজ করে:

  1. এক্সিকিউটর, CRC4-এর মতোই, GetDataDependencyFilepath ব্যবহার করে স্যান্ডবক্সি-কে তার ফাইল পাথ থেকে চালু করে।
  2. এটি সীমা নির্ধারণ করে, /proc/version এ একটি ফাইল ডেসক্রিপ্টর খোলে, এবং MapFd ব্যবহার করে স্যান্ডবক্সিতে ম্যাপ করার জন্য এটিকে চিহ্নিত করে।
  3. এই পলিসিটি কিছু সিস্টেম কলকে ( open ) পলিসি লঙ্ঘনের কারণে বন্ধ হয়ে যাওয়ার পরিবর্তে একটি এরর ( ENOENT ) রিটার্ন করার অনুমতি দেয়। এটি কোনো থার্ড-পার্টি প্রোগ্রামকে স্যান্ডবক্স করার ক্ষেত্রে কার্যকর হতে পারে, যেখানে আমরা কোন সিস্টেম কলগুলো করা হবে তা পরিবর্তন করতে পারি না, তাই এর পরিবর্তে আমরা সেগুলোকে সুন্দরভাবে ব্যর্থ করে দিতে পারি।

সরঞ্জাম

টুল উদাহরণটি আপনার নিজস্ব পলিসি তৈরি করতে ও Sandbox2 API নিয়ে পরীক্ষা-নিরীক্ষা করার একটি মাধ্যম, এবং একই সাথে এটি এর বৈশিষ্ট্যগুলোর একটি প্রদর্শনী।

  • sandbox2tool.cc : যে এক্সিকিউটরটি প্রদর্শন করছে:
    • কীভাবে স্যান্ডবক্সড অবস্থায় আরেকটি বাইনারি চালানো যায়,
    • কীভাবে ফাইলসিস্টেম চেক সেট আপ করতে হয়, এবং
    • কীভাবে এক্সিকিউটর স্যান্ডবক্সি-কে অ্যাসিঙ্ক্রোনাসভাবে চালিয়ে এর আউটপুট ক্রমান্বয়ে পড়তে পারে।

নিজেই চেষ্টা করে দেখুন:

বাজেল

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

গুগল৩ (ব্লেজ)

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 ব্যবহার করা হয়।
  • --sandbox2tool_additional_bind_mounts <PATHS> স্যান্ডবক্স ব্যবহারকারীর জন্য অতিরিক্ত ডিরেক্টরি উপলব্ধ করতে।
  • বর্তমান এনভায়রনমেন্ট ভেরিয়েবলগুলো রাখার জন্য --sandbox2tool_keep_env করুন
  • --sandbox2tool_redirect_fd1 স্যান্ডবক্সি STDOUT_FILENO (1) গ্রহণ করতে এবং স্থানীয়ভাবে আউটপুট করতে।
  • সেকেন্ডে সিপিইউ টাইমআউট সেট করতে --sandbox2tool_cpu_timeout ব্যবহার করুন।
  • --sandbox2tool_walltime_timeout সেকেন্ডে ওয়াল-টাইম টাইমআউট সেট করতে ব্যবহৃত হয়।
  • --sandbox2tool_file_size_creation_limit তৈরি করা ফাইলগুলির সর্বোচ্চ আকার নির্ধারণ করতে।
  • স্যান্ডবক্সের বর্তমান ওয়ার্কিং ডিরেক্টরি সেট করতে --sandbox2tool_cwd ব্যবহার করুন।

কাস্টম_ফর্ক

custom_fork উদাহরণটি দেখায় কিভাবে একটি স্যান্ডবক্স তৈরি করতে হয়, যা বাইনারিটি ইনিশিয়ালাইজ করবে এবং তারপর প্যারেন্ট এক্সিকিউটরের কাছ থেকে আসা fork() রিকোয়েস্টের জন্য অপেক্ষা করবে।

এই মোডটি অন্যান্য ধরণের স্যান্ডবক্সিংয়ের তুলনায় সম্ভাব্যভাবে উন্নত পারফরম্যান্স প্রদান করে, কারণ এখানে স্যান্ডবক্সি-র নতুন ইনস্ট্যান্স তৈরি করার জন্য নতুন বাইনারি এক্সিকিউট করার প্রয়োজন হয় না, শুধু বিদ্যমান বাইনারিগুলোকেই ফোর্ক করলেই চলে।

  • custom_fork_bin.cc : কাস্টম ফর্ক-সার্ভার, যা নতুন স্যান্ডবক্স তৈরি করার জন্য fork() ( ForkingClient::EnterForkLoop এর মাধ্যমে) অনুরোধ গ্রহণ করে।
  • custom_fork_sandbox.cc : এটি সেই এক্সিকিউটর, যা একটি কাস্টম ফর্ক সার্ভার চালু করে। তারপর এটি (নতুন এক্সিকিউটরদের মাধ্যমে) নতুন স্যান্ডবক্স তৈরি করার জন্য ( fork() এর মাধ্যমে) অনুরোধ পাঠায়।

নেটওয়ার্ক

নেটওয়ার্ক নেমস্পেস, যা ডিফল্টরূপে সক্রিয় থাকে, স্যান্ডবক্সড প্রসেসটিকে বহির্বিশ্বের সাথে সংযোগ স্থাপন করতে বাধা দেয়। এই উদাহরণটি দেখায় কিভাবে এই সমস্যার সমাধান করা যায়।

এক্সিকিউটরের ভিতরে একটি সংযোগ শুরু করা হয় এবং ফলস্বরূপ সকেটটি ::sandbox2::Comms::SendFD() এর মাধ্যমে পাঠানো হয়। স্যান্ডবক্সি ::sandbox2::Comms::RecvFD() ব্যবহার করে সকেটটি গ্রহণ করে এবং তারপর এটি স্বাভাবিকভাবে ডেটা আদান-প্রদানের জন্য এই সকেটটি ব্যবহার করতে পারে।

  • network_bin.cc : যে প্রোগ্রামটিকে আমরা স্যান্ডবক্স করতে চাই (অর্থাৎ যাকে স্যান্ডবক্স করা হবে)।
  • network_sandbox.cc : স্যান্ডবক্স প্রোগ্রাম যা এটিকে চালাবে (অর্থাৎ এক্সিকিউটর)।

নেটওয়ার্ক_প্রক্সি

এই উদাহরণটি একটি নেটওয়ার্ক নেমস্পেস পরিচালনার একটি বিকল্প পদ্ধতি প্রদর্শন করে। অভ্যন্তরীণভাবে, এটি উপরের উদাহরণটির মতোই হুবহু কাজ করে, কিন্তু এটিকে আরও সুবিধাজনক একটি API হিসেবে প্রকাশ করা হয়েছে।

স্যান্ডবক্সি দুটি ভিন্ন উপায়ে নেটওয়ার্ক সংযোগ স্থাপন করতে পারে:

  • স্বয়ংক্রিয় – একটি স্বয়ংক্রিয় হ্যান্ডলার ইনস্টল করে এবং তারপর নিয়মিত কানেক্ট কল জারি করার মাধ্যমে।
  • ম্যানুয়াল – একটি NetworkProxyClient সংগ্রহ করে এবং সরাসরি NetworkProxyClient::Connect ব্যবহার করে।

এই উদাহরণে উভয় পদ্ধতিই দেখানো হয়েছে। connect_with_handler ফ্ল্যাগটি সেট করা থাকলে অটোমেটিক মোড ব্যবহৃত হয়, অন্যথায় ম্যানুয়াল মোড ব্যবহৃত হয়।

  • network_bin.cc : যে প্রোগ্রামটিকে আমরা স্যান্ডবক্স করতে চাই (অর্থাৎ যাকে স্যান্ডবক্স করা হবে)।
  • network_sandbox.cc : স্যান্ডবক্স প্রোগ্রাম যা এটিকে চালাবে (এক্সিকিউটর)।