শ্যাডোকলস্ট্যাক

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 ডিভাইসটিকে প্রভাবিত করছে না।