نمای کلی
ما چند مثال آماده کردهایم تا نحوه استفاده از Sandbox2 را در سناریوهای مختلف و نحوه نوشتن سیاستها نشان دهیم.
میتوانید آنها را در //sandboxed_api/sandbox2/examples پیدا کنید، برای توضیحات بیشتر به زیر مراجعه کنید.
سی آر سی ۴
مثال CRC4 یک محاسبه عمداً دارای اشکال از یک چکسام CRC4 است که نحوهی قرار دادن یک برنامهی دیگر در حالت sandbox و نحوهی ارتباط با آن را نشان میدهد.
- crc4bin.cc : برنامهای که میخواهیم آن را در محیط سندباکس قرار دهیم (یعنی Sandboxee)
- crc4sandbox.cc : برنامهی سندباکسی که آن را اجرا خواهد کرد (یعنی اجراکننده).
چگونه کار میکند:
- اجراکننده، Sandboxee را از مسیر فایل آن با استفاده از
::sandbox2::GetDataDependencyFilePath()اجرا میکند. - مجری با استفاده از
SendBytes()ورودی را از طریق کانال ارتباطیCommsبه Sandboxee ارسال میکند. - Sandboxee CRC4 را محاسبه کرده و پاسخهای خود را از طریق کانال ارتباطی
Commsبه مجری ارسال میکند که آن را باRecvUint32()دریافت میکند.
اگر برنامه هرگونه فراخوانی سیستمی غیر از برقراری ارتباط ( read() و write() ) انجام دهد، به دلیل نقض سیاست از بین میرود.
استاتیک
مثال استاتیک نشان میدهد که چگونه یک فایل باینری استاتیک لینک شده را در محیط سندباکس قرار دهید، مانند یک فایل باینری شخص ثالث که منبع آن را ندارید، به این معنی که از سندباکس شدن آن مطلع نیست.
- static_bin.cc : سندباکسی یک فایل باینری ایستا به زبان C است که متن ASCII را از ورودی استاندارد به حروف بزرگ تبدیل میکند.
- static_sandbox.cc : اجراکننده به همراه سیاستها، محدودیتها و استفاده از یک توصیفگر فایل برای ورودی Sandboxee.
چگونه کار میکند:
- اجراکننده، Sandboxee را از مسیر فایل آن با استفاده از
GetDataDependencyFilepath، درست مانند CRC4، اجرا میکند. - این دستور محدودیتها را تنظیم میکند، یک توصیفگر فایل در
/proc/versionباز میکند و آن را برای نگاشت در Sandboxee باMapFdعلامتگذاری میکند. - این سیاست به برخی از فراخوانیهای سیستمی (
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برای دریافت SandboxeeSTDOUT_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 : برنامهی سندباکسی که آن را اجرا خواهد کرد (مجری).