ShadowCallStack (SCS) هو وضع لأداة LLVM لتوفير الحماية من. استبدال عنوان الإرجاع (مثل تجاوزات المخزن المؤقت المكدس) عن طريق حفظ عنوان إرجاع إلى ShadowCallStack مخصصًا بشكل منفصل في دالة البروجيكة للدوال غير الثنائية، وتحميل عنوان الإرجاع من ShadowCallStack في نهاية الدالة. ويتم أيضًا تخزين عنوان الإرجاع. في الحزمة العادية للتوافق مع أدوات إلغاء الند، ولكن لا يتم استخدامه بخلاف ذلك. ويضمن ذلك الهجمات التي تعدِّل عنوان الإرجاع في الحزمة العادية. ليس لها أي تأثير على تدفق التحكم في البرنامج.
في aarch64، تستخدم الأداة x18
سجل للإشارة إلى ShadowCallStack، مما يعني أن يشير إلى
إلى ShadowCallStack، لن يتم تخزينها في الذاكرة.
وهذا يجعل من الممكن تنفيذ بيئة تشغيل تتجنب الكشف عن
عنوان ShadowCallStack إلى المهاجمين الذين يمكنهم قراءة
ذاكرة عشوائية.
التنفيذ
يتوافق Android مع ShadowCallStack لكل من kernel وuserspace.
تفعيل SCS للنواة
لتمكين ShadowCallStack للنواة، أضف السطر التالي إلى ملف تهيئة النواة:
CONFIG_SHADOW_CALL_STACK=y
تفعيل SCS في مساحة المستخدم
لتفعيل ShadowCallStack في مكونات مساحة المستخدم، أضِف الأسطر التالية إلى ملف المخطط الخاص بالمكون:
sanitize: { scs: true }
تفترض SCS أنّ سجلّ x18
محجوز لتخزين عنوان
ShadowCallStack، ولا يتم استخدامه لأي أغراض أخرى. بينما يعمل كل النظام
تجميع المكتبات لحجز سجلّ x18
، فمن المحتمل أن
إذا تم تفعيل SCS لمكونات مساحة المستخدم التي تعمل مع
رمز قديم قيد المعالجة (مثل المكتبات التي يمكن تحميلها من خلال جهة خارجية
التي قد تهدّد سجل x18
. وبناءً على ذلك، نقترح فقط
تفعيل SCS في مكونات مستقلة لن يتم تحميلها في النظام القديم
البرامج الثنائية.
التحقُّق
ما مِن اختبار CTS مخصّص لـ SCS. بدلاً من ذلك، احرص على إجراء اختبارات CTS مع تفعيل SCS أو عدم تفعيلها للتحقّق من أنّ SCS لا تؤثر في الخاص بك.