محققان دانشگاه استنفورد، دانشگاه کالیفرنیا در سن دیگو و دانشگاه تگزاس در آستین ابزار که میتواند به عنوان یک لایه ایزوله اضافی برای مسدود کردن آسیبپذیریها در کتابخانههای تابع استفاده شود. RLBox قصد دارد مشکل امنیتی کتابخانههای شخص ثالث غیرقابل اعتمادی را که تحت کنترل توسعهدهندگان نیستند، اما آسیبپذیریهای آنها میتواند پروژه اصلی را به خطر بیندازد، برطرف کند.
شرکت موزیلا فعال کردن RLBox در Linux-ساختهای فایرفاکس ۷۴ و macOS-فایرفاکس ۷۵ برای ایزوله کردن اجرای کتابخانه ساخته شده است که مسئول رندر کردن فونتها است. RLBox مختص فایرفاکس نیست و میتواند برای جداسازی هر کتابخانهای در هر پروژهای مورد استفاده قرار گیرد. RLBox تحت مجوز MIT. RLBox در حال حاضر از پلتفرمها پشتیبانی میکند Linux и macOS، پشتیبانی Windows بعداً انتظار میرود.
عملیات RLBox شامل کامپایل کد C/C++ یک کتابخانه ایزوله به کد WebAssembly سطح پایین و میانی است که سپس به عنوان یک ماژول WebAssembly قالببندی میشود، مجوزهایی که فقط برای این ماژول مشخص شدهاند (برای مثال، یک کتابخانه پردازش رشته قادر به باز کردن یک سوکت یا فایل شبکه نخواهد بود). تبدیل کد C/C++ به WebAssembly با استفاده از .
برای اجرای مستقیم، ماژول WebAssembly با استفاده از یک کامپایلر به کد ماشین کامپایل میشود. و در یک "نانوپردازش" جداگانه، جدا از بقیه حافظه برنامه اجرا میشود. کامپایلر Lucet بر اساس همان کد موتور JIT است. ، که در فایرفاکس برای اجرای WebAssembly استفاده میشود.
ماژول مونتاژ شده در یک ناحیه حافظه جداگانه عمل میکند و به بقیه فضای آدرس دسترسی ندارد. اگر از یک آسیبپذیری در کتابخانه سوءاستفاده شود، مهاجم محدود شده و قادر به دسترسی به نواحی حافظه فرآیند اصلی یا انتقال کنترل به خارج از محیط ایزوله نخواهد بود.
راهنمایی سطح بالا برای توسعهدهندگان ارائه میشود که امکان فراخوانی توابع کتابخانهای را در حالت ایزوله فراهم میکند. هندلرهای WebAssembly تقریباً به هیچ منبع اضافی نیاز ندارند و تعامل با آنها خیلی کندتر از فراخوانی توابع معمولی نیست (توابع کتابخانهای به صورت کد بومی اجرا میشوند و سربار فقط هنگام کپی کردن و تأیید دادهها در حین تعامل با محیط ایزوله ایجاد میشود). توابع کتابخانهای ایزوله را نمیتوان مستقیماً فراخوانی کرد و دسترسی به آنها نیاز به استفاده از
لایه invoke_sandbox_function() را فراخوانی کنید.
به نوبه خود، اگر فراخوانی توابع خارجی از کتابخانه ضروری باشد، این توابع باید به طور صریح با استفاده از متد register_callback تعریف شوند (به طور پیشفرض، RLBox دسترسی به توابع را فراهم میکند) برای اطمینان از ایمنی حافظه، ایزولهسازی اجرای کد کافی نیست؛ همچنین لازم است از بررسی جریانهای داده برگشتی اطمینان حاصل شود.
مقادیر تولید شده در یک محیط ایزوله به عنوان غیرقابل اعتماد علامت گذاری شده و استفاده از آنها محدود است. و برای "تمیز کردن" آنها نیاز دارند و کپی کردن در حافظه برنامه.
بدون پاکسازی، تلاش برای استفاده از دادههای آلوده در زمینهای که نیاز به دادههای منظم دارد (و برعکس) منجر به خطاهای زمان کامپایل میشود. آرگومانهای تابع کوچک، مقادیر بازگشتی و ساختارها بین حافظه فرآیند و حافظه جعبه شنی کپی میشوند. برای مجموعه دادههای بزرگتر، حافظه در جعبه شنی اختصاص داده میشود و یک "ارجاع جعبه شنی" مستقیم به فرآیند اصلی بازگردانده میشود.
منبع: opennet.ru
