ShadowCallStack

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 لا تؤثر في الخاص بك.