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

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

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

يجب استخدام وضع الحماية لجميع سلاسل المحادثات.

يتم تطبيق سياسة seccomp-bpf على سلسلة التعليمات الحالية فقط بسبب طريقة عمل نظام التشغيل Linux، ما يعني أنه لا يتم تطبيق السياسة على سلاسل التعليمات الحالية الأخرى، ولكن ستكتسب سلاسل التعليمات المستقبلية هذه السياسة:

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

كيف يمكنني تجميع Sandboxee الخاص بي؟

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

  • يتم تجميع برنامج Sandboxee الثنائي بشكل ثابت لتجنُّب الربط الديناميكي الذي يستخدم الكثير من استدعاءات النظام (open/openat، وmmap، وما إلى ذلك).
  • نظرًا لأن Bazel تضيف pie تلقائيًا، ولكن الثابتة غير متوافقة معها، يمكنك استخدام علامة الميزات لفرض إيقافها من خلال الخيارات التالية في قواعد cc_binary:

    linkstatic = 1,
    features = [
        "fully_static_link",  # link libc statically
        "-pie",
    ],
    

مع ذلك: إنّ استخدام القيمة الثابتة له الجانب السلبي يتمثل في تقليل قصور كومة الذاكرة المؤقتة لتكنولوجيا ASLR (من 30 بت إلى 8 بت)، ما يسهّل عمليات الاستغلال. حدد بعناية ما هو الأفضل وفقًا لتطبيق وضع الحماية وسياسته:

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

يعد اتخاذ قرار غير سيئ لأن المحول البرمجي لا يدعم PIE الثابت (Position Independent Executables). يتم تنفيذ PIE من خلال أن يكون البرنامج الثنائي كائنًا ديناميكيًا، ويقوم برنامج التحميل الديناميكي بتعيينه في موقع عشوائي قبل تنفيذه. بعد ذلك، ولأن كومة الذاكرة المؤقتة يتم وضعها في إزاحة عشوائية بعد العنوان الأساسي للبرنامج الثنائي (ويتم توسيعها باستخدام brk syscall)، فهذا يعني بالنسبة إلى البرامج الثنائية الثابتة، يكون القصور ASLR في كومة الذاكرة المؤقتة بهذه الإزاحة فقط نظرًا لعدم وجود PIE.

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

هل يمكنني وضع حماية على برامج ثنائية بتنسيق 32 بت x86؟

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

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

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

هل هناك أي حدود على عدد حالات وضع الحماية التي يمكن أن تطلبها عملية التنفيذ؟

بالنسبة إلى كل مثيل Sandboxee (عملية جديدة تنشأ من خادم الشوكة)، يتم إنشاء سلسلة محادثات جديدة - وهنا يكمن القيد.

هل يمكن للمسؤول التنفيذ طلب إنشاء أكثر من وضع حماية واحد؟

لا. هناك علاقة 1:1 - يخزِّن المثيل التنفيذي لـ PID رقم تعريف Sandboxee، ويدير مثيل Comms في مثيل Sandbox، وما إلى ذلك.

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

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

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

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

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