প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী

আমি কি সুতা ব্যবহার করতে পারি?

হ্যাঁ, স্যান্ডবক্স২-এ থ্রেড সমর্থিত।

সমস্ত থ্রেড স্যান্ডবক্সড হতে হবে।

লিনাক্সের কার্যপ্রণালীর কারণে, seccomp-bpf পলিসিটি শুধুমাত্র বর্তমান থ্রেডেই প্রয়োগ করা হয়: এর মানে হলো, পলিসিটি অন্য কোনো বিদ্যমান থ্রেডে প্রয়োগ করা হয় না, কিন্তু ভবিষ্যতের থ্রেডগুলো এই পলিসিটি উত্তরাধিকারসূত্রে পাবে।

  • আপনি যদি স্যান্ডবক্স২-এর প্রথম মোডটি ব্যবহার করেন, যেখানে execve() এর আগে স্যান্ডবক্সিং সক্রিয় করা হয়, তাহলে সমস্ত থ্রেড পলিসিটি গ্রহণ করবে এবং এতে কোনো সমস্যা হবে না। এটিই স্যান্ডবক্সিংয়ের সবচেয়ে পছন্দের মোড।
  • যদি আপনি দ্বিতীয় মোডটি ব্যবহার করেন, যেখানে এক্সিকিউটর set_enable_sandbox_before_exec(false) করেছে এবং স্যান্ডবক্সি (Sandboxee SandboxMeHere() ব্যবহার করে এক্সিকিউটরকে জানায় যে সে কখন স্যান্ডবক্সড হতে চায়, তাহলে নিশ্চিত করুন যে ফিল্টারটি সমস্ত থ্রেডে প্রয়োগ করা হয়েছে। অন্যথায়, স্যান্ডবক্স এস্কেপের ঝুঁকি থাকে: ক্ষতিকারক কোড একটি স্যান্ডবক্সড থ্রেড থেকে একটি আনস্যান্ডবক্সড থ্রেডে স্থানান্তরিত হতে পারে।

আমি আমার স্যান্ডবক্সি কীভাবে কম্পাইল করব?

একটি স্ট্যাটিক্যালি লিঙ্কড এক্সিকিউটেবলের তুলনায়, স্যান্ডবক্সি-কে ডাইনামিক্যালি লিঙ্কড এক্সিকিউটেবলে কম্পাইল করলে উল্লেখযোগ্য পরিমাণে সিস্টেম কল (যেমন open / openat , mmap , ইত্যাদি) যুক্ত হয়, যেগুলোকে allowlist-এ অন্তর্ভুক্ত করতে হয়। রানটাইমে শেয়ার্ড লাইব্রেরিগুলো লোড করার জন্য ডাইনামিক লিঙ্কার আহ্বানের কারণে এই সমস্ত অতিরিক্ত সিস্টেম কলের প্রয়োজন হয়।

তবে, স্ট্যাটিক্যালি লিঙ্কড স্যান্ডবক্সগুলোর দিকে তাকালে দেখা যায়: যদিও কম সংখ্যক সিস্টেম কলকে অ্যালাওলিস্টে অন্তর্ভুক্ত করতে হয়, এর কিছু নিরাপত্তাগত প্রভাবও রয়েছে; ASLR হিপ এনট্রপি কমে যায় (৩০ বিট থেকে ৮ বিটে), যা এক্সপ্লয়েট তৈরি করাকে আরও সহজ করে তোলে।

এটি এমন একটি উভয়সংকট যাকে মূলত এভাবে সংক্ষিপ্ত করা যায়:

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

ঐতিহাসিকভাবে, স্ট্যাটিক্যালি লিঙ্ক করা বাইনারিগুলো পজিশন ইন্ডিপেন্ডেন্ট কোড ( pie ) সমর্থন করত না। উপরন্তু, বেজেল ডিফল্টরূপে pie যুক্ত করেছিল। একটি টাইট সিস্টেম কল ফিল্টার সংজ্ঞায়িত করতে হলে, বেজেলের ডিফল্ট মানটি ওভাররাইট করতে হতো।

বছরের পর বছর ধরে কম্পাইলারগুলো উন্নত হয়েছে এবং এখন একটি static-pie অপশন সমর্থন করে। এই অপশনটির মাধ্যমে কম্পাইলারকে পজিশন-ইন্ডিপেন্ডেন্ট কোড তৈরি করার নির্দেশ দেওয়া হয়, কিন্তু pie তুলনায় এতে এখন সমস্ত স্ট্যাটিক্যালি লিঙ্ক করা লাইব্রেরিও অন্তর্ভুক্ত থাকে। নিরাপত্তার দৃষ্টিকোণ থেকে, static-pie এখনও ASLR এনট্রপি কমিয়ে দেয় (৩০ বিট থেকে ১৪ বিটে), কিন্তু এটি pie ছাড়া পূর্ববর্তী পরিস্থিতির তুলনায় একটি উন্নতি।

যেহেতু Bazel ডিফল্টরূপে pie যোগ করে এবং static এর সাথে এটি বেমানান, তাই লিঙ্কার অপশন ফ্ল্যাগ ব্যবহার করে cc_binary রুলে -static-pie লিঙ্কার ফ্ল্যাগটি পাস করে ডিফল্টটিকে ওভাররাইট করার কথা বিবেচনা করুন:

  linkstatic = 1,
  linkopts=["-static-pie"],

এই বিকল্পগুলির একটি উদাহরণের জন্য, স্ট্যাটিক উদাহরণ BUILD-টি দেখুন: static_bin.cc-কে static-pie দিয়ে স্ট্যাটিক্যালি লিঙ্ক করা হয়েছে, যা একটি অত্যন্ত কঠোর সিস্টেম কল নীতি (syscall policy) রাখা সম্ভব করে তোলে। এটি থার্ড-পার্টি বাইনারিগুলিকে স্যান্ডবক্সিং করার জন্যও চমৎকারভাবে কাজ করে।

আমি কি ৩২-বিট x86 বাইনারিগুলোকে স্যান্ডবক্স করতে পারি?

Sandbox2 শুধুমাত্র সেই আর্কিটেকচারেই স্যান্ডবক্স করতে পারে, যেটিতে এটি কম্পাইল করা হয়েছিল।

এছাড়াও, Sandbox2 থেকে 32-বিট x86-এর সাপোর্ট সরিয়ে দেওয়া হয়েছে। যদি আপনি একটি 32-বিট x86 বাইনারিকে স্যান্ডবক্স করার জন্য, অথবা একটি 64-বিট x86 বাইনারিকে 32-বিট সিস্টেম কল (int 0x80-এর মাধ্যমে) করার জন্য একটি 64-বিট x86 এক্সিকিউটর ব্যবহার করার চেষ্টা করেন, তবে উভয় ক্ষেত্রেই একটি স্যান্ডবক্স ভায়োলেশন তৈরি হবে যা [X86-32] আর্কিটেকচার লেবেল দ্বারা চিহ্নিত করা যাবে।

এই আচরণের কারণ হলো, বিভিন্ন আর্কিটেকচারের মধ্যে সিস্টেম কল নম্বর ভিন্ন হয় এবং যেহেতু সিস্টেম কল পলিসিটি এক্সিকিউটরের আর্কিটেকচার অনুযায়ী লেখা হয়, তাই স্যান্ডবক্সির জন্য একটি ভিন্ন আর্কিটেকচারকে অনুমতি দেওয়া বিপজ্জনক হবে। প্রকৃতপক্ষে, এর ফলে আপাতদৃষ্টিতে নিরীহ একটি সিস্টেম কলের অনুমতি দেওয়া হতে পারে, যার ফলে আরও ক্ষতিকর আরেকটি সিস্টেম কল স্যান্ডবক্সটিকে এস্কেপের জন্য উন্মুক্ত করে দিতে পারে।

একটি এক্সিকিউটর প্রসেস কতগুলো স্যান্ডবক্সের জন্য অনুরোধ করতে পারে, তার কি কোনো সীমা আছে?

প্রতিটি স্যান্ডবক্সি ইনস্ট্যান্সের (ফর্কসার্ভার থেকে তৈরি হওয়া নতুন প্রসেস) জন্য একটি নতুন থ্রেড তৈরি করা হয় – সীমাবদ্ধতাটা এখানেই।

একজন এক্সিকিউটর কি একাধিক স্যান্ডবক্স তৈরির অনুরোধ করতে পারেন?

না। এখানে একটি এক-এক সম্পর্ক রয়েছে – একটি এক্সিকিউটর ইনস্ট্যান্স স্যান্ডবক্সি-র পিআইডি সংরক্ষণ করে, স্যান্ডবক্স ইনস্ট্যান্সের সাথে যোগাযোগ ইনস্ট্যান্স পরিচালনা করে, ইত্যাদি।

forkserver.cc-এর ভেতরে কেন “Function not implemented” মেসেজটি আসছে?

স্যান্ডবক্স২ শুধুমাত্র তুলনামূলকভাবে নতুন কার্নেলে চলতে পারে। আমাদের বর্তমান সীমা হলো ৩.১৯ কার্নেল, যদিও ভবিষ্যতে এটি পরিবর্তিত হতে পারে। এর কারণ হলো, আমরা ইউজার নেমস্পেস এবং TSYNC ফ্ল্যাগসহ সেকম্প (seccomp)-এর মতো অপেক্ষাকৃত নতুন কার্নেল ফিচারগুলো ব্যবহার করছি।

আপনি যদি প্রোডাকশনে চালান, তবে এটি কোনো সমস্যা হওয়ার কথা নয়, কারণ প্রায় পুরো ফ্লিটটিই যথেষ্ট নতুন একটি কার্নেল ব্যবহার করছে। এ নিয়ে আপনার কোনো সমস্যা হলে, অনুগ্রহ করে আমাদের সাথে যোগাযোগ করুন।

আপনি যদি ডেবিয়ান বা উবুন্টু ব্যবহার করেন, তবে আপনার কার্নেল আপডেট করা নিম্নলিখিত কমান্ডটি চালানোর মতোই সহজ:

sudo apt-get install linux-image-<RECENT_VERSION>