ShadowCallStack (SCS) یک حالت ابزار دقیق LLVM است که با ذخیره آدرس برگشتی یک تابع در یک ShadowCallStack به طور جداگانه در پرولوگ تابع توابع غیربرگی و بارگیری آدرس برگشتی از ShadowCallStack در تابع، در برابر بازنویسی آدرس برگشتی (مانند سرریزهای بافر پشته) محافظت می کند. اپیلوگ آدرس برگشتی نیز برای سازگاری با unwinder در پشته معمولی ذخیره می شود، اما در غیر این صورت استفاده نمی شود. این تضمین می کند که حملاتی که آدرس برگشتی را در پشته معمولی تغییر می دهند، هیچ تاثیری بر جریان کنترل برنامه ندارند.
در aarch64، ابزار دقیق از ثبات x18
برای ارجاع به ShadowCallStack استفاده می کند، به این معنی که ارجاعات به ShadowCallStack لازم نیست در حافظه ذخیره شوند. این امکان اجرای یک زمان اجرا را فراهم می کند که از افشای آدرس ShadowCallStack در معرض مهاجمانی که می توانند حافظه دلخواه را بخوانند، جلوگیری کند.
پیاده سازی
اندروید از ShadowCallStack هم برای هسته و هم برای فضای کاربری پشتیبانی می کند.
SCS را برای هسته فعال کنید
برای فعال کردن ShadowCallStack برای هسته، خط زیر را به فایل پیکربندی هسته اضافه کنید:
CONFIG_SHADOW_CALL_STACK=y
SCS را در فضای کاربری فعال کنید
برای فعال کردن ShadowCallStack در اجزای userspace، خطوط زیر را به فایل طرح کامپوننت اضافه کنید:
sanitize: { scs: true }
SCS فرض می کند که رجیستر x18
برای ذخیره آدرس ShadowCallStack رزرو شده است و برای اهداف دیگری استفاده نمی شود. در حالی که همه کتابخانههای سیستم برای رزرو ثبت x18
کامپایل شدهاند، اگر SCS برای مؤلفههای فضای کاربر که با کدهای قدیمی در فرآیند کار میکنند (به عنوان مثال، کتابخانههایی که میتوانند توسط برنامههای شخص ثالث بارگیری شوند)، فعال شود، این امر به طور بالقوه مشکل ساز است. ثبت x18
به این ترتیب، ما فقط توصیه میکنیم SCS را در مؤلفههای مستقلی که در باینریهای قدیمی بارگذاری نمیشوند، فعال کنید.
اعتبار سنجی
هیچ آزمایش CTS به طور خاص برای SCS وجود ندارد. درعوض، مطمئن شوید که تستهای CTS با و بدون SCS فعال باشد تا تأیید شود که SCS روی دستگاه تأثیر نمیگذارد.