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 لا يؤثّر في الجهاز.