طراحی Sandbox2 مبتنی بر فناوریهای شناخته شده و تثبیتشده، چارچوب خطمشی و دو فرآیند است: Sandbox Executor و Sandboxee.
فن آوری های درگیر
بخشهای زیر فناوریهایی را پوشش میدهند که لایه پایه را برای Sandbox2 میسازند.
فضای نام لینوکس
فضاهای نام لینوکس تلاشی برای ارائه مجازی سازی در سطح سیستم عامل است. در حالی که چندین فضای کاربری به ظاهر مستقل از یکدیگر اجرا می شوند، آنها یک نمونه هسته واحد را به اشتراک می گذارند. Sandbox2 از انواع فضای نام زیر استفاده می کند:
- IPC
- شبکه (مگر اینکه صراحتاً با فراخوانی
PolicyBuilder::AllowUnrestrictedNetworking()
غیرفعال شود. - Mount (با استفاده از نمای سفارشی درخت سیستم فایل)
- PID
- کاربر (مگر اینکه با فراخوانی
PolicyBuilder::AllowUnsafeKeepCapabilities()
صراحتاً غیرفعال شود. - UTS
درباره فضاهای نام لینوکس در ویکیپدیا یا در صفحه مرد مرتبط بیشتر بخوانید.
IPC
Sandbox2 اجازه می دهد تا داده های دلخواه بین Sandbox Executor و Sandboxee غیرقابل اعتماد مبادله شود. از پیامهای Type-Length-Value (TLV)، انتقال توصیفگر فایل و تبادل اعتبار از طریق توکنها و دستهها پشتیبانی میکند.
Seccomp-BPF
Sandbox2 به seccomp-bpf متکی است، که افزونهای برای حالت محاسبات ایمن (seccomp) است که امکان استفاده از قوانین فیلتر بسته برکلی (BPF) را برای فیلتر کردن syscals فراهم میکند.
seccomp یک مرکز هسته لینوکس است که فراخوانی های سیستمی یک فرآیند را محدود می کند تا فقط اجازه exit
، sigreturn
، read
و write
بدهد. اگر فرآیندی سعی کند یک syscall دیگر را اجرا کند، خاتمه خواهد یافت. پسوند seccomp-bpf انعطاف پذیری بیشتری نسبت به seccomp می دهد. seccomp-bpf به جای اجازه دادن به مجموعه ثابتی از syscall، یک برنامه BPF را روی داده های syscall اجرا می کند و بسته به مقدار برگشتی برنامه، می تواند syscall را اجرا کند، syscall را رد کند و یک مقدار ساختگی برگرداند، فرآیند را خاتمه دهد، سیگنال تولید کند. ، یا به ردیاب اطلاع دهید.
Ptrace
syscall ptrace (ردیابی فرآیند) عملکردی را ارائه می دهد که به فرآیند ردیاب اجازه می دهد تا اجرای فرآیند tracee را مشاهده و کنترل کند. فرآیند ردیاب کنترل کاملی بر ردیابی پس از اتصال دارد. درباره ptrace در ویکی پدیا یا در صفحه مرد مرتبط بیشتر بخوانید.
خط مشی جعبه ایمنی
خطمشی Sandbox مهمترین بخش یک جعبه ایمنی است، زیرا اقداماتی را که Sandboxee میتواند و نمیتواند اجرا کند را مشخص میکند. یک خط مشی جعبه ایمنی دو بخش دارد:
- خط مشی Syscall
- تنظیم فضای نام
خط مشی Syscall پیش فرض
خطمشی پیشفرض سیستمهای سیگنالی را که همیشه خطرناک هستند مسدود میکند و بر خطمشی توسعهیافته ارائهشده توسط کاربر اولویت دارد.
سیاست Syscall توسعه یافته
سیاست syscall توسعه یافته را می توان با استفاده از کلاس PolicyBuilder ما ایجاد کرد. این کلاس تعدادی از قوانین راحتی را تعریف می کند (مانند AllowStaticStartup
، AllowDynamicStartup
، AllowOpen
) که می تواند برای بهبود خوانایی خط مشی شما استفاده شود.
اگر میخواهید syscalls را بیشتر محدود کنید یا به قوانین پیچیدهتری نیاز دارید، میتوانید ماکروهای BPF خام را با AddPolicyOnSyscall
و AddPolicyOnSyscalls
مشخص کنید. مثال crc4 از این مکانیسم برای محدود کردن آرگومانهای read
، write
و close
syscals استفاده میکند.
به طور کلی، هرچه سیاست Sandbox سختتر باشد، بهتر است زیرا سوء استفاده از هر آسیبپذیری موجود در کد توسط این خطمشی محدود میشود. اگر بتوانید دقیقا مشخص کنید که کدام یک از سیستمها و آرگومانها برای عملکرد عادی برنامه مورد نیاز است، هر مهاجمی که از آسیبپذیری اجرای کد سوء استفاده میکند نیز به همان محدودیتها محدود میشود.
یک سیاست Sandbox واقعاً فشرده میتواند همه syscals را به جز خواندن و نوشتن در توصیفگرهای استاندارد فایل ورودی و خروجی رد کند. در داخل این جعبه شنی، یک برنامه می تواند ورودی بگیرد، آن را پردازش کند و خروجی را برگرداند. با این حال، اگر فرآیند تلاش برای ایجاد هر گونه syscall دیگری داشته باشد، به دلیل نقض خطمشی خاتمه مییابد. از این رو، اگر فرآیند به خطر بیفتد (اجرای کد توسط یک کاربر مخرب)، نمیتواند کاری بدتر از تولید خروجی بد انجام دهد (که مجری و دیگران هنوز باید به درستی آن را مدیریت کنند).
تنظیم فضای نام
شی PolicyBuilder همچنین برای تنظیم نمای فردی Sandboxee از سیستم فایل استفاده می شود. فایلهای منفرد ( AddFile
/ AddFileAt
)، کل فهرستها ( AddDirectory
/ AddDirectoryAt
)، و همچنین ذخیرهسازی موقت ( AddTmpfs
) را میتوان در محیط Sandboxee نگاشت. علاوه بر این، AddLibrariesForBinary
میتواند برای نقشهبرداری خودکار تمام کتابخانههای مورد نیاز توسط فایل اجرایی مرتبط بهصورت پویا استفاده شود.
پرچم های خط فرمان
هر خط مشی Sandbox2 را می توان با مشخص کردن یکی از پرچم های خط فرمان زیر غیرفعال کرد. این پرچمها برای اهداف آزمایشی در نظر گرفته شدهاند (مثلاً هنگام اصلاح سیاست Syscall توسعهیافته).
-
--sandbox2_danger_danger_permit_all
-
--sandbox2_danger_danger_permit_all_and_log
اجرای سندباکس
Sandbox Executor فرآیندی است که خودش سندباکس نشده است. این فرآیند ردیاب ptrace است که به Sandboxee (فرایند ردیابی ptrace) متصل می شود. Sandbox Executor همچنین یک نمونه مانیتور را تنظیم و اجرا می کند که Sandboxee را ردیابی می کند و اطلاعات وضعیت را ارائه می دهد.
Sandbox2 سه حالت اجرا را امکان پذیر می کند: Stand-alone، Sandbox2 Forkserver و Custom Forkserver. اگر از یک forkserver استفاده می کنید، Sandboxee به عنوان یک فرآیند فرزند Sandbox Executor ایجاد می شود. این حالت ها در اینجا به تفصیل توضیح داده شده است.
Sandboxee
Sandboxee فرآیندی است که در محیط محدود و جعبهشنیزی اجرا میشود که توسط Sandbox Policy تعریف شده است. Sandbox Executor خط مشی را از طریق IPC به Sandboxee ارسال می کند. سپس Sandboxee این خط مشی را اعمال می کند. هر گونه نقض خطمشی منجر به خاتمه فرآیند میشود، مگر اینکه پیکربندی دیگری انجام شود (به خطمشی Sandbox مراجعه کنید).
،طراحی Sandbox2 مبتنی بر فناوریهای شناخته شده و تثبیتشده، چارچوب خطمشی و دو فرآیند است: Sandbox Executor و Sandboxee.
فن آوری های درگیر
بخشهای زیر فناوریهایی را پوشش میدهند که لایه پایه را برای Sandbox2 میسازند.
فضای نام لینوکس
فضاهای نام لینوکس تلاشی برای ارائه مجازی سازی در سطح سیستم عامل است. در حالی که چندین فضای کاربری به ظاهر مستقل از یکدیگر اجرا می شوند، آنها یک نمونه هسته واحد را به اشتراک می گذارند. Sandbox2 از انواع فضای نام زیر استفاده می کند:
- IPC
- شبکه (مگر اینکه صراحتاً با فراخوانی
PolicyBuilder::AllowUnrestrictedNetworking()
غیرفعال شود. - Mount (با استفاده از نمای سفارشی درخت سیستم فایل)
- PID
- کاربر (مگر اینکه با فراخوانی
PolicyBuilder::AllowUnsafeKeepCapabilities()
صراحتاً غیرفعال شود. - UTS
درباره فضاهای نام لینوکس در ویکیپدیا یا در صفحه مرد مرتبط بیشتر بخوانید.
IPC
Sandbox2 اجازه می دهد تا داده های دلخواه بین Sandbox Executor و Sandboxee غیرقابل اعتماد مبادله شود. از پیامهای Type-Length-Value (TLV)، انتقال توصیفگر فایل و تبادل اعتبار از طریق توکنها و دستهها پشتیبانی میکند.
Seccomp-BPF
Sandbox2 به seccomp-bpf متکی است، که افزونهای برای حالت محاسبات ایمن (seccomp) است که امکان استفاده از قوانین فیلتر بسته برکلی (BPF) را برای فیلتر کردن syscals فراهم میکند.
seccomp یک مرکز هسته لینوکس است که فراخوانی های سیستمی یک فرآیند را محدود می کند تا فقط اجازه exit
، sigreturn
، read
و write
بدهد. اگر فرآیندی سعی کند یک syscall دیگر را اجرا کند، خاتمه خواهد یافت. پسوند seccomp-bpf انعطاف پذیری بیشتری نسبت به seccomp می دهد. seccomp-bpf به جای اجازه دادن به مجموعه ثابتی از syscall، یک برنامه BPF را روی داده های syscall اجرا می کند و بسته به مقدار برگشتی برنامه، می تواند syscall را اجرا کند، syscall را رد کند و یک مقدار ساختگی برگرداند، فرآیند را خاتمه دهد، سیگنال تولید کند. ، یا به ردیاب اطلاع دهید.
Ptrace
syscall ptrace (ردیابی فرآیند) عملکردی را ارائه می دهد که به فرآیند ردیاب اجازه می دهد تا اجرای فرآیند tracee را مشاهده و کنترل کند. فرآیند ردیاب کنترل کاملی بر ردیابی پس از اتصال دارد. درباره ptrace در ویکی پدیا یا در صفحه مرد مرتبط بیشتر بخوانید.
خط مشی جعبه ایمنی
خطمشی Sandbox مهمترین بخش یک جعبه ایمنی است، زیرا اقداماتی را که Sandboxee میتواند و نمیتواند اجرا کند را مشخص میکند. یک خط مشی جعبه ایمنی دو بخش دارد:
- خط مشی Syscall
- تنظیم فضای نام
خط مشی Syscall پیش فرض
خطمشی پیشفرض سیستمهای سیگنالی را که همیشه خطرناک هستند مسدود میکند و بر خطمشی توسعهیافته ارائهشده توسط کاربر اولویت دارد.
سیاست Syscall توسعه یافته
سیاست syscall توسعه یافته را می توان با استفاده از کلاس PolicyBuilder ما ایجاد کرد. این کلاس تعدادی از قوانین راحتی را تعریف می کند (مانند AllowStaticStartup
، AllowDynamicStartup
، AllowOpen
) که می تواند برای بهبود خوانایی خط مشی شما استفاده شود.
اگر میخواهید syscalls را بیشتر محدود کنید یا به قوانین پیچیدهتری نیاز دارید، میتوانید ماکروهای BPF خام را با AddPolicyOnSyscall
و AddPolicyOnSyscalls
مشخص کنید. مثال crc4 از این مکانیسم برای محدود کردن آرگومانهای read
، write
و close
syscals استفاده میکند.
به طور کلی، هرچه سیاست Sandbox سختتر باشد، بهتر است زیرا سوء استفاده از هر آسیبپذیری موجود در کد توسط این خطمشی محدود میشود. اگر بتوانید دقیقا مشخص کنید که کدام یک از سیستمها و آرگومانها برای عملکرد عادی برنامه مورد نیاز است، هر مهاجمی که از آسیبپذیری اجرای کد سوء استفاده میکند نیز به همان محدودیتها محدود میشود.
یک سیاست Sandbox واقعاً فشرده میتواند همه syscals را به جز خواندن و نوشتن در توصیفگرهای استاندارد فایل ورودی و خروجی رد کند. در داخل این جعبه شنی، یک برنامه می تواند ورودی بگیرد، آن را پردازش کند و خروجی را برگرداند. با این حال، اگر فرآیند تلاش برای ایجاد هر گونه syscall دیگری داشته باشد، به دلیل نقض خطمشی خاتمه مییابد. از این رو، اگر فرآیند به خطر بیفتد (اجرای کد توسط یک کاربر مخرب)، نمیتواند کاری بدتر از تولید خروجی بد انجام دهد (که مجری و دیگران هنوز باید به درستی آن را مدیریت کنند).
تنظیم فضای نام
شی PolicyBuilder همچنین برای تنظیم نمای فردی Sandboxee از سیستم فایل استفاده می شود. فایلهای منفرد ( AddFile
/ AddFileAt
)، کل فهرستها ( AddDirectory
/ AddDirectoryAt
)، و همچنین ذخیرهسازی موقت ( AddTmpfs
) را میتوان در محیط Sandboxee نگاشت. علاوه بر این، AddLibrariesForBinary
میتواند برای نقشهبرداری خودکار تمام کتابخانههای مورد نیاز توسط فایل اجرایی مرتبط بهصورت پویا استفاده شود.
پرچم های خط فرمان
هر خط مشی Sandbox2 را می توان با مشخص کردن یکی از پرچم های خط فرمان زیر غیرفعال کرد. این پرچمها برای اهداف آزمایشی در نظر گرفته شدهاند (مثلاً هنگام اصلاح سیاست Syscall توسعهیافته).
-
--sandbox2_danger_danger_permit_all
-
--sandbox2_danger_danger_permit_all_and_log
اجرای سندباکس
Sandbox Executor فرآیندی است که خودش سندباکس نشده است. این فرآیند ردیاب ptrace است که به Sandboxee (فرایند ردیابی ptrace) متصل می شود. Sandbox Executor همچنین یک نمونه مانیتور را تنظیم و اجرا می کند که Sandboxee را ردیابی می کند و اطلاعات وضعیت را ارائه می دهد.
Sandbox2 سه حالت اجرا را امکان پذیر می کند: Stand-alone، Sandbox2 Forkserver و Custom Forkserver. اگر از یک forkserver استفاده می کنید، Sandboxee به عنوان یک فرآیند فرزند Sandbox Executor ایجاد می شود. این حالت ها در اینجا به تفصیل توضیح داده شده است.
Sandboxee
Sandboxee فرآیندی است که در محیط محدود و جعبهشنیزی اجرا میشود که توسط Sandbox Policy تعریف شده است. Sandbox Executor خط مشی را از طریق IPC به Sandboxee ارسال می کند. سپس Sandboxee این خط مشی را اعمال می کند. هر گونه نقض خطمشی منجر به خاتمه فرآیند میشود، مگر اینکه پیکربندی دیگری انجام شود (به خطمشی Sandbox مراجعه کنید).