উদাহরণ

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

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

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

সিআরসি৪

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

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

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

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

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

স্থির

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

  • static_bin.cc : স্যান্ডবক্সি হল একটি স্ট্যাটিক C বাইনারি যা 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

সিমেক + নিনজা

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

পতাকা:

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