ShadowCallStack

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 روی دستگاه تأثیر نمی‌گذارد.