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