الأمثلة

نظرة عامة

أعددنا بعض الأمثلة لتوضيح كيفية استخدام Sandbox2 في سيناريوهات مختلفة وكيفية كتابة السياسات.

يمكنك العثور عليها في //sandboxed_api/sandbox2/examples، ويُرجى الاطّلاع أدناه على التفسيرات التفصيلية.

CRC4

مثال CRC4 هو عملية حسابية متعمّدة تتضمّن أخطاء لمجموع CRC4، ما يوضّح كيفية وضع برنامج آخر في وضع الحماية وكيفية التواصل معه.

  • crc4bin.cc: البرنامج الذي نريد وضعه في وضع الحماية (أي Sandboxee)
  • crc4sandbox.cc: برنامج وضع الحماية الذي سيشغّله (أي المنفِّذ).

طريقة العمل:

  1. يبدأ المنفِّذ تشغيل Sandboxee من مسار الملف باستخدام ::sandbox2::GetDataDependencyFilePath()
  2. يرسل المنفِّذ الإدخال إلى Sandboxee عبر قناة الاتصال Comms باستخدام SendBytes()‎.
  3. يحسب Sandboxee قيمة CRC4 ويرسل ردوده إلى المنفِّذ عبر قناة الاتصال Comms التي تتلقّاها باستخدام RecvUint32()‎.

إذا كان البرنامج يُجري أي استدعاء نظام آخر غير التواصل (read() وwrite()‎)، يتم إيقافه بسبب انتهاك السياسة.

static

يوضّح مثال static كيفية وضع ملف تنفيذي مرتبط بشكل ثابت في وضع الحماية، مثل ملف تنفيذي تابع لجهة خارجية ليس لديك مصدره، ما يعني أنّه لا يعرف أنّه سيتم وضعه في وضع الحماية.

  • static_bin.cc: إنّ Sandboxee هو برنامج ثنائي ثابت بلغة C يحوّل نص ASCII من الإدخال المعياري إلى أحرف كبيرة.
  • static_sandbox.cc: المنفِّذ مع سياسته وحدوده واستخدامه لواصف ملف لإدخال Sandboxee.

طريقة العمل:

  1. يبدأ المنفِّذ تشغيل Sandboxee من مسار الملف باستخدام GetDataDependencyFilepath، تمامًا كما هو الحال مع CRC4.
  2. يضبط المنفِّذ الحدود ويفتح واصف ملف على /proc/version ويضع علامة عليه ليتم ربطه في Sandboxee باستخدام MapFd‎.
  3. تسمح السياسة لبعض استدعاءات النظام (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/hostname

‫CMake + Ninja

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (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: برنامج وضع الحماية الذي سيشغّله (المنفِّذ).