از 27 مارس 2025، توصیه می کنیم از android-latest-release به جای aosp-main برای ساختن و کمک به AOSP استفاده کنید. برای اطلاعات بیشتر، به تغییرات AOSP مراجعه کنید.
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
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 روی دستگاه تأثیر نمیگذارد.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# ShadowCallStack\n\n| **Note:** ShadowCallStack is only implemented for aarch64.\n\nShadowCallStack (SCS) is an [LLVM instrumentation](https://clang.llvm.org/docs/ShadowCallStack.html) mode that protects against\nreturn address overwrites (like stack buffer overflows) by saving a function's\nreturn address to a separately allocated **ShadowCallStack** in\nthe function prolog of nonleaf functions and loading the return address from\nthe ShadowCallStack in the function epilog. The return address is also stored\non the regular stack for compatibility with unwinders, but is otherwise unused.\nThis ensures that attacks that modify the return address on the regular stack\nhave no effect on program control flow.\n\nOn aarch64, the instrumentation makes use of the `x18`\nregister to reference the ShadowCallStack, meaning that references\nto the ShadowCallStack don't have to be stored in memory.\nThis makes it possible to implement a runtime that avoids exposing\nthe address of the ShadowCallStack to attackers that can read\narbitrary memory.\n\nImplementation\n--------------\n\nAndroid supports ShadowCallStack for both kernel and userspace.\n\n### Enable SCS for the kernel\n\nTo enable ShadowCallStack for the kernel, add the following line to the\nkernel config file: \n\n```\nCONFIG_SHADOW_CALL_STACK=y\n```\n\n### Enable SCS in userspace\n\nTo enable ShadowCallStack in userspace components, add the\nfollowing lines to a component's blueprint file: \n\n```\nsanitize: {\n scs: true\n}\n```\n\nSCS assumes that the `x18` register is reserved to store the address of the\nShadowCallStack, and isn't used for any other purposes. While all system\nlibraries are compiled to reserve the `x18` register, this is potentially\nproblematic if SCS is enabled for userspace components that interoperate with\nin-process legacy code (for example, libraries that could be loaded by third-party\napps), which may clobber the `x18` register. As such, we only recommend\nenabling SCS in self-contained components that won't be loaded into legacy\nbinaries.\n\nValidation\n----------\n\nThere are no CTS test specifically for SCS. Instead, make sure that CTS tests\npass with and without SCS enabled to verify that SCS isn't impacting the\ndevice."]]