نظرة عامة
لقد أعددنا بعض الأمثلة لتوضيح كيفية استخدام 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_bin.cc: Sandboxee هو ملف ثنائي ثابت بلغة C يحوّل نص ASCII من الإدخال العادي إلى أحرف كبيرة.
- static_sandbox.cc: المنفِّذ مع سياسته وحدوده واستخدام واصف ملف لإدخال Sandboxee.
طريقة العمل:
- يبدأ المنفّذ Sandboxee من مسار الملف باستخدام
GetDataDependencyFilepath، تمامًا كما هو الحال مع CRC4. - يتم إعداد الحدود، وفتح واصف ملف في
/proc/version، ووضع علامة عليه ليتم ربطه في Sandboxee باستخدامMapFd. - تسمح السياسة لبعض استدعاءات النظام (
open) بعرض خطأ (ENOENT) بدلاً من إيقافها بسبب انتهاك السياسة. يمكن أن يكون ذلك مفيدًا عند وضع برنامج تابع لجهة خارجية في بيئة الاختبار المعزولة حيث لا يمكننا تعديل مكالمات النظام التي يتم إجراؤها، لذا يمكننا بدلاً من ذلك جعلها تفشل بشكل سليم.
الأداة
مثال الأداة هو أداة لتطوير سياساتك الخاصة وتجربة واجهات برمجة تطبيقات Sandbox2، بالإضافة إلى عرض توضيحي لميزاتها.
- 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() الواردة من المنفّذ الرئيسي.
يوفّر هذا الوضع أداءً أفضل من الأنواع الأخرى من وضع الحماية، لأنّه لا يتطلّب إنشاء مثيلات جديدة من Sandboxees تنفيذ ملفات ثنائية جديدة، بل يكفي إنشاء نسخة من الملفات الحالية.
- custom_fork_bin.cc: خادم fork المخصّص الذي يتلقّى طلبات
fork()(عبرForkingClient::EnterForkLoop) لإنشاء Sandboxees جديدة. - custom_fork_sandbox.cc: هو المنفّذ الذي يبدأ خادمًا مخصّصًا للتشعّب. ثم يرسل طلبات إليه (عبر برامج تنفيذ جديدة) لإنشاء (عبر
fork()) Sandboxees جديدة.
شبكة
تمنع مساحة اسم الشبكة، التي تكون مفعّلة تلقائيًا، العملية في وضع الحماية من الاتصال بالعالم الخارجي. يوضّح هذا المثال كيفية التعامل مع هذه المشكلة.
يتم بدء اتصال داخل المنفّذ ويتم تمرير المقبس الناتج من خلال ::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: برنامج وضع الحماية الذي سيتم تشغيله (المنفِّذ).