اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release بدلاً من aosp-main لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
ShadowCallStack (SCS) هو وضع أدوات LLVM يحمي من
عمليات استبدال عنوان الاسترجاع (مثل عمليات تجاوز ذاكرة التخزين المؤقت للوِحَد) من خلال حفظ عنوان
استرجاع الدالة في ShadowCallStack مخصّص بشكل منفصل في
مقدّمة الدالة للوظائف غير المنتهيّة وتحميل عنوان الاسترجاع من
ShadowCallStack في خاتمة الدالة. يتم أيضًا تخزين عنوان الإرجاع
في الحزمة العادية للتوافق مع أدوات فك الحزمة، ولكن لا يتم استخدامه لأي غرض آخر.
يضمن ذلك أنّ الهجمات التي تعدّل عنوان الإرجاع في الحزمة العادية
لن يكون لها أي تأثير في تدفّق التحكّم في البرنامج.
في aarch64، يستخدِم الفحص السجلّ x18
للإشارة إلى ShadowCallStack، ما يعني أنّه ليس من الضروري تخزين الإشارات
إلى ShadowCallStack في الذاكرة.
يتيح ذلك تنفيذ بيئة تشغيل تتجنّب الكشف عن عنوان ShadowCallStack للمهاجمين الذين يمكنهم قراءة ذاكرة عشوائية.
التنفيذ
يتوافق Android مع ShadowCallStack لكل من kernel ومساحة المستخدم.
تفعيل ميزة SCS للنواة
لتفعيل ShadowCallStack للنواة، أضِف السطر التالي إلى ملف تهيئة النواة:
CONFIG_SHADOW_CALL_STACK=y
تفعيل SCS في مساحة المستخدم
لتفعيل ShadowCallStack في مكوّنات مساحة المستخدم، أضِف
الأسطر التالية إلى ملف مخطّط المكوّن:
sanitize: {
scs: true
}
يفترض نظام SCS أنّ سجلّ x18 محجوز لتخزين عنوان
ShadowCallStack، ولا يتم استخدامه لأي أغراض أخرى. على الرغم من أنّه يتم تجميع كل مكتبات النظام للحفاظ على سجلّ x18، إلا أنّ ذلك قد يتسبب في حدوث مشكلة في حال تفعيل ميزة SCS لمكونات مساحة المستخدم التي تتفاعل مع الرمز القديم الجاري تنفيذه (على سبيل المثال، المكتبات التي يمكن أن تحمّلها تطبيقات تابعة لجهات خارجية)، ما قد يؤدي إلى إلغاء سجلّ x18. وبناءً على ذلك، ننصح فقط
بتفعيل SCS في المكوّنات المُكتفية ذاتيًا التي لن يتم تحميلها في ملفَي ثنائيَين قديمَين.
التحقُّق
لا يتوفّر اختبار CTS مخصّص لنظام SCS. بدلاً من ذلك، تأكَّد من اجتياز اختبارات CTS
مع تفعيل SCS أو بدونه للتأكّد من أنّ SCS لا يؤثّر في
الجهاز.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","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-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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."]]