هل يمكنني استخدام سلاسل المحادثات؟
نعم، يمكن استخدام سلاسل المحادثات في Sandbox2.
يجب أن تكون جميع سلاسل المحادثات في وضع الحماية
بسبب طريقة عمل Linux، يتم تطبيق سياسة seccomp-bpf على سلسلة المحادثات الحالية فقط، ما يعني أنّه لا يتم تطبيق السياسة على سلاسل المحادثات الحالية الأخرى، ولكن سيتم تطبيقها على سلاسل المحادثات المستقبلية:
- إذا كنت تستخدم Sandbox2 في الوضع الأول حيث يتم تفعيل وضع الحماية قبل
execve()
، ستتضمّن جميع سلاسل التعليمات البرمجية السياسة، ولن تحدث أي مشكلة. هذا هو الوضع المفضّل لتطبيق وضع الحماية. - إذا كنت تستخدم الوضع الثاني حيث يملك المنفِّذ إذن
set_enable_sandbox_before_exec(false)
ويُعلم Sandboxee المنفِّذ عندما يريد أن يتم وضعه في وضع الحماية باستخدامSandboxMeHere()
، تأكَّد من تطبيق الفلتر على جميع سلاسل التعليمات البرمجية. وفي حال عدم توفّرها، هناك خطر من تجاوز وضع الحماية، إذ يمكن أن ينتقل الرمز الضار من سلسلة محادثات في وضع الحماية إلى سلسلة محادثات خارج وضع الحماية.
كيف يمكنني تجميع ملف Sandboxee؟
بالمقارنة مع ملف تنفيذي مرتبط بشكل ثابت، سيؤدي تجميع sandboxee إلى ملف تنفيذي مرتبط بشكل ديناميكي إلى زيادة كبيرة في استدعاءات النظام (مثل open
/openat
وmmap
وما إلى ذلك) التي يجب إضافتها إلى القائمة المسموح بها. جميع طلبات النظام الإضافية هذه مطلوبة بسبب استدعاء الرابط الديناميكي في وقت التشغيل لتحميل المكتبات المشتركة.
ومع ذلك، عند النظر إلى التطبيقات التي تم ربطها بشكل ثابت في وضع الحماية، نجد أنّه على الرغم من أنّ عدد استدعاءات النظام التي يجب إضافتها إلى القائمة البيضاء أقل، إلا أنّ هناك أيضًا آثارًا أمنية، إذ يتم تقليل عشوائية كومة ASLR (من 30 بت إلى 8 بت)، ما يسهّل عمليات الاستغلال.
هذه معضلة يمكن اختصارها إلى ما يلي:
- ديناميكي: توفير ميزة ASLR جيدة للذاكرة المجمّعة، ما قد يصعّب تنفيذ الرمز الأولي، ولكن على حساب سياسة وضع الحماية الأقل فعالية، ما قد يسهّل الخروج من وضع الحماية.
- ثابت: نظام ASLR غير فعّال في الذاكرة المؤقتة، ما قد يسهّل تنفيذ الرمز الأولي، ولكن سياسة وضع الحماية أكثر فعالية، ما قد يصعّب الخروج منها.
في السابق، لم تكن الملفات الثنائية المرتبطة بشكل ثابت تتيح استخدام pie
. بالإضافة إلى ذلك، أضاف Bazel pie
تلقائيًا. ولكي تتمكّن من تحديد فلتر صارم لمكالمات النظام، كان عليك استبدال القيمة التلقائية في Bazel.
لقد تحسّنت برامج الترجمة البرمجية على مرّ السنين وأصبحت تتيح الآن الخيار static-pie
.
باستخدام هذا الخيار، يتم توجيه برنامج التجميع لإنشاء رمز مستقل عن الموضع، ولكن مقارنةً بـ pie
، يشمل هذا الخيار الآن أيضًا جميع المكتبات المرتبطة بشكل ثابت. من ناحية الأمان، لا يزال static-pie
يقلّل من إنتروبيا ASLR (من 30 بت إلى 14 بت)، ولكن هذا تحسّن مقارنةً بالحالة السابقة بدون pie
.
بما أنّ Bazel يضيف pie
تلقائيًا وأنّ السمة static غير متوافقة معه، ننصحك باستخدام علامة خيارات الرابط لتمرير علامة الرابط -static-pie
إلى قاعدة cc_binary وتجاوز الإعداد التلقائي:
linkstatic = 1,
linkopts=["-static-pie"],
للاطّلاع على مثال لهذه الخيارات، راجِع المثال الثابت
إنشاء:
يتم ربط 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>