مثال‌ها

نمای کلی

ما چند مثال آماده کرده‌ایم تا نحوه استفاده از Sandbox2 را در سناریوهای مختلف و نحوه نوشتن سیاست‌ها نشان دهیم.

می‌توانید آنها را در //sandboxed_api/sandbox2/examples پیدا کنید، برای توضیحات بیشتر به زیر مراجعه کنید.

سی آر سی ۴

مثال CRC4 یک محاسبه عمداً دارای اشکال از یک چک‌سام CRC4 است که نحوه‌ی قرار دادن یک برنامه‌ی دیگر در حالت sandbox و نحوه‌ی ارتباط با آن را نشان می‌دهد.

  • crc4bin.cc : برنامه‌ای که می‌خواهیم آن را در محیط سندباکس قرار دهیم (یعنی Sandboxee)
  • crc4sandbox.cc : برنامه‌ی سندباکسی که آن را اجرا خواهد کرد (یعنی اجراکننده).

چگونه کار می‌کند:

  1. اجراکننده، Sandboxee را از مسیر فایل آن با استفاده از ::sandbox2::GetDataDependencyFilePath() اجرا می‌کند.
  2. مجری با استفاده از SendBytes() ورودی را از طریق کانال ارتباطی Comms به Sandboxee ارسال می‌کند.
  3. Sandboxee CRC4 را محاسبه کرده و پاسخ‌های خود را از طریق کانال ارتباطی Comms به مجری ارسال می‌کند که آن را با RecvUint32() دریافت می‌کند.

اگر برنامه هرگونه فراخوانی سیستمی غیر از برقراری ارتباط ( read() و write() ) انجام دهد، به دلیل نقض سیاست از بین می‌رود.

استاتیک

مثال استاتیک نشان می‌دهد که چگونه یک فایل باینری استاتیک لینک شده را در محیط سندباکس قرار دهید، مانند یک فایل باینری شخص ثالث که منبع آن را ندارید، به این معنی که از سندباکس شدن آن مطلع نیست.

  • static_bin.cc : سندباکسی یک فایل باینری ایستا به زبان C است که متن ASCII را از ورودی استاندارد به حروف بزرگ تبدیل می‌کند.
  • static_sandbox.cc : اجراکننده به همراه سیاست‌ها، محدودیت‌ها و استفاده از یک توصیف‌گر فایل برای ورودی Sandboxee.

چگونه کار می‌کند:

  1. اجراکننده، Sandboxee را از مسیر فایل آن با استفاده از GetDataDependencyFilepath ، درست مانند CRC4، اجرا می‌کند.
  2. این دستور محدودیت‌ها را تنظیم می‌کند، یک توصیف‌گر فایل در /proc/version باز می‌کند و آن را برای نگاشت در Sandboxee با MapFd علامت‌گذاری می‌کند.
  3. این سیاست به برخی از فراخوانی‌های سیستمی ( open ) اجازه می‌دهد تا به جای اینکه به دلیل نقض سیاست از کار بیفتند، خطایی ( ENOENT ) برگردانند. این می‌تواند هنگام سندباکس کردن یک برنامه شخص ثالث مفید باشد، جایی که نمی‌توانیم نوع فراخوانی‌های سیستمی انجام شده را تغییر دهیم، بنابراین می‌توانیم کاری کنیم که آنها به طرز ماهرانه‌ای شکست بخورند.

ابزار

این مثال ابزاری است که هم برای توسعه سیاست‌های خودتان و آزمایش APIهای Sandbox2 و هم برای نمایش ویژگی‌های آن استفاده می‌شود.

  • sandbox2tool.cc : مجری که موارد زیر را نشان می‌دهد:
    • چگونه یک سندباکس دودویی دیگر را اجرا کنیم،
    • نحوه تنظیم بررسی‌های سیستم فایل، و
    • چگونه اجراکننده می‌تواند Sandboxee را به صورت ناهمگام اجرا کند تا خروجی آن را به صورت تدریجی بخواند.

خودتان امتحان کنید:

بازل

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

سی‌میک + نینجا

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

گوگل۳ (بلیز)

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 برای تنظیم زمان خاموشی پردازنده بر حسب ثانیه
  • --sandbox2tool_walltime_timeout برای تنظیم زمان انقضای دیوار بر حسب ثانیه
  • --sandbox2tool_file_size_creation_limit برای تنظیم حداکثر اندازه فایل‌های ایجاد شده
  • --sandbox2tool_cwd برای تنظیم دایرکتوری کاری فعلی sandbox

custom_fork

مثال custom_fork نحوه ایجاد یک sandbox را نشان می‌دهد که فایل باینری را مقداردهی اولیه می‌کند و سپس منتظر درخواست‌های fork() از مجری والد می‌ماند.

این حالت به طور بالقوه عملکرد افزایش یافته‌ای را در مقایسه با سایر انواع سندباکس ارائه می‌دهد، زیرا در اینجا، ایجاد نمونه‌های جدید از سندباکس‌ها نیازی به اجرای فایل‌های باینری جدید ندارد، فقط فایل‌های باینری موجود را فورک می‌کند.

  • custom_fork_bin.cc : سرور چنگال سفارشی، که درخواست‌های fork() (از طریق ForkingClient::EnterForkLoop ) را برای ایجاد Sandboxeeهای جدید دریافت می‌کند.
  • custom_fork_sandbox.cc : اجراکننده، که یک سرور فورک سفارشی را شروع می‌کند. سپس درخواست‌هایی را (از طریق اجراکننده‌های جدید) برای ایجاد (از طریق fork() ) Sandboxees جدید به آن ارسال می‌کند.

شبکه

فضای نام شبکه که به طور پیش‌فرض فعال است، از اتصال فرآیند sandbox شده به دنیای خارج جلوگیری می‌کند. این مثال نحوه برخورد با این مشکل را نشان می‌دهد.

یک اتصال درون اجراکننده (executor) مقداردهی اولیه می‌شود و سوکت حاصل از طریق ::sandbox2::Comms::SendFD() ارسال می‌شود. Sandboxee سوکت را با استفاده از ::sandbox2::Comms::RecvFD() دریافت می‌کند و سپس می‌تواند طبق معمول از این سوکت برای تبادل داده‌ها استفاده کند.

  • network_bin.cc : برنامه‌ای که می‌خواهیم آن را در محیط سندباکس قرار دهیم (یعنی Sandboxee).
  • network_sandbox.cc : برنامه‌ی سندباکسی که آن را اجرا خواهد کرد (یعنی اجراکننده).

پروکسی_شبکه

این مثال یک روش جایگزین برای کار با فضای نام شبکه را نشان می‌دهد. از نظر داخلی، دقیقاً مانند مثال بالا عمل می‌کند، اما به عنوان یک API راحت‌تر در معرض نمایش قرار می‌گیرد.

Sandboxee می‌تواند به دو روش مختلف اتصال شبکه برقرار کند:

  • خودکار - با نصب یک کنترل‌کننده خودکار و سپس صدور تماس‌های اتصال منظم.
  • دستی – با دریافت یک NetworkProxyClient و استفاده مستقیم از NetworkProxyClient::Connect .

این مثال هر دو روش را نشان می‌دهد. حالت خودکار زمانی استفاده می‌شود که پرچم connect_with_handler تنظیم شده باشد، در غیر این صورت حالت دستی استفاده می‌شود.

  • network_bin.cc : برنامه‌ای که می‌خواهیم آن را در محیط سندباکس قرار دهیم (یعنی Sandboxee).
  • network_sandbox.cc : برنامه‌ی سندباکسی که آن را اجرا خواهد کرد (مجری).