أمثلة

نظرة عامة

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

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

CRC4

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

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

آلية عمله:

  1. يبدأ تنفيذ الإجراء "وضع الحماية" من مسار الملف باستخدام ::sandbox2::GetDataDependencyFilePath().
  2. يُرسِل مسؤول التنفيذ البيانات إلى مستخدم Sandboxe من خلال قناة التواصل Comms باستخدام SendBytes().
  3. يحسب Sandboxee CRC4 ويرسل ردوده مرة أخرى إلى المسؤول عن التنفيذ من خلال قناة الاتصال Comms التي تتلقّى هذه الردود عبر RecvUint32().

إذا أجرى البرنامج أي استدعاءات نظام بخلاف الاتصال (read() وwrite())، سيتم إنهاؤه بسبب انتهاك إحدى السياسات.

ثابت

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

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

آلية عمله:

  1. يبدأ تنفيذ الإجراء "وضع الحماية" من مسار الملف باستخدام GetDataDependencyFilepath، تمامًا مثل CRC4.
  2. تضبط هذه السياسة الحدود وتفتح أداة وصف ملفات في /proc/version وتضع علامة على الملف لربطه في وضع الحماية باستخدام 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 لتلقّي رمز Sandboxee STDOUT_FILENO (1) وإخراجه محليًا
  • --sandbox2tool_cpu_timeout لضبط مهلة وحدة المعالجة المركزية (CPU) بالثواني
  • --sandbox2tool_walltime_timeout لضبط مهلة وقت الجدار بالثواني
  • --sandbox2tool_file_size_creation_limit لضبط الحد الأقصى لحجم الملفات التي يتم إنشاؤها
  • --sandbox2tool_cwd لضبط دليل العمل الحالي في وضع الحماية

custom_fork

يوضّح المثال custom_fork كيفية إنشاء وضع حماية الذي سيؤدي إلى إعداد البرنامج الثنائي ثم انتظار طلبات fork() الواردة من أداة التنفيذ الرئيسية.

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

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

شبكة

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

يتم إعداد الاتصال داخل المنفّذ وتمرير المقبس الناتج عبر ::sandbox2::Comms::SendFD(). يتلقى Sandboxee المقبس باستخدام ::sandbox2::Comms::RecvFD() وبعد ذلك يمكنه استخدام هذا المقبس لتبادل البيانات كالمعتاد.

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

network_proxy

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

يمكن لبرنامج Sandboxee إنشاء اتصال بالشبكة بطريقتين مختلفتين:

  • تلقائي: من خلال تثبيت معالِج تلقائي ثم إجراء مكالمات اتصال عادية.
  • manual: من خلال الحصول على NetworkProxyClient واستخدام NetworkProxyClient::Connect مباشرةً.

يوضح هذا المثال كلتا الطريقتين. يتم استخدام الوضع التلقائي عند ضبط علامة connect_with_handler، وإلا يتم استخدام الوضع اليدوي.

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