ShadowCallStack

ShadowCallStack (SCS) هو LLVM الأجهزة الوضع الذي يحمي ضد بالكتابة فوق عنوان عودتنا (مثل كومة عازلة الفيضانات) من خلال توفير عنوان المرسل وظيفة في لShadowCallStack المخصصة بشكل منفصل في حاسوب وظيفة من وظائف nonleaf وتحميل عنوان المرسل من 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 لا يؤثر على الجهاز.