ShadowCallStack (SCS) হল একটি LLVM ইন্সট্রুমেন্টেশন মোড যা ননলিফ ফাংশনের ফাংশন প্রোলগে একটি ফাংশনের রিটার্ন অ্যাড্রেস সংরক্ষণ করে এবং শ্যাডোকলস্ট্যাক থেকে ফাংশনে রিটার্ন অ্যাড্রেস লোড করার মাধ্যমে রিটার্ন অ্যাড্রেস ওভাররাইট (যেমন স্ট্যাক বাফার ওভারফ্লো) থেকে রক্ষা করে। epilog আনওয়াইন্ডারের সাথে সামঞ্জস্যের জন্য ফেরত ঠিকানাটি নিয়মিত স্ট্যাকেও সংরক্ষণ করা হয়, তবে অন্যথায় অব্যবহৃত হয়। এটি নিশ্চিত করে যে নিয়মিত স্ট্যাকের রিটার্ন ঠিকানা পরিবর্তন করে এমন আক্রমণগুলি প্রোগ্রাম নিয়ন্ত্রণ প্রবাহের উপর কোন প্রভাব ফেলবে না।
aarch64-এ, ShadowCallStack রেফারেন্স করতে ইন্সট্রুমেন্টেশন x18
রেজিস্টার ব্যবহার করে, যার মানে ShadowCallStack-এর রেফারেন্স মেমরিতে সংরক্ষণ করতে হবে না। এটি এমন একটি রানটাইম বাস্তবায়ন করা সম্ভব করে যা শ্যাডোকলস্ট্যাকের ঠিকানাকে আক্রমণকারীদের কাছে প্রকাশ করা এড়ায় যা নির্বিচারে মেমরি পড়তে পারে।
বাস্তবায়ন
অ্যান্ড্রয়েড কার্নেল এবং ইউজারস্পেস উভয়ের জন্য ShadowCallStack সমর্থন করে।
কার্নেলের জন্য SCS সক্রিয় করুন
কার্নেলের জন্য ShadowCallStack সক্রিয় করতে, কার্নেল কনফিগারেশন ফাইলে নিম্নলিখিত লাইন যোগ করুন:
CONFIG_SHADOW_CALL_STACK=y
ইউজারস্পেসে SCS সক্ষম করুন
ইউজারস্পেস উপাদানগুলিতে ShadowCallStack সক্ষম করতে, একটি উপাদানের ব্লুপ্রিন্ট ফাইলে নিম্নলিখিত লাইনগুলি যুক্ত করুন:
sanitize: { scs: true }
SCS অনুমান করে যে x18
রেজিস্টার ShadowCallStack এর ঠিকানা সংরক্ষণ করার জন্য সংরক্ষিত, এবং অন্য কোন উদ্দেশ্যে ব্যবহার করা হয় না। যদিও সমস্ত সিস্টেম লাইব্রেরিগুলি x18
রেজিস্টার সংরক্ষণ করার জন্য সংকলন করা হয়, এটি সম্ভাব্য সমস্যাযুক্ত যদি ব্যবহারকারীর স্থানের উপাদানগুলির জন্য SCS সক্ষম করা হয় যা ইন-প্রসেস লিগ্যাসি কোডের সাথে ইন্টারঅপারেটিং করে (উদাহরণস্বরূপ, লাইব্রেরি যা তৃতীয় পক্ষের অ্যাপ দ্বারা লোড করা যেতে পারে), যা ক্লোবার হতে পারে x18
রেজিস্টার। যেমন, আমরা শুধুমাত্র স্বয়ংসম্পূর্ণ উপাদানগুলিতে SCS সক্রিয় করার সুপারিশ করি যেগুলি উত্তরাধিকার বাইনারিগুলিতে লোড করা হবে না৷
বৈধতা
SCS-এর জন্য বিশেষভাবে কোনো CTS পরীক্ষা নেই। পরিবর্তে, নিশ্চিত করুন যে CTS পরীক্ষাগুলি SCS-এর সাথে এবং ছাড়াই পাস করেছে তা যাচাই করতে SCS ডিভাইসটিকে প্রভাবিত করছে না।