يعتمد تصميم Sandbox2 على تقنيات معروفة ومثبَتة، وإطار عمل للسياسات، وعمليتَين: منفِّذ وضع الحماية وSandboxee.
التكنولوجيات المعنيّة
تتناول الأقسام التالية التقنيات التي تشكّل الطبقة الأساسية في Sandbox2.
مساحات اسم Linux
مساحات الاسم في Linux هي محاولة لتوفير محاكاة افتراضية على مستوى نظام التشغيل. وعلى الرغم من أنّ مساحات المستخدمين المتعدّدة تعمل بشكل مستقل ظاهريًا عن بعضها البعض، فإنّها تشترك في نسخة واحدة من النواة. يستخدم Sandbox2 الأنواع التالية من مساحات الأسماء:
- التواصل البيني للعمليات (IPC)
- الشبكة (ما لم يتم إيقافها صراحةً من خلال الاتصال
PolicyBuilder::AllowUnrestrictedNetworking()) - التحميل (باستخدام طريقة عرض مخصّصة لشجرة نظام الملفات)
- PID
- المستخدم
- UTS
يمكنك الاطّلاع على مزيد من المعلومات حول مساحات أسماء Linux على Wikipedia أو على صفحة الدليل ذات الصلة.
التواصل البيني للعمليات (IPC)
تسمح Sandbox2 بتبادل البيانات العشوائية بين منفّذ وضع الحماية ووضع الحماية غير الموثوق به. يتيح هذا البروتوكول رسائل من النوع "النوع والطول والقيمة" (TLV)، وتمرير واصفات الملفات، وتبادُل بيانات الاعتماد من خلال الرموز المميزة والمعرّفات.
Seccomp-BPF
تعتمد Sandbox2 على seccomp-bpf، وهي إضافة إلى "وضع الحوسبة الآمنة" (seccomp) تتيح استخدام قواعد "فلتر حِزم بيركلي" (BPF) لفلترة طلبات النظام.
seccomp هي إحدى ميزات نواة Linux التي تقيّد طلبات النظام الخاصة بالعمليات
للسماح فقط بـ exit وsigreturn وread وwrite. إذا حاولت عملية تنفيذ استدعاء نظام آخر، فسيتم إنهاؤها. يتيح ملحق seccomp-bpf مرونة أكبر من seccomp. بدلاً من السماح بمجموعة ثابتة من طلبات النظام،
يُشغِّل seccomp-bpf برنامج BPF على بيانات طلب النظام، واعتمادًا على
القيمة المعروضة للبرنامج، يمكنه تنفيذ طلب النظام، وتخطّي طلب النظام وعرض
قيمة وهمية، أو إنهاء العملية، أو إنشاء إشارة، أو إشعار أداة التتبُّع.
Ptrace
يوفّر استدعاء النظام ptrace (تتبُّع العمليات) وظيفة تتيح لعملية التتبُّع مراقبة تنفيذ عملية التتبُّع والتحكّم فيها. يملك برنامج التتبُّع إمكانية التحكّم الكامل في البرنامج الذي يتم تتبُّعه بعد ربطهما. يمكنك الاطّلاع على مزيد من المعلومات حول ptrace على Wikipedia أو في صفحة الدليل ذات الصلة.
سياسة وضع الحماية
سياسة وضع الحماية هي الجزء الأكثر أهمية في وضع الحماية، لأنّها تحدّد الإجراءات التي يمكن لبرنامج Sandboxee تنفيذها أو لا يمكنه تنفيذها. تتألف سياسة وضع الحماية من جزأين:
- سياسة Syscall
- إعداد مساحة الاسم
سياسة استدعاء النظام التلقائية
تحظر السياسة التلقائية استدعاءات النظام التي تكون خطيرة دائمًا وتكون لها الأولوية على السياسة الموسّعة التي يوفّرها المستخدم.
سياسة Syscall الموسّعة
يمكن إنشاء سياسة استدعاء النظام الموسّعة باستخدام فئة
PolicyBuilder. يحدّد هذا الصف عددًا من قواعد التسهيل (مثل AllowStaticStartup وAllowDynamicStartup وAllowOpen) التي يمكن استخدامها لتحسين قابلية قراءة سياستك.
في معظم الحالات، من الأفضل البدء باستخدام
DefaultPolicyBuilder
(sapi::Sandbox2Config::DefaultPolicyBuilder())، الذي يعرض
PolicyBuilder تم ضبطه مسبقًا باستخدام سياسة أساسية للمكتبات النموذجية
ذات السلسلة الواحدة ويمكن تخصيصه بشكل أكبر باستخدام قواعد إضافية
(مثل .AllowDynamicStartup() و.AddLibrariesForBinary() عند وضع الحماية
لملف ثنائي). في Sandboxed API (SAPI)، يتم استخدام DefaultPolicyBuilder() من قِبل
sapi::SandboxConfig::DefaultConfig() مع
sapi::SandboxConfig::DefaultFlags() وsapi::SandboxConfig::DefaultEnvironmentVariables() وsapi::Sandbox2Config::DefaultLimits(). يجب إنشاء PolicyBuilder مباشرةً
فقط عندما لا يمكن استخدام DefaultPolicyBuilder() أو عندما تكون هناك حاجة إلى
إعدادات دقيقة.
إذا أردت فرض قيود إضافية على استدعاءات النظام أو كنت بحاجة إلى قواعد أكثر تعقيدًا، يمكنك تحديد وحدات ماكرو BPF الأولية باستخدام AddPolicyOnSyscall وAddPolicyOnSyscalls. يستفيد مثال crc4 من هذه الآلية لتقييد وسيطات استدعاءات النظام read وwrite وclose.
بشكل عام، كلما كانت "سياسة وضع التطبيقات في وضع الحماية" أكثر صرامة، كان ذلك أفضل لأنّ السياسة ستحدّ من استغلال أي ثغرة أمنية في الرمز. إذا تمكّنت من تحديد استدعاءات النظام والوسيطات المطلوبة بالضبط للتشغيل العادي للبرنامج، فإنّ أي مهاجم يستغل ثغرة أمنية في تنفيذ الرمز البرمجي سيخضع أيضًا للقيود نفسها.
يمكن أن ترفض سياسة وضع الحماية الصارمة جميع استدعاءات النظام باستثناء عمليات القراءة والكتابة على واصفات ملفات الإدخال والإخراج المعيارية. داخل وضع الحماية هذا، يمكن للبرنامج تلقّي الإدخال ومعالجته وعرض الناتج. ومع ذلك، إذا حاولت العملية إجراء أي استدعاء نظام آخر، سيتم إنهاؤها بسبب انتهاك السياسة. وبالتالي، إذا تم اختراق العملية (تطبيق الرموز البرمجية من قِبل مستخدم ضار)، لن تتمكّن من تنفيذ أي إجراءات ضارة أكثر من إنتاج مخرجات سيئة (التي لا يزال يتعيّن على المنفّذ والآخرين التعامل معها بشكل صحيح).
إعداد مساحة الاسم
يُستخدم عنصر PolicyBuilder أيضًا لإعداد طريقة عرض فردية لـ Sandboxee
لنظام الملفات. يمكن ربط الملفات الفردية (AddFile / AddFileAt) والأدلة الكاملة
(AddDirectory / AddDirectoryAt) ومساحة التخزين المؤقتة (AddTmpfs)
ببيئة Sandboxee. بالإضافة إلى ذلك، يمكن استخدام AddLibrariesForBinary لربط جميع المكتبات المطلوبة تلقائيًا بالتنفيذية المرتبطة ديناميكيًا المحدّدة.
علامات سطر الأوامر
يمكن إيقاف أي سياسة في Sandbox2 من خلال تحديد أحد علامات سطر الأوامر التالية. هذه العلامات مخصّصة لأغراض الاختبار (على سبيل المثال، أثناء تحسين "سياسة استدعاء النظام الموسّعة").
--sandbox2_danger_danger_permit_all--sandbox2_danger_danger_permit_all_and_log
Sandbox Executor
برنامج Sandbox Executor هو عملية لا يتم وضعها في وضع الحماية. وهي عملية تتبُّع ptrace التي ترتبط بـ Sandboxee (عملية تتبُّع ptrace). يُعدّ برنامج Sandbox Executor أيضًا مثيلاً من Monitor ويشغّله، وهو يتتبّع Sandboxee ويقدّم معلومات الحالة.
تتيح Sandbox2 ثلاثة أوضاع تنفيذ: وضع "مستقل" ووضع "خادم Forkserver في Sandbox2" ووضع "خادم Forkserver مخصّص". إذا كنت تستخدم خادمًا فرعيًا، يتم إنشاء Sandboxee كعملية فرعية لـ Sandbox Executor. يمكنك الاطّلاع على شرح مفصّل لهذه الأوضاع هنا.
Sandboxee
Sandboxee هي العملية التي يتم تشغيلها في بيئة وضع الحماية المقيَّدة التي تم تحديدها من خلال "سياسة وضع الحماية". يرسل Sandbox Executor السياسة إلى Sandboxee عبر IPC. بعد ذلك، يطبّق Sandboxee السياسة. وأي انتهاك للسياسة سيؤدي إلى إنهاء العملية، ما لم يتم ضبطها على خلاف ذلك (انظر سياسة وضع الحماية).