مایکروسافت CHERIOT را باز می کند، یک راه حل سخت افزاری برای بهبود امنیت کد C

مایکروسافت پیشرفت های مربوط به پروژه CHERIOT (Capability Hardware Extension to RISC-V for Internet of Things) را کشف کرده است که هدف آن مسدود کردن مشکلات امنیتی در کدهای موجود در C و C++ است. CHERIoT راه حلی ارائه می دهد که به شما امکان می دهد از پایگاه های کد C/C++ موجود بدون نیاز به کار مجدد محافظت کنید. حفاظت از طریق استفاده از یک کامپایلر اصلاح شده اجرا می شود که از مجموعه گسترده ای از دستورالعمل های پردازنده (ISA)، ارائه شده توسط پردازنده و در سطح سخت افزاری نظارت بر دسترسی به حافظه، بررسی صحت کار با اشاره گرها و اطمینان از جداسازی بلوک های کد استفاده می کند.

این پروژه با توجه به این واقعیت ایجاد شد که ماهیت سطح پایین زبان C به منبع خطا در هنگام کار با حافظه تبدیل می‌شود که منجر به مشکلاتی مانند سرریز شدن بافر، دسترسی به حافظه آزاد شده، عدم ارجاع اشاره‌گر یا آزادسازی مضاعف می‌شود. . تمرین نشان می‌دهد که حتی شرکت‌های بزرگی مانند گوگل و مایکروسافت که سیاست بررسی تغییرات سخت‌گیرانه دارند و از روش‌های توسعه مدرن و ابزارهای تحلیل استاتیک استفاده می‌کنند، نمی‌توانند عدم وجود خطا در هنگام کار با حافظه را تضمین کنند (به عنوان مثال، حدود 70 درصد از آسیب‌پذیری‌ها در مایکروسافت. و گوگل ناشی از مدیریت ناامن حافظه است).

مشکل را می توان با استفاده از زبان های برنامه نویسی که عملکرد ایمن با حافظه را تضمین می کنند، یا اتصال با بررسی های اضافی، به عنوان مثال، با استفاده از نشانگرهای معمولی مانند MiraclePtr (raw_ptr) که بررسی های اضافی را برای دسترسی به مناطق آزاد شده حافظه انجام می دهد، حل کرد. اما چنین روش‌هایی برای کدهای جدید مناسب‌تر هستند و کار مجدد پروژه‌های C/C++ موجود کاملاً مشکل‌ساز است، به‌ویژه اگر برای اجرا در محیط‌های محدود به منابع، مانند سیستم‌های تعبیه‌شده و دستگاه‌های اینترنت اشیا طراحی شده باشند.

اجزای سخت‌افزاری CHERIoT به‌عنوان یک میکروکنترلر بر اساس معماری RISC-V طراحی شده‌اند که معماری پردازنده حفاظت‌شده CHERI (Capability Hardware Extension to RISC-V) را پیاده‌سازی می‌کند، که مدلی از دسترسی کنترل‌شده به حافظه را بر اساس «قابلیت» (هر خواندن و نوشتن) ارائه می‌کند. عملیات روی حافظه مجاز است). بر اساس معماری مجموعه دستورالعمل (ISA) ارائه شده در CHERIOT، یک مدل نرم افزار ساخته شده است که ایمنی کار با حافظه را در سطح اشیاء منفرد تضمین می کند، در برابر دسترسی به حافظه آزاد شده محافظت می کند و یک سیستم جداسازی دسترسی به حافظه سبک وزن را پیاده سازی می کند. . مدل حفاظتی نرم‌افزار مشخص شده مستقیماً در مدل زبان C/C++ منعکس می‌شود که به آن اجازه می‌دهد برای محافظت از برنامه‌های موجود استفاده شود (فقط کامپایل مجدد و اجرا بر روی تجهیزاتی که از ISA CHERIOT پشتیبانی می‌کنند مورد نیاز است).

راه حل پیشنهادی به شما امکان می دهد تا خطاهایی را که باعث می شود یک شی از مرزهای حافظه فراتر رود، ببندید، اجازه جایگزینی نشانگر را نمی دهد (همه نشانگرها باید از نشانگرهای موجود تولید شوند)، و دسترسی به حافظه را پس از آزادسازی (هر گونه دسترسی به حافظه با استفاده از یک اشتباه نادرست) نظارت می کند. اشاره گر یا اشاره گر به یک شی آزاد شده منجر به ایجاد یک استثنا می شود). به عنوان مثال، استفاده از CHERIOT به شما امکان می دهد تا بررسی خودکار مرزها، ردیابی طول عمر حافظه، و اجرای یکپارچگی اشاره گر را در مؤلفه هایی که داده های نامعتبر را بدون نیاز به تغییر کد مدیریت می کنند، پیاده سازی کنید.

این پروژه شامل مشخصات معماری مجموعه دستورالعمل های توسعه یافته CHERIOT، پیاده سازی مرجع یک CPU 32 بیتی RISC-V که از CHERIOT ISA پشتیبانی می کند و یک جعبه ابزار LLVM اصلاح شده است. نمودارهای نمونه اولیه CPU و توضیحات بلوک سخت افزاری در Verilog تحت مجوز Apache 2.0 توزیع شده است. هسته Ibex از پروژه lowRISC به عنوان پایه برای CPU استفاده شد. مدل کد CHERIOT ISA به زبان Sail تعریف شده است و تحت مجوز BSD مجوز دارد.

علاوه بر این، یک نمونه اولیه از سیستم عامل بلادرنگ CHERIoT RTOS پیشنهاد شده است که توانایی ایزوله کردن محفظه ها را حتی در سیستم های تعبیه شده با 256 مگابایت رم فراهم می کند. کد CHERIOT RTOS به زبان C++ نوشته شده و تحت مجوز MIT توزیع شده است. اجزای اصلی سیستم عامل مانند بوت لودر، زمانبند و سیستم توزیع حافظه به صورت محفظه طراحی شده اند.

یک محفظه در CHERIOT RTOS ترکیبی مجزا از کد و متغیرهای سراسری است که شبیه یک کتابخانه مشترک است، اما برخلاف دومی، می‌تواند حالت خود را تغییر دهد (تغییرپذیر) و در یک زمینه امنیتی جداگانه اجرا شود. هیچ کدی از خارج نمی تواند کنترل را به کد موجود در یک محفظه منتقل کند و به اشیاء دسترسی پیدا کند، مگر با دسترسی به نقاط ورودی مشخص شده و استفاده از اشاره گرها به اشیائی که به صراحت هنگام فراخوانی محفظه دیگر ارسال می شوند. یکپارچگی و محرمانه بودن کد و اشیاء جهانی در یک محفظه تضمین شده است.

منبع: opennet.ru

اضافه کردن نظر