الأسئلة الشائعة

هل يمكنني استخدام سلاسل المحادثات؟

نعم، تتوافق سلاسل المحادثات مع Sandbox2.

يجب أن تكون جميع سلاسل المحادثات في وضع الحماية

بسبب طريقة عمل Linux، يتم تطبيق سياسة seccomp-bpf على سلسلة المحادثات الحالية فقط، ما يعني أنّه لا يتم تطبيق السياسة على سلاسل المحادثات الحالية الأخرى، ولكن سلاسل المحادثات المستقبلية سترث السياسة:

  • إذا كنت تستخدم Sandbox2 في الوضع الأول حيث يتم تفعيل وضع الحماية قبل execve()، ستتضمّن جميع سلاسل التعليمات البرمجية السياسة، ولن تحدث أي مشكلة. هذا هو الوضع المفضّل لتطبيق وضع الحماية.
  • إذا كنت تستخدم الوضع الثاني حيث يكون لدى المنفِّذ set_enable_sandbox_before_exec(false) ويُعلم Sandboxee المنفِّذ عندما يريد أن يتم وضعه في وضع الحماية باستخدام SandboxMeHere()، تأكَّد من تطبيق الفلتر على جميع سلاسل المحادثات. وفي حال عدم توفّرها، هناك خطر من تجاوز وضع الحماية، إذ يمكن أن ينتقل الرمز الضار من سلسلة محادثات في وضع الحماية إلى سلسلة محادثات خارج وضع الحماية.

كيف يمكنني تجميع Sandboxee؟

بالمقارنة مع ملف تنفيذي مرتبط بشكل ثابت، سيؤدي تجميع sandboxee إلى ملف تنفيذي مرتبط بشكل ديناميكي إلى زيادة كبيرة في استدعاءات النظام (مثل open/openat وmmap وما إلى ذلك) التي يجب إضافتها إلى القائمة المسموح بها. كل عمليات استدعاء النظام الإضافية هذه مطلوبة بسبب استدعاء الرابط الديناميكي في وقت التشغيل لتحميل المكتبات المشتركة.

ومع ذلك، عند النظر إلى sandboxees المرتبطة بشكل ثابت، نجد أنّه على الرغم من أنّ عدد استدعاءات النظام التي يجب إضافتها إلى القائمة البيضاء أقل، إلا أنّ هناك أيضًا آثارًا أمنية، إذ يتم تقليل عشوائية كومة ASLR (من 30 بت إلى 8 بت)، ما يسهّل عمليات الاستغلال.

هذه معضلة يمكن اختصارها إلى ما يلي:

  • ديناميكي: نظام ASLR جيد للذاكرة المجمّعة، وقد يكون من الصعب تنفيذ الرمز البرمجي الأولي، ولكن على حساب سياسة وضع الحماية الأقل فعالية، ما قد يسهّل الخروج منه.
  • ثابت: نظام ASLR سيئ في الذاكرة المؤقتة، ما قد يسهّل تنفيذ الرمز البرمجي الأولي ولكن سياسة وضع الحماية أكثر فعالية، ما قد يصعّب الخروج منها.

في السابق، لم تكن الملفات الثنائية المرتبطة بشكل ثابت تتيح استخدام الرمز المستقل عن الموضع (pie). بالإضافة إلى ذلك، أضاف Bazel pie تلقائيًا. لكي تتمكّن من تحديد فلتر دقيق لطلبات النظام، كان عليك استبدال القيمة التلقائية في Bazel.

لقد تحسّنت برامج الترجمة بمرور السنوات وأصبحت تتيح الآن الخيار static-pie. باستخدام هذا الخيار، يتم توجيه المترجم البرمجي لإنشاء رمز برمجي مستقل عن الموضع، ولكن مقارنةً بـ pie، يشمل هذا الخيار الآن أيضًا جميع المكتبات المرتبطة بشكل ثابت. من ناحية الأمان، لا يزال static-pie يقلّل من إنتروبيا ASLR (من 30 بت إلى 14 بت)، ولكن هذا تحسّن مقارنةً بالحالة السابقة بدون pie.

بما أنّ Bazel يضيف pie تلقائيًا، ولا يتوافق الثابت معه، ننصحك باستخدام علامة خيارات الرابط لتمرير علامة الرابط -static-pie إلى قاعدة cc_binary وتجاوز الإعداد التلقائي:

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

للاطّلاع على مثال لهذه الخيارات، راجِع المثال الثابت BUILD: يتم ربط static_bin.cc بشكل ثابت مع static-pie، ما يتيح تطبيق سياسة صارمة جدًا بشأن طلبات النظام. ويعمل ذلك أيضًا بشكل جيد مع وضع الحماية للبرامج الثنائية التابعة لجهات خارجية.

هل يمكنني وضع ثنائيات x86 ذات 32 بت في وضع الحماية؟

لا يمكن لـ Sandbox2 وضع بنية في وضع الحماية إلا إذا كانت البنية نفسها التي تم تجميعها بها.

بالإضافة إلى ذلك، تمت إزالة إمكانية استخدام إصدار 32 بت من x86 من Sandbox2. إذا حاولت استخدام برنامج تنفيذي x86‏ 64 بت لتشغيل برنامج ثنائي x86‏ 32 بت في وضع الحماية، أو برنامج ثنائي x86‏ 64 بت ينفّذ استدعاءات نظام 32 بت (من خلال int 0x80)، سيؤدي ذلك إلى حدوث انتهاك لوضع الحماية يمكن تحديده من خلال تصنيف البنية [X86-32].

ويعود سبب هذا السلوك إلى أنّ أرقام استدعاءات النظام تختلف بين البنى، وبما أنّ سياسة استدعاءات النظام مكتوبة في بنية المنفّذ، سيكون من الخطير السماح ببنية مختلفة لـ Sandboxee. في الواقع، قد يؤدي ذلك إلى السماح باستدعاء نظام يبدو غير ضار، ولكنّه في الواقع يعني أنّه يمكن استدعاء نظام آخر أكثر ضررًا قد يتيح اختراق وضع الحماية.

هل هناك أي حدود لعدد البيئات التجريبية التي يمكن أن يطلبها أحد العمليات التنفيذية؟

لكل مثيل من Sandboxee (عملية جديدة تم إنشاؤها من forkserver)، يتم إنشاء سلسلة محادثات جديدة، وهذا هو موضع القيود.

هل يمكن للمنفّذ طلب إنشاء أكثر من بيئة اختبارية واحدة؟

لا، هناك علاقة بين عنصرين، إذ يخزّن مثيل Executor معرّف العملية (PID) الخاص بـ Sandboxee، ويدير مثيل Comms إلى مثيل Sandbox، وما إلى ذلك.

لماذا تظهر لي الرسالة "لم يتم تنفيذ الوظيفة" داخل forkserver.cc؟

لا يتيح Sandbox2 التشغيل إلا على النواة الحديثة نسبيًا. إنّ الحد الأدنى الحالي هو إصدار 3.19 من النواة، ولكن قد يتغيّر ذلك في المستقبل. والسبب في ذلك هو أنّنا نستخدم ميزات جديدة نسبيًا في النواة، بما في ذلك مساحات أسماء المستخدمين وseccomp مع العلامة TSYNC.

إذا كنت تستخدم إصدارًا تجريبيًا، لن تواجه هذه المشكلة لأنّ معظم الأجهزة تستخدم إصدارًا حديثًا من النواة. إذا واجهت أي مشاكل في ذلك، يُرجى التواصل معنا.

إذا كنت تستخدم نظام التشغيل Debian أو Ubuntu، يمكنك تعديل النواة بسهولة من خلال تنفيذ ما يلي:

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