الأمثلة

نظرة عامة

لقد أعددنا بعض الأمثلة لتوضيح كيفية استخدام 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_bin.cc: برنامج Sandboxee هو برنامج ثنائي ثابت مكتوب بلغة C يحوّل نص ASCII من الإدخال العادي إلى أحرف كبيرة.
  • static_sandbox.cc: المنفِّذ مع سياسته وحدوده واستخدام واصف ملف لإدخال Sandboxee

طريقة العمل:

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

يوفّر هذا الوضع أداءً أفضل من الأنواع الأخرى من وضع الحماية، لأنّه لا يتطلّب إنشاء مثيلات جديدة من Sandboxees تنفيذ ملفات ثنائية جديدة، بل مجرد إنشاء نسخة من الملفات الحالية.

  • custom_fork_bin.cc: خادم fork المخصّص الذي يتلقّى الطلبات إلى fork() (عبر Client::WaitAndFork) من أجل إنشاء Sandboxees جديدة.
  • custom_fork_sandbox.cc: المنفّذ الذي يبدأ خادمًا مخصّصًا للتشعّب. ثم يرسل طلبات إليه (عبر منفّذين جدد) لإنشاء (عبر fork()) صناديق رمل جديدة.

شبكة

تمنع مساحة اسم الشبكة، التي تكون مفعّلة تلقائيًا، العملية التي تعمل في وضع الحماية من الاتصال بالعالم الخارجي. يوضّح هذا المثال كيفية التعامل مع هذه المشكلة.

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