نظرة عامة
أعددنا بعض الأمثلة لتوضيح كيفية استخدام Sandbox2 في سيناريوهات مختلفة وكيفية كتابة السياسات.
يمكنك العثور عليها في //sandboxed_api/sandbox2/examples، ويُرجى الاطّلاع أدناه على التفسيرات التفصيلية.
CRC4
مثال CRC4 هو عملية حسابية متعمّدة تتضمّن أخطاء لمجموع CRC4، ما يوضّح كيفية وضع برنامج آخر في وضع الحماية وكيفية التواصل معه.
- crc4bin.cc: البرنامج الذي نريد وضعه في وضع الحماية (أي Sandboxee)
- crc4sandbox.cc: برنامج وضع الحماية الذي سيشغّله (أي المنفِّذ).
طريقة العمل:
- يبدأ المنفِّذ تشغيل Sandboxee من مسار الملف باستخدام
::sandbox2::GetDataDependencyFilePath() - يرسل المنفِّذ الإدخال إلى Sandboxee عبر قناة الاتصال
CommsباستخدامSendBytes(). - يحسب Sandboxee قيمة CRC4 ويرسل ردوده إلى المنفِّذ عبر قناة الاتصال
Commsالتي تتلقّاها باستخدامRecvUint32().
إذا كان البرنامج يُجري أي استدعاء نظام آخر غير التواصل (read() وwrite())، يتم إيقافه بسبب انتهاك السياسة.
static
يوضّح مثال static كيفية وضع ملف تنفيذي مرتبط بشكل ثابت في وضع الحماية، مثل ملف تنفيذي تابع لجهة خارجية ليس لديك مصدره، ما يعني أنّه لا يعرف أنّه سيتم وضعه في وضع الحماية.
- static_bin.cc: إنّ Sandboxee هو برنامج ثنائي ثابت بلغة C يحوّل نص ASCII من الإدخال المعياري إلى أحرف كبيرة.
- static_sandbox.cc: المنفِّذ مع سياسته وحدوده واستخدامه لواصف ملف لإدخال Sandboxee.
طريقة العمل:
- يبدأ المنفِّذ تشغيل Sandboxee من مسار الملف باستخدام
GetDataDependencyFilepath، تمامًا كما هو الحال مع CRC4. - يضبط المنفِّذ الحدود ويفتح واصف ملف على
/proc/versionويضع علامة عليه ليتم ربطه في Sandboxee باستخدامMapFd. - تسمح السياسة لبعض استدعاءات النظام (
open) بعرض خطأ (ENOENT) بدلاً من إيقافها بسبب انتهاك السياسة. يمكن أن يكون ذلك مفيدًا عند وضع برنامج تابع لجهة خارجية في وضع الحماية حيث لا يمكننا تعديل استدعاءات النظام التي يتم إجراؤها، لذا يمكننا بدلاً من ذلك جعلها تفشل بشكل سلس.
tool
مثال tool هو أداة لتطوير سياساتك الخاصة وتجربة واجهات Sandbox2 API، بالإضافة إلى عرض ميزاته.
- sandbox2tool.cc: المنفِّذ الذي يوضّح:
- كيفية تشغيل ملف تنفيذي آخر في وضع الحماية،
- كيفية إعداد عمليات فحص نظام الملفات،
- كيف يمكن للمنفِّذ تشغيل Sandboxee بشكل غير متزامن لقراءة ناتجه تدريجيًا.
يمكنك تجربة ذلك بنفسك:
Bazel
bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameCMake + Ninja
cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameGoogle3 (Blaze)
blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameالعلامات:
--sandbox2tool_resolve_and_add_librariesلحلّ المكتبات المطلوبة لـ Sandboxee وربطها--sandbox2tool_additional_bind_mounts <PATHS>لجعل أدلة إضافية متاحة لـ Sandboxee--sandbox2tool_keep_envللاحتفاظ بمتغيّرات البيئة الحالية--sandbox2tool_redirect_fd1لتلقّيSTDOUT_FILENO (1)من Sandboxee وعرضه محليًا--sandbox2tool_cpu_timeoutلضبط مهلة وحدة المعالجة المركزية بالثواني--sandbox2tool_walltime_timeoutلضبط مهلة الوقت الفعلي بالثواني--sandbox2tool_file_size_creation_limitلضبط الحد الأقصى لحجم الملفات التي تم إنشاؤها--sandbox2tool_cwdلضبط دليل العمل الحالي لوضع الحماية
custom_fork
يوضّح مثال custom_fork كيفية إنشاء وضع حماية سيؤدي إلى تهيئة البرنامج الثنائي، ثم الانتظار لطلبات fork() الواردة من المنفِّذ الرئيسي.
يوفّر هذا الوضع أداءً أفضل من الأنواع الأخرى من وضع الحماية، لأنّ إنشاء مثيلات جديدة من Sandboxee لا يتطلّب هنا تنفيذ ملفات تنفيذية جديدة، بل مجرد إنشاء نسخة من الملفات الحالية.
- custom_fork_bin.cc: خادم fork المخصّص الذي يتلقّى طلبات
fork()(عبرForkingClient::EnterForkLoop) لإنشاء مثيلات جديدة من Sandboxee. - custom_fork_sandbox.cc: المنفِّذ الذي يبدأ تشغيل خادم fork مخصّص. ثم يرسل إليه طلبات (عبر منفِّذين جديدَين) لإنشاء مثيلات جديدة من Sandboxee (عبر
fork()).
network
يمنع مساحة اسم الشبكة، التي تكون مفعّلة تلقائيًا، العملية التي تم وضعها في وضع الحماية من الاتصال بالعالم الخارجي. يوضّح هذا المثال كيفية حلّ هذه المشكلة.
يتم إنشاء اتصال داخل المنفِّذ ويتم تمرير المقبس الناتج عبر ::sandbox2::Comms::SendFD() يتلقّى Sandboxee المقبس باستخدام ::sandbox2::Comms::RecvFD()، ويمكنه بعد ذلك استخدام هذا المقبس لتبادل البيانات كالمعتاد.
- network_bin.cc: البرنامج الذي نريد وضعه في وضع الحماية (أي Sandboxee).
- network_sandbox.cc: برنامج وضع الحماية الذي سيشغّله (أي المنفِّذ).
network_proxy
يوضّح هذا المثال طريقة بديلة للتعامل مع مساحة اسم الشبكة. داخليًا، تعمل هذه الطريقة تمامًا مثل المثال أعلاه، ولكن يتم عرضها كواجهة برمجة تطبيقات أكثر ملاءمة.
يمكن أن ينشئ Sandboxee اتصالاً بالشبكة بطريقتَين مختلفتَين:
- تلقائي : من خلال تثبيت معالج تلقائي ثم إجراء طلبات اتصال عادية.
- يدوي : من خلال الحصول على
NetworkProxyClientواستخدامNetworkProxyClient::Connectمباشرةً.
يوضّح هذا المثال كلتا الطريقتَين. يتم استخدام الوضع التلقائي عند ضبط العلامة connect_with_handler، وإلا يتم استخدام الوضع اليدوي.
- network_bin.cc: البرنامج الذي نريد وضعه في وضع الحماية (أي Sandboxee).
- network_sandbox.cc: برنامج وضع الحماية الذي سيشغّله (المنفِّذ).