مثال ها

بررسی اجمالی

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

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

CRC4

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

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

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

  1. مجری Sandboxee را از مسیر فایل خود با استفاده از ::sandbox2::GetDataDependencyFilePath() شروع می کند.
  2. مجری ورودی را از طریق کانال ارتباطی Comms با استفاده از SendBytes() به Sandboxee می فرستد.
  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. این خط‌مشی به برخی از syscalls ( open ) اجازه می‌دهد به جای اینکه به دلیل نقض خط‌مشی کشته شوند، یک خطا ( ENOENT ) را برگردانند. این می‌تواند هنگام سندباکس کردن یک برنامه شخص ثالث مفید باشد، جایی که ما نمی‌توانیم سیستم‌های ساخته شده را تغییر دهیم، بنابراین در عوض می‌توانیم آنها را به‌خوبی خراب کنیم.

ابزار

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

  • 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

CMake + نینجا

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 نشان می‌دهد که چگونه می‌توان یک جعبه شنی ایجاد کرد که باینری را مقداردهی اولیه می‌کند و سپس منتظر درخواست‌های fork() که از مجری والد می‌آیند.

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

  • custom_fork_bin.cc : فورک-سرور سفارشی، درخواست هایی را برای fork() (از طریق Client::WaitAndFork ) دریافت می کند تا Sandboxe های جدید ایجاد کند.
  • custom_fork_sandbox.cc : مجری که یک فورک سرور سفارشی را راه اندازی می کند. سپس درخواست‌هایی را به آن (از طریق مجری‌های جدید) ارسال می‌کند تا Sandboxe‌های جدید (از طریق fork() ) ایجاد شود.

شبکه

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

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

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

شبکه_پراکسی

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

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

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

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

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

بررسی اجمالی

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

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

CRC4

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

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

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

  1. مجری Sandboxee را از مسیر فایل خود با استفاده از ::sandbox2::GetDataDependencyFilePath() شروع می کند.
  2. مجری ورودی را از طریق کانال ارتباطی Comms با استفاده از SendBytes() به Sandboxee می فرستد.
  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. این خط‌مشی به برخی از syscalls ( open ) اجازه می‌دهد به جای اینکه به دلیل نقض خط‌مشی کشته شوند، یک خطا ( ENOENT ) را برگردانند. این می‌تواند هنگام سندباکس کردن یک برنامه شخص ثالث مفید باشد، جایی که ما نمی‌توانیم سیستم‌های ساخته شده را تغییر دهیم، بنابراین در عوض می‌توانیم آنها را به‌خوبی خراب کنیم.

ابزار

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

  • 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

CMake + نینجا

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 نشان می‌دهد که چگونه می‌توان یک جعبه شنی ایجاد کرد که باینری را مقداردهی اولیه می‌کند و سپس منتظر درخواست‌های fork() که از مجری والد می‌آیند.

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

  • custom_fork_bin.cc : فورک-سرور سفارشی، درخواست هایی را برای fork() (از طریق Client::WaitAndFork ) دریافت می کند تا Sandboxe های جدید ایجاد کند.
  • custom_fork_sandbox.cc : مجری که یک فورک سرور سفارشی را راه اندازی می کند. سپس درخواست‌هایی را به آن (از طریق مجری‌های جدید) ارسال می‌کند تا Sandboxe‌های جدید (از طریق fork() ) ایجاد شود.

شبکه

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

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

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

شبکه_پراکسی

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

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

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

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

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