توضیح Sandboxed API

Sandboxed API (SAPI)‎ براساس پروژه شناخته‌شده Sandbox2 ساخته شده است. این صفحه معماری طراحی SAPI و مفاهیم کلیدی را توضیح می‌دهد.

نمای کلی

SAPI به‌گونه‌ای طراحی شده است که ابزارهایی را برای آماده‌سازی کتابخانه‌های C/C++‎ برای جعبه شنی و همچنین میاناهای برنامه‌سازی کاربردی لازم برای ارتباط با نسخه جعبه شنی کتابخانه‌های C/C++‎ دراختیار توسعه‌دهندگان قرار دهد.

این نمودار معماری کتابخانه C/C++ جعبه ایمنی SAPI را نشان می‌دهد:

نمودار SAPI

SAPI همچنین اصول همگام‌سازی حافظه (آرایه‌ها، ساختارها) را به‌صورت دستی و خودکار (براساس ویژگی‌های اشاره‌گر سفارشی) بین کتابخانه‌های SAPI و کد میزبان ارائه می‌دهد.

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

Sandbox2

پروژه متن‌باز Sandbox2 توسط مهندسان امنیتی Google توسعه یافته و نگهداری می‌شود و فناوری جعبه امن اصلی است که توسط SAPI استفاده می‌شود. ‫Sandbox2 شامل سه مؤلفه اصلی است: خط‌مشی Sandbox، مجری، و Sandboxee.

خط‌مشی جعبه شنی

خط‌مشی جعبه امن محیط اجرای محدودشده را برای «کتابخانه جعبه امن» تعریف می‌کند. این کار با شفاف‌سازی اینکه کدام فراخوان‌های سیستمی می‌توانند اجرا شوند انجام می‌شود. ‫SAPI از همان سازوکار Sandbox2 استفاده می‌کند، برای اطلاعات بیشتر درباره نحوه طراحی و تعریف خط‌مشی جعبه امن، به بخش «خط‌مشی جعبه امن» و صفحه «شروع به کار» برای Sandbox2 مراجعه کنید.

به‌طور پیش‌فرض، کلاس‌های جعبه شنی SAPI تولیدشده بااستفاده از DefaultConfig (sapi::SandboxConfig::DefaultConfig()) مقداردهی اولیه می‌شوند. DefaultConfig() جعبه شنی را با موارد زیر پیکربندی می‌کند:

  • خط‌مشی پیش‌فرض Sandbox2 ساخته‌شده با sapi::Sandbox2Config::DefaultPolicyBuilder()
  • منبع پیش‌فرض و محدودیت‌های زمانی از sapi::Sandbox2Config::DefaultLimits()
  • ارتباط حافظه مشترک فعال شد (با اجازه‌های حافظه مشترک در DefaultPolicyBuilder() جفت شد)
  • پرچم‌های خط فرمان پیش‌فرض (sapi::SandboxConfig::DefaultFlags()) و متغیرهای محیطی (sapi::SandboxConfig::DefaultEnvironmentVariables()) که ثبت خط مبنا و رفتار زمان اجرا را در sandboxee پیکربندی می‌کنند

برای سفارشی‌سازی خط‌مشی یا پیکربندی جعبه شنی، از sapi::SandboxConfig::DefaultConfig() شروع کنید، sapi::SandboxConfig برگردانده‌شده را اصلاح کنید، و آن را به سازنده جعبه شنی تولیدشده ارسال کنید (یا زیرکلاس جعبه شنی سفارشی را در فایل سرایند sandbox.h تعریف کنید که به قانون ساخت sapi_library ارسال شده است). برای مثال، می‌توانید خط‌مشی‌ای را از sapi::Sandbox2Config::DefaultPolicyBuilder() شروع کنید و قوانین بیشتری را زنجیر کنید (یا وقتی پیکربندی محدودکننده‌تری لازم است، PolicyBuilder را مستقیماً بسازید)، و هنگام افزودن پرچم‌ها یا متغیرهای محیطی، از sapi::SandboxConfig::DefaultFlags() یا sapi::SandboxConfig::DefaultEnvironmentVariables() شروع کنید تا تنظیمات خط مبنا حفظ شود.

کتابخانه جعبه شنی‌شده

این کتابخانه C/C++‎ جعبه امن است که در محیط جعبه امن محدودشده ارائه‌شده توسط Sandbox2 اجرا خواهد شد. درنهایت، Sandboxed Library عملکرد موردنیاز را که می‌تواند توسط کد میزبان مصرف شود، نشان می‌دهد.

«کتابخانه جعبه امن» با قانون ساخت sapi_library ساخته شده است که در آن می‌توانید خط‌مشی جعبه امن سفارشی‌شده‌ای را مشخص کنید که محیط اجرای محدودشده را تعریف می‌کند. بسته به کتابخانه، ممکن است لازم باشد کد پوشاننده یا کد تهی بنویسید (به libcurl مراجعه کنید)، اما انتظار نمی‌رود کد منبع کتابخانه C/C++‎ را هنگام آماده‌سازی نسخه SAPI تغییر دهید.

SAPI Object و RPC Stub

SAPI Object یک شیء C++‎ است که API کتابخانه Sandboxed را نمایش می‌دهد. این میانجی تماس‌ها را از «کد میزبان» به «کد میانجی RPC» که در «کتابخانه SAPI» همراه با «کتابخانه جعبه شنی» جاسازی شده است بازارسال می‌کند.

این دو عنصر به‌طور خودکار توسط سیستم ساخت بااستفاده از قانون ساخت sapi_library() تولید می‌شوند. SAPI از دو سیستم ساخت پشتیبانی می‌کند: Bazel و CMake متعلق به Google.

کد میزبان

«کد میزبان» چیزی است که منطق ارائه‌شده توسط کتابخانه SAPI را پیاده‌سازی می‌کند. این همان چیزی است که درغیراین‌صورت نسخه بدون جعبه امن کتابخانه C/C++‎ را مصرف می‌کند. به این ترتیب، Host Code توابع صادرشده توسط کتابخانه SAPI را فراخوانی می‌کند، داده‌ها را به جعبه ایمنی ارسال می‌کند و داده‌ها را از آن دریافت می‌کند.

«کد میزبان» باید برای استفاده از کتابخانه SAPI تطبیق داده شود. به‌طور خاص، فراخوانی توابع کتابخانه امکان‌پذیر نیست زیرا کتابخانه در یک فرایند جداگانه با جعبه ایمنی قرار دارد. بنابراین، SAPI ابزارهایی را ارائه می‌دهد که یک شیء SAPI ایجاد می‌کنند که تماس‌ها را به کتابخانه SAPI پروکسی می‌کند.

مفاهیم

قوانین ساخت Bazel

پروژه SAPI دو قانون ساخت Bazel برای جعبه ایمنی کتابخانه C/C++ ارائه می‌دهد:

  • sapi_library() – همه بروندادهایی را که برای جعبه شنی کردن کتابخانه C/C++ به‌عنوان Sandboxee در Sandbox2 لازم است ایجاد می‌کند. خروجی ساخت می‌تواند به‌عنوان وابستگی برای قانون cc_binary() استفاده شود که برای ساختن باینری کد میزبان استفاده می‌شود.
  • sapi_interface() – سرصفحه‌ای را به‌طور خودکار تولید می‌کند که می‌تواند در کد میزبان باینری گنجانده شود.

برای توضیح جامع‌تر درباره «قوانین ساخت»، به قوانین ساخت مراجعه کنید.

متغیر

‫SAPI انواع ویژه‌ای به نام انواع SAPI ارائه می‌دهد که توصیه می‌کنیم در کد میزبان استفاده کنید. دلیل اصلی نیاز به «انواع SAPI» به‌خاطر فرایند و درنتیجه جداسازی حافظه بین «کد میزبان» و «کتابخانه جعبه امن» است.

برای توضیح جامع‌تر درباره این موضوع و مروری بر برخی‌از انواع SAPI که معمولاً استفاده می‌شوند، به متغیرها مراجعه کنید.

تراکنش‌ها

همان‌طور که در بالا توضیح داده شد، هر فراخوانی میانای برنامه‌سازی کاربردی به «کتابخانه محیط امن» ازطریق لایه RPC انتقال داده می‌شود. برای اینکه بتوانید خرابی در این لایه را مدیریت کنید، باید مدیریت خطای مناسب را پیاده‌سازی کنید. واحد SAPI Transaction سازوکار لازم را برای اطمینان از اینکه همه تماس‌ها با «کتابخانه محصور» بدون هیچ‌گونه مشکل سطح RPC تکمیل می‌شوند یا با خطای مربوطه برگردانده می‌شوند فراهم می‌کند.

برای توضیح جامع‌تر درباره این موضوع، به تراکنش‌ها مراجعه کنید.

درحال شروع کردن

برای راه‌اندازی اولین پروژه «میانای برنامه‌سازی کاربردی در محیط امن»، صفحه شروع به کار ما را بخوانید.