উদাহরণ

ওভারভিউ

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

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

CRC4

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

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

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

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

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

স্থির

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

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

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

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

টুল

টুলের উদাহরণ হল আপনার নিজস্ব নীতিগুলি তৈরি করার এবং স্যান্ডবক্স 2 এপিআইগুলির সাথে পরীক্ষা করার পাশাপাশি এর বৈশিষ্ট্যগুলির একটি প্রদর্শনের জন্য একটি টুল।

  • 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

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
  • --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() ( Client::WaitAndFork মাধ্যমে) অনুরোধ গ্রহণ করে।
  • custom_fork_sandbox.cc : নির্বাহক, যা একটি কাস্টম ফর্ক সার্ভার শুরু করে। তারপরে এটি (নতুন নির্বাহকদের মাধ্যমে) ( fork() এর মাধ্যমে) নতুন স্যান্ডবক্স তৈরি করার জন্য অনুরোধ পাঠায়।

অন্তর্জাল

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

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

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

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

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

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

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

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

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

ওভারভিউ

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

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

CRC4

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

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

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

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

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

স্থির

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

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

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

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

টুল

টুলের উদাহরণ হল আপনার নিজস্ব নীতিগুলি তৈরি করার এবং স্যান্ডবক্স 2 এপিআইগুলির সাথে পরীক্ষা করার পাশাপাশি এর বৈশিষ্ট্যগুলির একটি প্রদর্শনের জন্য একটি টুল।

  • 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

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
  • --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() ( Client::WaitAndFork মাধ্যমে) অনুরোধ গ্রহণ করে।
  • custom_fork_sandbox.cc : নির্বাহক, যা একটি কাস্টম ফর্ক সার্ভার শুরু করে। তারপরে এটি (নতুন নির্বাহকদের মাধ্যমে) ( fork() এর মাধ্যমে) নতুন স্যান্ডবক্স তৈরি করার জন্য অনুরোধ পাঠায়।

অন্তর্জাল

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

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

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

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

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

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

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

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

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