ShadowCallStack

ShadowCallStack (SCS) هو وضع أدوات LLVM يحمي من الكتابة فوق عنوان الإرجاع (مثل تجاوز المخزن المؤقت للتكدس) عن طريق حفظ عنوان إرجاع الوظيفة إلى ShadowCallStack المخصص بشكل منفصل في مقدمة الوظائف للوظائف غير الورقية وتحميل عنوان الإرجاع من ShadowCallStack في الوظيفة الخاتمه. يتم تخزين عنوان المرسل أيضًا على المكدس العادي للتوافق مع وحدات فك اللفات ، ولكن لا يتم استخدامه بخلاف ذلك. هذا يضمن أن الهجمات التي تعدل عنوان الإرجاع على المكدس العادي لن يكون لها أي تأثير على تدفق التحكم في البرنامج.

في aarch64 ، تستخدم الأجهزة سجل x18 للإشارة إلى ShadowCallStack ، مما يعني أن الإشارات إلى ShadowCallStack لا يجب تخزينها في الذاكرة. هذا يجعل من الممكن تنفيذ وقت تشغيل يتجنب تعريض عنوان ShadowCallStack للمهاجمين الذين يمكنهم قراءة ذاكرة عشوائية.

التنفيذ

يدعم Android ShadowCallStack لكل من kernel ومساحة المستخدمين.

تمكين SCS للنواة

لتمكين ShadowCallStack للنواة ، أضف السطر التالي إلى ملف تهيئة kernel:

CONFIG_SHADOW_CALL_STACK=y

تمكين SCS في مساحة المستخدمين

لتمكين ShadowCallStack في مكونات مساحة المستخدمين ، أضف الأسطر التالية إلى ملف مخطط المكون:

sanitize: {
  scs: true
}

تفترض SCS أن سجل x18 محجوز لتخزين عنوان ShadowCallStack ، ولا يتم استخدامه لأي أغراض أخرى. بينما يتم تجميع جميع مكتبات النظام لحجز سجل x18 ، فمن المحتمل أن يكون هذا مشكلة إذا تم تمكين SCS لمكونات مساحة المستخدمين التي تتفاعل مع التعليمات البرمجية القديمة قيد التشغيل (على سبيل المثال ، المكتبات التي يمكن تحميلها بواسطة تطبيقات الجهات الخارجية) ، والتي قد تتداخل سجل x18 . على هذا النحو ، نوصي فقط بتمكين SCS في المكونات المستقلة التي لن يتم تحميلها في الثنائيات القديمة.

تصديق

لا يوجد اختبار CTS خصيصًا لـ SCS. بدلاً من ذلك ، تأكد من أن اختبارات CTS تمر مع وبدون تمكين SCS للتحقق من أن SCS لا يؤثر على الجهاز.