যাচাইকৃত বুট ব্যবহার করুন

ভেরিফাইড বুট ব্যবহারের আগে, যে অ্যান্ড্রয়েড সংস্করণটি বুট করা হচ্ছে তার অন্তর্ভুক্ত সমস্ত এক্সিকিউটেবল কোড এবং ডেটা ক্রিপ্টোগ্রাফিকভাবে যাচাই করে। এর মধ্যে রয়েছে কার্নেল (যা boot পার্টিশন থেকে লোড করা হয়), ডিভাইস ট্রি (যা dtbo পার্টিশন থেকে লোড করা হয়), system পার্টিশন, vendor পার্টিশন, ইত্যাদি।

boot এবং dtbo মতো ছোট পার্টিশন, যেগুলো শুধুমাত্র একবারই পড়া যায়, সেগুলোকে সাধারণত সম্পূর্ণ কন্টেন্ট মেমরিতে লোড করে এবং তারপর এর হ্যাশ গণনা করে যাচাই করা হয়। এই গণনা করা হ্যাশ মানটিকে এরপর প্রত্যাশিত হ্যাশ মানের সাথে তুলনা করা হয়। যদি মানটি না মেলে, তাহলে অ্যান্ড্রয়েড লোড হবে না। আরও বিস্তারিত জানতে, বুট ফ্লো (Boot Flow) দেখুন।

বড় পার্টিশন, যা মেমরিতে জায়গা হয় না (যেমন, ফাইল সিস্টেম), একটি হ্যাশ ট্রি ব্যবহার করতে পারে যেখানে ডেটা মেমরিতে লোড হওয়ার সাথে সাথে যাচাইকরণ একটি চলমান প্রক্রিয়া হিসেবে চলতে থাকে। এক্ষেত্রে, রান টাইমে হ্যাশ ট্রির রুট হ্যাশ গণনা করা হয় এবং প্রত্যাশিত রুট হ্যাশ মানের সাথে মিলিয়ে দেখা হয়। অ্যান্ড্রয়েডে বড় পার্টিশন যাচাই করার জন্য dm-verity ড্রাইভার অন্তর্ভুক্ত রয়েছে। যদি কোনো এক পর্যায়ে গণনা করা রুট হ্যাশ প্রত্যাশিত রুট হ্যাশ মানের সাথে না মেলে, তবে ডেটা ব্যবহার করা হয় না এবং অ্যান্ড্রয়েড একটি ত্রুটিপূর্ণ অবস্থায় চলে যায়। আরও বিস্তারিত জানতে, dm-verity করাপশন দেখুন।

প্রত্যাশিত হ্যাশগুলি সাধারণত প্রতিটি যাচাইকৃত পার্টিশনের শেষে বা শুরুতে, একটি নির্দিষ্ট পার্টিশনে, অথবা উভয় স্থানেই সংরক্ষিত থাকে। গুরুত্বপূর্ণ বিষয় হলো, এই হ্যাশগুলি ট্রাস্ট রুট দ্বারা (সরাসরি বা পরোক্ষভাবে) স্বাক্ষরিত হয়। উদাহরণস্বরূপ, AVB ইমপ্লিমেন্টেশন উভয় পদ্ধতিই সমর্থন করে, বিস্তারিত জানতে Android Verified Boot দেখুন।

রোলব্যাক সুরক্ষা

সম্পূর্ণ সুরক্ষিত আপডেট প্রক্রিয়া থাকা সত্ত্বেও, একটি নন-পার্সিস্টেন্ট অ্যান্ড্রয়েড কার্নেল এক্সপ্লয়েটের মাধ্যমে ম্যানুয়ালি অ্যান্ড্রয়েডের একটি পুরোনো ও অধিক ঝুঁকিপূর্ণ সংস্করণ ইনস্টল করা, সেই ঝুঁকিপূর্ণ সংস্করণে রিবুট করা এবং তারপর সেই অ্যান্ড্রয়েড সংস্করণটি ব্যবহার করে একটি পার্সিস্টেন্ট এক্সপ্লয়েট ইনস্টল করা সম্ভব। এরপর আক্রমণকারী ডিভাইসটির স্থায়ী মালিকানা লাভ করে এবং আপডেট নিষ্ক্রিয় করাসহ যেকোনো কিছু করতে পারে।

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

AVB কীভাবে রোলব্যাক সুরক্ষা পরিচালনা করে সে সম্পর্কে আরও বিস্তারিত জানতে, AVB README দেখুন।

যাচাইকরণ ত্রুটিগুলি পরিচালনা করুন

যাচাইকরণ বুট করার সময় (যেমন, যদি boot পার্টিশনে গণনা করা হ্যাশ প্রত্যাশিত হ্যাশের সাথে না মেলে) অথবা রান করার সময় (যেমন, যদি dm-verity system পার্টিশনে কোনো যাচাইকরণ ত্রুটির সম্মুখীন হয়) ব্যর্থ হতে পারে। যদি বুট করার সময় যাচাইকরণ ব্যর্থ হয়, তাহলে ডিভাইসটি বুট হতে পারে না এবং ব্যবহারকারীকে ডিভাইসটি পুনরুদ্ধার করার জন্য কিছু পদক্ষেপ অনুসরণ করতে হয়।

রান-টাইমে ভেরিফিকেশন ব্যর্থ হলে প্রক্রিয়াটি কিছুটা জটিল হয়ে যায়। ডিভাইসটি যদি dm-verity ব্যবহার করে, তবে এটিকে restart মোডে কনফিগার করা উচিত। restart মোডে, কোনো ভেরিফিকেশন ত্রুটি দেখা দিলে, কারণটি নির্দেশ করার জন্য একটি নির্দিষ্ট ফ্ল্যাগ সেট করে ডিভাইসটি অবিলম্বে রিস্টার্ট করা হয়। বুট লোডার এই ফ্ল্যাগটি লক্ষ্য করে dm-verity-কে I/O Error ( eio ) মোডে পরিবর্তন করে দেবে এবং নতুন কোনো আপডেট ইনস্টল না হওয়া পর্যন্ত এই মোডেই থাকবে।

eio মোডে বুট করার সময়, ডিভাইসটি একটি ত্রুটির স্ক্রিন দেখায়, যা ব্যবহারকারীকে জানায় যে সিস্টেমে ত্রুটি (corruption) ধরা পড়েছে এবং ডিভাইসটি সঠিকভাবে কাজ নাও করতে পারে। ব্যবহারকারী স্ক্রিনটি বন্ধ না করা পর্যন্ত এটি প্রদর্শিত থাকে। eio মোডে, কোনো ভেরিফিকেশন ত্রুটি দেখা দিলে dm-verity ড্রাইভার ডিভাইসটি রিস্টার্ট করে না; এর পরিবর্তে একটি EIO ত্রুটি ফেরত পাঠানো হয় এবং অ্যাপটিকে সেই ত্রুটিটি সমাধান করতে হয়।

এর উদ্দেশ্য হলো, হয় সিস্টেম আপডেটারটি চলবে (যাতে কোনো ত্রুটি ছাড়াই একটি নতুন ওএস ইনস্টল করা যায়) অথবা ব্যবহারকারী ডিভাইস থেকে তার যতটা সম্ভব ডেটা সরিয়ে নিতে পারবেন। নতুন ওএস ইনস্টল হয়ে গেলে, বুট লোডার নতুন ইনস্টল হওয়া ওএস-টি শনাক্ত করে restart মোডে ফিরে যায়।