কন্ট্রোল ফ্লো ইন্টিগ্রিটি (CFI) একটি নিরাপত্তা ব্যবস্থা যা একটি কম্পাইল করা বাইনারির মূল কন্ট্রোল ফ্লো গ্রাফে পরিবর্তন করতে বাধা দেয়, ফলে এই ধরনের আক্রমণ চালানো উল্লেখযোগ্যভাবে কঠিন হয়ে পড়ে।
অ্যান্ড্রয়েড ৯ থেকে শুরু করে, আপনি কার্নেলে CFI সক্রিয় করতে পারেন।
লিনাক্স কার্নেলে CFI-এর দুটি ভিন্ন বাস্তবায়ন রয়েছে:
- লিনাক্স ৬.০ এবং তার নিচের সংস্করণগুলোর জন্য, ক্ল্যাং সিএফআই, যা ক্ল্যাং এলটিও-এর উপর নির্ভর করে।
- লিনাক্স ৬.১ এবং উচ্চতর সংস্করণের জন্য, ক্ল্যাং কেসিএফআই
Clang CFI কম্পাইল করার জন্য Link Time Optimization (LTO) প্রয়োজন। LTO লিঙ্ক টাইম পর্যন্ত অবজেক্ট ফাইলের LLVM বিটকোড রিপ্রেজেন্টেশন সংরক্ষণ করে, যা কম্পাইলারকে কী কী অপটিমাইজেশন করা যেতে পারে সে সম্পর্কে আরও ভালোভাবে সিদ্ধান্ত নিতে সাহায্য করে। অ্যান্ড্রয়েডে পরীক্ষা করে দেখা গেছে যে, LTO এবং CFI-এর সংমিশ্রণের ফলে কোডের আকার এবং পারফরম্যান্সে নগণ্য ওভারহেড তৈরি হয়। তবে, LTO সক্রিয় করলে কার্নেল বিল্ড টাইম উল্লেখযোগ্যভাবে বেড়ে যায়।
Clang KCFI-এর জন্য LTO-এর প্রয়োজন হয় না, ফলে সাম্প্রতিক অ্যান্ড্রয়েড কার্নেলগুলো LTO-এর বিল্ড-টাইম ওভারহেড ছাড়াই CFI-এর সুবিধা পায়।
বাস্তবায়ন
CFI নিয়ন্ত্রিত হয় CONFIG_CFI_CLANG অপশন দ্বারা, যা Clang CFI অথবা Clang KCFI-কে সক্রিয় করে।
CFI এবং অন্যান্য ফরওয়ার্ড-কন্ট্রোল চেকগুলো কীভাবে পরিচালনা করা হয় সে সম্পর্কে আরও প্রযুক্তিগত বিবরণের জন্য, LLVM ডিজাইন ডকুমেন্টেশন দেখুন। সেখানে KCFI-কে -fsanitize=kcfi হিসাবে উল্লেখ করা হয়েছে।
সমস্যা সমাধান
সক্রিয় করার পরে, ড্রাইভারগুলিতে বিদ্যমান যেকোনো টাইপ মিসম্যাচ ত্রুটি সমাধান করুন। একটি বেমানান ফাংশন পয়েন্টারের মাধ্যমে পরোক্ষ ফাংশন কল CFI ট্রিগার করে। যখন একটি CFI ব্যর্থতা শনাক্ত করা হয়, তখন কার্নেল একটি সতর্কবার্তা প্রিন্ট করে, যাতে কল করা ফাংশন এবং ব্যর্থতার কারণ হওয়া স্ট্যাকট্রেস উভয়ই অন্তর্ভুক্ত থাকে। ফাংশন পয়েন্টারগুলো যেন সর্বদা কল করা ফাংশনের টাইপের মতোই হয়, তা নিশ্চিত করে এটি সংশোধন করুন।
CFI ব্যর্থতা ডিবাগ করতে সাহায্য করার জন্য, CONFIG_CFI_PERMISSIVE সক্রিয় করুন, যা কার্নেল প্যানিক ঘটানোর পরিবর্তে একটি সতর্কবার্তা প্রিন্ট করে। প্রোডাকশনে পারমিসিভ মোড ব্যবহার করা উচিত নয়।
বৈধতা
বর্তমানে, CFI-এর জন্য বিশেষভাবে কোনো CTS টেস্ট নেই। এর পরিবর্তে, CFI চালু থাকা এবং না থাকা উভয় অবস্থাতেই CTS টেস্টগুলো পাস করছে কিনা তা নিশ্চিত করুন, যাতে যাচাই করা যায় যে CFI ডিভাইসটিকে প্রভাবিত করছে না।