কার্নেল নিয়ন্ত্রণ প্রবাহ অখণ্ডতা

কন্ট্রোল ফ্লো ইন্টিগ্রিটি (CFI) হল একটি নিরাপত্তা ব্যবস্থা যা একটি সংকলিত বাইনারির মূল কন্ট্রোল ফ্লো গ্রাফে পরিবর্তনের অনুমতি দেয় না, যা এই ধরনের আক্রমণগুলি সম্পাদন করাকে উল্লেখযোগ্যভাবে কঠিন করে তোলে।

অ্যান্ড্রয়েড 9-এ, আমরা LLVM-এর সিএফআই-এর বাস্তবায়ন আরও উপাদানে এবং কার্নেলে সক্ষম করেছি। সিস্টেম CFI ডিফল্টরূপে চালু আছে, কিন্তু আপনাকে কার্নেল CFI সক্রিয় করতে হবে।

LLVM-এর CFI-এর জন্য Link-Time Optimization (LTO) দিয়ে কম্পাইল করা প্রয়োজন। LTO লিঙ্ক-টাইম পর্যন্ত অবজেক্ট ফাইলগুলির LLVM বিটকোড উপস্থাপনা সংরক্ষণ করে, যা কম্পাইলারকে কী অপ্টিমাইজেশানগুলি সঞ্চালিত করা যেতে পারে সে সম্পর্কে আরও ভাল কারণ জানাতে দেয়। LTO সক্রিয় করা চূড়ান্ত বাইনারি আকার হ্রাস করে এবং কর্মক্ষমতা উন্নত করে, কিন্তু কম্পাইলের সময় বাড়ায়। অ্যান্ড্রয়েডে পরীক্ষায়, এলটিও এবং সিএফআই-এর সংমিশ্রণের ফলে কোডের আকার এবং কার্যকারিতা নগণ্য ওভারহেড হয়; কিছু ক্ষেত্রে উভয়ের উন্নতি হয়েছে।

CFI সম্পর্কে আরও প্রযুক্তিগত বিশদ এবং কীভাবে অন্যান্য ফরোয়ার্ড-কন্ট্রোল চেকগুলি পরিচালনা করা হয়, LLVM ডিজাইন ডকুমেন্টেশন দেখুন।

বাস্তবায়ন

kCFI প্যাচগুলি সমস্ত সমর্থিত অ্যান্ড্রয়েড কার্নেল সংস্করণে রয়েছে৷ CONFIG_CFI_CLANG বিকল্পটি kCFI সক্ষম করে এবং ডিফল্টরূপে GKI তে সেট করা থাকে।

সমস্যা সমাধান

সক্ষম করার পরে, তাদের ড্রাইভারের সাথে বিদ্যমান যেকোন ধরনের অমিল ত্রুটির মাধ্যমে কাজ করুন। একটি বেমানান ফাংশন পয়েন্টার ট্রিপ CFI এর মাধ্যমে একটি পরোক্ষ ফাংশন কল। যখন একটি CFI ব্যর্থতা সনাক্ত করা হয়, কার্নেল একটি সতর্কতা প্রিন্ট করে যাতে কল করা ফাংশন এবং স্ট্যাকট্রেস যা ব্যর্থতার দিকে পরিচালিত করে উভয়ই অন্তর্ভুক্ত করে। ফাংশন পয়েন্টার সবসময় যে ফাংশন বলা হয় একই ধরনের আছে নিশ্চিত করে এটি সংশোধন করুন।

CFI ব্যর্থতা ডিবাগ করতে সহায়তা করার জন্য, CONFIG_CFI_PERMISSIVE সক্রিয় করুন, যা কার্নেল প্যানিকের পরিবর্তে একটি সতর্কতা প্রিন্ট করে। অনুমতিমূলক মোড উত্পাদন ব্যবহার করা উচিত নয়.

বৈধতা

বর্তমানে, CFI-এর জন্য বিশেষভাবে কোনো CTS পরীক্ষা নেই। পরিবর্তে, নিশ্চিত করুন যে সিএফআই ডিভাইসটিকে প্রভাবিত করছে না তা যাচাই করতে CTS পরীক্ষাগুলি CFI সহ বা ছাড়াই পাস করেছে।