آیا می توانم از رشته ها استفاده کنم؟
بله، رشته ها در Sandbox2 پشتیبانی می شوند.
همه رشته ها باید sandboxed شوند
به دلیل نحوه عملکرد لینوکس، خط مشی seccomp-bpf فقط برای رشته فعلی اعمال می شود: این بدان معناست که این خط مشی برای سایر رشته های موجود اعمال نمی شود، اما رشته های آینده این خط مشی را به ارث می برند:
- اگر از Sandbox2 در حالت اول استفاده می کنید که sandboxing قبل از
execve()
فعال است، همه رشته ها این خط مشی را به ارث می برند و مشکلی وجود ندارد. این حالت ترجیحی sandboxing است. - اگر از حالت دوم استفاده میکنید که در آن اجراکننده
set_enable_sandbox_before_exec(false)
را دارد و Sandboxee به مجری میگوید که چه زمانی میخواهد باSandboxMeHere()
sandbox شود، مطمئن شوید که فیلتر روی همه رشتهها اعمال میشود. در غیر این صورت، خطر فرار Sandbox وجود دارد: کدهای مخرب می توانند از یک رشته sandbox به یک رشته بدون Sandbox مهاجرت کنند.
چگونه باید Sandboxee خود را کامپایل کنم؟
در مقایسه با یک فایل اجرایی با پیوند ایستا، کامپایل sandboxee به یک فایل اجرایی پیوندی پویا منجر به افزایش قابل توجهی از syscalls (به عنوان مثال open
/ openat
، mmap
، و غیره) خواهد شد که باید در لیست مجاز قرار گیرند. به دلیل فراخوانی پیوند دهنده پویا در زمان اجرا برای بارگذاری کتابخانه های مشترک، همه این سیستم های اضافی مورد نیاز هستند.
با این حال، نگاهی به جعبههای سندباد متصل بهصورت ایستا: در حالی که تعداد کمتری از syscalها باید در لیست مجاز قرار گیرند، پیامدهای امنیتی نیز وجود دارد. آنتروپی پشته ASLR کاهش می یابد (از 30 بیت به 8 بیت)، که بهره برداری را آسان تر می کند.
این معضلی است که اساساً می توان آن را به موارد زیر تقلیل داد:
- پویا : ASLR خوب، به طور بالقوه برای اجرای کد اولیه سخت تر است، اما به قیمت یک سیاست جعبه ایمنی کمتر موثر، به طور بالقوه خروج از آن آسان تر است.
- ایستا : ASLR بد هیپ، به طور بالقوه اجرای کد اولیه آسان تر است، اما یک خط مشی جعبه شنی مؤثرتر است، به طور بالقوه خروج از آن سخت تر است.
از لحاظ تاریخی، باینریهای مرتبط استاتیک از کد مستقل موقعیت ( pie
) پشتیبانی نمیکنند. علاوه بر این، Bazel به طور پیش فرض pie
را اضافه کرد. برای اینکه بتوانید یک فیلتر syscall محکم تعریف کنید، باید مقدار پیشفرض Bazel را بازنویسی کنید.
کامپایلرها در طول سال ها بهبود یافته اند و اکنون از گزینه static-pie
پشتیبانی می کنند. با استفاده از این گزینه، به یک کامپایلر دستور داده میشود که کد مستقل از موقعیت را تولید کند، اما در مقایسه با pie
، اکنون شامل تمام کتابخانههای مرتبط استاتیک نیز میشود. از نقطه نظر امنیتی، static-pie
همچنان آنتروپی ASLR را کاهش می دهد (از 30 بیت به 14 بیت)، اما این نسبت به وضعیت قبلی بدون pie
بهبود یافته است.
از آنجایی که Bazel به صورت پیشفرض pie
اضافه میکند و static با آن ناسازگار است، استفاده از پرچم گزینههای لینکر را برای ارسال پرچم -static-pie
linker به قانون cc_binary و بازنویسی پیشفرض در نظر بگیرید:
linkstatic = 1,
linkopts=["-static-pie"],
برای نمونهای از این گزینهها، به مثال استاتیک BUILD نگاه کنید: static_bin.cc بهصورت استاتیک با static-pie
مرتبط است، که امکان داشتن یک خطمشی syscall بسیار فشرده را ممکن میسازد. این همچنین برای سندباکس کردن باینری های شخص ثالث به خوبی کار می کند.
آیا می توانم باینری های 32 بیتی x86 سندباکس؟
Sandbox2 فقط می تواند همان معماری را که با آن کامپایل شده است جعبه سندباکس کند.
علاوه بر این، پشتیبانی از x86 32 بیتی از Sandbox2 حذف شده است. اگر سعی کنید از یک مجری 64 بیتی x86 برای جعبه سندباکس یک باینری x86 32 بیتی یا یک باینری x86 64 بیتی برای ساختن سیستم های 32 بیتی (از طریق int 0x80) استفاده کنید، هر دو یک نقض جعبه سند ایجاد می کنند که می تواند توسط برچسب معماری [X86-32] شناسایی شود.
دلیل این رفتار این است که اعداد syscall بین معماری ها متفاوت است و از آنجایی که خط مشی syscall در معماری اجراکننده نوشته شده است، اجازه دادن به یک معماری متفاوت برای Sandboxee خطرناک است. در واقع، این می تواند منجر به اجازه دادن به یک syscall به ظاهر بی ضرر شود که در واقع به این معنی است که syscall مضرتر دیگری می تواند جعبه شنی را به سمت فرار باز کند.
آیا محدودیتی در تعداد جعبه های ماسه ای وجود دارد که یک فرآیند مجری می تواند درخواست کند؟
برای هر نمونه Sandboxee (فرآیند جدیدی که از forkserver ایجاد می شود)، یک رشته جدید ایجاد می شود - این جایی است که محدودیت وجود دارد.
آیا یک Executor می تواند درخواست ایجاد بیش از یک Sandbox را بدهد؟
خیر. یک رابطه 1:1 وجود دارد - یک نمونه Executor PID Sandboxee را ذخیره می کند، نمونه Comms را به نمونه Sandbox مدیریت می کند و غیره.
چرا در داخل forkserver.cc "عملکرد اجرا نشد" را دریافت می کنم؟
Sandbox2 فقط از اجرا بر روی هسته های نسبتاً جدید پشتیبانی می کند. برش فعلی ما هسته 3.19 است، اگرچه ممکن است در آینده تغییر کند. دلیل این امر این است که ما از ویژگی های هسته نسبتاً جدید از جمله فضاهای نام کاربری و seccomp با پرچم TSYNC استفاده می کنیم.
اگر روی prod اجرا میکنید، این موضوع نباید مشکلی داشته باشد، زیرا تقریباً کل ناوگان یک هسته جدید به اندازه کافی اجرا میکند. اگر در این مورد مشکلی دارید، لطفا با ما تماس بگیرید.
اگر روی دبیان یا اوبونتو اجرا میکنید، بهروزرسانی هستهتان به آسانی اجراست:
sudo apt-get install linux-image-<RECENT_VERSION>