অ্যান্ড্রয়েড 4.4 এবং উচ্চতর ঐচ্ছিক ডিভাইস-ম্যাপার-ভেরিটি (dm-verity) কার্নেল বৈশিষ্ট্যের মাধ্যমে যাচাইকৃত বুট সমর্থন করে, যা ব্লক ডিভাইসগুলির স্বচ্ছ অখণ্ডতা পরীক্ষা প্রদান করে। dm-verity ক্রমাগত রুটকিট প্রতিরোধ করতে সাহায্য করে যা রুট সুবিধা এবং আপসকারী ডিভাইসগুলিকে ধরে রাখতে পারে। এই বৈশিষ্ট্যটি অ্যান্ড্রয়েড ব্যবহারকারীদের একটি ডিভাইস বুট করার সময় নিশ্চিত হতে সাহায্য করে যে এটি শেষবার ব্যবহার করার সময় একই অবস্থায় আছে।
রুট সুবিধা সহ সম্ভাব্য ক্ষতিকারক অ্যাপ্লিকেশন (PHAs) সনাক্তকরণ প্রোগ্রামগুলি থেকে লুকিয়ে রাখতে পারে এবং অন্যথায় নিজেকে মুখোশ করতে পারে। রুটিং সফ্টওয়্যার এটি করতে পারে কারণ এটি প্রায়শই ডিটেক্টরের চেয়ে বেশি সুবিধাপ্রাপ্ত হয়, সফ্টওয়্যারটিকে সনাক্তকরণ প্রোগ্রামগুলিতে "মিথ্যা" বলতে সক্ষম করে।
dm-verity বৈশিষ্ট্যটি আপনাকে একটি ব্লক ডিভাইস, ফাইল সিস্টেমের অন্তর্নিহিত স্টোরেজ স্তর দেখতে দেয় এবং এটি তার প্রত্যাশিত কনফিগারেশনের সাথে মেলে কিনা তা নির্ধারণ করতে দেয়। এটি একটি ক্রিপ্টোগ্রাফিক হ্যাশ ট্রি ব্যবহার করে এটি করে। প্রতিটি ব্লকের জন্য (সাধারণত 4k), একটি SHA256 হ্যাশ আছে।
যেহেতু হ্যাশ মানগুলি পৃষ্ঠাগুলির একটি ট্রিতে সংরক্ষণ করা হয়, শুধুমাত্র উপরের-স্তরের "রুট" হ্যাশকে অবশ্যই বাকি ট্রি যাচাই করার জন্য বিশ্বাস করতে হবে৷ যেকোনো ব্লক পরিবর্তন করার ক্ষমতা ক্রিপ্টোগ্রাফিক হ্যাশ ভাঙার সমতুল্য। এই কাঠামোর চিত্রের জন্য নিম্নলিখিত চিত্রটি দেখুন।
বুট পার্টিশনে একটি সর্বজনীন কী অন্তর্ভুক্ত করা হয়েছে, যা ডিভাইস প্রস্তুতকারকের দ্বারা বাহ্যিকভাবে যাচাই করা আবশ্যক। সেই কীটি হ্যাশের স্বাক্ষর যাচাই করতে এবং ডিভাইসের সিস্টেম পার্টিশন সুরক্ষিত এবং অপরিবর্তিত রয়েছে তা নিশ্চিত করতে ব্যবহৃত হয়।
অপারেশন
dm-verity সুরক্ষা কার্নেলে বাস করে। সুতরাং কার্নেল আসার আগে যদি রুটিং সফ্টওয়্যার সিস্টেমের সাথে আপস করে, তবে এটি সেই অ্যাক্সেস বজায় রাখে। এই ঝুঁকি কমানোর জন্য, বেশিরভাগ নির্মাতারা ডিভাইসে বার্ন করা একটি কী ব্যবহার করে কার্নেল যাচাই করে। একবার ডিভাইসটি কারখানা ছেড়ে চলে গেলে সেই কীটি পরিবর্তনযোগ্য নয়।
নির্মাতারা প্রথম-স্তরের বুটলোডারে স্বাক্ষর যাচাই করতে সেই কীটি ব্যবহার করে, যা পরবর্তী স্তরে, অ্যাপ বুটলোডার এবং অবশেষে কার্নেলে স্বাক্ষর যাচাই করে। যাচাইকৃত বুটের সুবিধা নিতে ইচ্ছুক প্রতিটি নির্মাতার কার্নেলের অখণ্ডতা যাচাই করার জন্য একটি পদ্ধতি থাকা উচিত। কার্নেলটি যাচাই করা হয়েছে বলে ধরে নিলে, কার্নেল একটি ব্লক ডিভাইস দেখতে পারে এবং এটি মাউন্ট করা অবস্থায় যাচাই করতে পারে।
একটি ব্লক ডিভাইস যাচাই করার একটি উপায় হল সরাসরি এর বিষয়বস্তু হ্যাশ করা এবং একটি সংরক্ষিত মানের সাথে তুলনা করা। যাইহোক, একটি সম্পূর্ণ ব্লক ডিভাইস যাচাই করার চেষ্টা করা একটি বর্ধিত সময় নিতে পারে এবং একটি ডিভাইসের অনেক শক্তি খরচ করতে পারে। ডিভাইসগুলি বুট হতে দীর্ঘ সময় লাগবে এবং তারপরে ব্যবহারের আগে উল্লেখযোগ্যভাবে নিষ্কাশন করা হবে।
পরিবর্তে, dm-verity পৃথকভাবে ব্লকগুলি যাচাই করে এবং শুধুমাত্র যখন প্রতিটি অ্যাক্সেস করা হয়। মেমরিতে পড়ার সময়, ব্লকটি সমান্তরালভাবে হ্যাশ করা হয়। হ্যাশ তারপর গাছ আপ যাচাই করা হয়. এবং যেহেতু ব্লক পড়া একটি ব্যয়বহুল অপারেশন, তাই এই ব্লক-স্তরের যাচাইকরণের দ্বারা প্রবর্তিত বিলম্ব তুলনামূলকভাবে নামমাত্র।
যাচাইকরণ ব্যর্থ হলে, ডিভাইসটি একটি I/O ত্রুটি তৈরি করে যা নির্দেশ করে যে ব্লকটি পড়া যাবে না। এটি মনে হচ্ছে যেন ফাইল সিস্টেমটি দূষিত হয়েছে, যেমনটি প্রত্যাশিত।
অ্যাপ্লিকেশানগুলি ফলাফলপ্রাপ্ত ডেটা ছাড়াই এগিয়ে যেতে বেছে নিতে পারে, যেমন যখন সেই ফলাফলগুলি অ্যাপের প্রাথমিক ফাংশনের জন্য প্রয়োজন হয় না৷ যাইহোক, যদি অ্যাপটি ডেটা ছাড়া চালিয়ে যেতে না পারে তবে এটি ব্যর্থ হয়।
ফরোয়ার্ড ত্রুটি সংশোধন
Android 7.0 এবং উচ্চতর ফরওয়ার্ড ত্রুটি সংশোধন (FEC) সহ dm-verity দৃঢ়তা উন্নত করে। AOSP বাস্তবায়ন সাধারণ রিড-সলোমন ত্রুটি-সংশোধন কোড দিয়ে শুরু হয় এবং স্থানের ওভারহেড কমাতে এবং পুনরুদ্ধার করা যেতে পারে এমন দূষিত ব্লকের সংখ্যা বাড়াতে ইন্টারলিভিং নামে একটি কৌশল প্রয়োগ করে। FEC সম্পর্কে আরও বিশদ বিবরণের জন্য, ত্রুটি সংশোধন সহ কঠোরভাবে প্রয়োগকৃত যাচাইকৃত বুট দেখুন।বাস্তবায়ন
সারাংশ
- একটি ext4 সিস্টেম ইমেজ তৈরি করুন।
- সেই চিত্রের জন্য একটি হ্যাশ ট্রি তৈরি করুন ।
- সেই হ্যাশ গাছের জন্য একটি dm-verity টেবিল তৈরি করুন ।
- একটি টেবিল স্বাক্ষর তৈরি করতে dm-verity টেবিলে স্বাক্ষর করুন ।
- টেবিলের স্বাক্ষর এবং dm-verity টেবিলটিকে সত্য মেটাডেটাতে বান্ডেল করুন ।
- সিস্টেম ইমেজ, ভেরিটি মেটাডেটা এবং হ্যাশ ট্রি সংযুক্ত করুন।
হ্যাশ ট্রি এবং dm-verity টেবিলের বিশদ বিবরণের জন্য Chromium Projects - Verified Boot দেখুন।
হ্যাশ ট্রি তৈরি করুন
ভূমিকায় বর্ণিত হিসাবে, হ্যাশ গাছটি dm-verity-এর অবিচ্ছেদ্য অঙ্গ। ক্রিপ্টসেটআপ টুল আপনার জন্য একটি হ্যাশ ট্রি তৈরি করে। বিকল্পভাবে, একটি সামঞ্জস্যপূর্ণ এখানে সংজ্ঞায়িত করা হয়েছে:
<your block device name> <your block device name> <block size> <block size> <image size in blocks> <image size in blocks + 8> <root hash> <salt>
হ্যাশ গঠনের জন্য, সিস্টেম ইমেজটি 0 লেয়ারে 4k ব্লকে বিভক্ত করা হয়েছে, প্রতিটিকে একটি SHA256 হ্যাশ বরাদ্দ করা হয়েছে। লেয়ার 1 গঠিত হয় শুধুমাত্র সেই SHA256 হ্যাশগুলিকে 4k ব্লকে যুক্ত করে, যার ফলে অনেক ছোট ইমেজ হয়। লেয়ার 1 এর SHA256 হ্যাশ সহ লেয়ার 2 অভিন্নভাবে গঠিত হয়েছে।
পূর্ববর্তী স্তরের SHA256 হ্যাশগুলি একটি একক ব্লকে ফিট না হওয়া পর্যন্ত এটি করা হয়। যখন সেই ব্লকের SHA256 পাবেন, আপনার কাছে গাছের রুট হ্যাশ থাকবে।
হ্যাশ ট্রির আকার (এবং সংশ্লিষ্ট ডিস্ক স্পেস ব্যবহার) যাচাইকৃত পার্টিশনের আকারের সাথে পরিবর্তিত হয়। বাস্তবে, হ্যাশ গাছের আকার ছোট হতে থাকে, প্রায়ই 30 এমবি-এর কম।
আপনার যদি একটি স্তরে একটি ব্লক থাকে যা পূর্ববর্তী স্তরের হ্যাশ দ্বারা সম্পূর্ণরূপে পূর্ণ না হয়, তাহলে প্রত্যাশিত 4k অর্জন করতে আপনার এটিকে শূন্য দিয়ে প্যাড করা উচিত। এটি আপনাকে জানতে দেয় যে হ্যাশ ট্রি সরানো হয়নি এবং পরিবর্তে ফাঁকা ডেটা দিয়ে সম্পূর্ণ করা হয়েছে।
হ্যাশ ট্রি তৈরি করতে, লেয়ার 1 এর সাথে লেয়ার 2 হ্যাশ, লেয়ার 3 হ্যাশ লেয়ার 2 এর সাথে সংযুক্ত করুন এবং আরও অনেক কিছু। এই সব আউট ডিস্ক লিখুন. মনে রাখবেন যে এটি রুট হ্যাশের স্তর 0 উল্লেখ করে না।
রিক্যাপ করার জন্য, হ্যাশ ট্রি নির্মাণের সাধারণ অ্যালগরিদম নিম্নরূপ:
- একটি এলোমেলো লবণ চয়ন করুন (হেক্সাডেসিমেল এনকোডিং)।
- আপনার সিস্টেমের ছবিকে 4k ব্লকে আনস্পার্স করুন।
- প্রতিটি ব্লকের জন্য, এর (লবণযুক্ত) SHA256 হ্যাশ পান।
- একটি স্তর গঠন করতে এই হ্যাশগুলিকে সংযুক্ত করুন
- 0s থেকে 4k ব্লক বাউন্ডারি দিয়ে লেভেল প্যাড করুন।
- আপনার হ্যাশ গাছের স্তরকে সংযুক্ত করুন।
- আপনার কাছে শুধুমাত্র একটি হ্যাশ না হওয়া পর্যন্ত পরের জন্য উত্স হিসাবে পূর্ববর্তী স্তরটি ব্যবহার করে 2-6 ধাপগুলি পুনরাবৃত্তি করুন৷
এর ফলাফল হল একটি একক হ্যাশ, যা আপনার রুট হ্যাশ। এটি এবং আপনার লবণ আপনার dm-verity ম্যাপিং টেবিল নির্মাণের সময় ব্যবহার করা হয়।
dm-verity ম্যাপিং টেবিল তৈরি করুন
dm-verity ম্যাপিং টেবিল তৈরি করুন, যা কার্নেলের জন্য ব্লক ডিভাইস (বা লক্ষ্য) এবং হ্যাশ ট্রির অবস্থান (যা একই মান।) সনাক্ত করে এই ম্যাপিংটি fstab
জেনারেশন এবং বুট করার জন্য ব্যবহৃত হয়। টেবিলটি ব্লকের আকার এবং হ্যাশ_স্টার্ট, হ্যাশ ট্রির শুরুর অবস্থান (বিশেষত, চিত্রের শুরু থেকে এর ব্লক নম্বর) সনাক্ত করে।
সত্য লক্ষ্য ম্যাপিং টেবিল ক্ষেত্রগুলির একটি বিশদ বিবরণের জন্য ক্রিপ্টসেটআপ দেখুন।
dm-verity টেবিলে স্বাক্ষর করুন
একটি টেবিল স্বাক্ষর তৈরি করতে dm-verity টেবিলে স্বাক্ষর করুন। একটি পার্টিশন যাচাই করার সময়, টেবিল স্বাক্ষরটি প্রথমে যাচাই করা হয়। এটি একটি নির্দিষ্ট স্থানে আপনার বুট ইমেজের একটি কী এর বিপরীতে করা হয়। কীগুলি সাধারণত একটি নির্দিষ্ট স্থানে ডিভাইসগুলিতে স্বয়ংক্রিয় অন্তর্ভুক্তির জন্য নির্মাতাদের বিল্ড সিস্টেমে অন্তর্ভুক্ত করা হয়।
এই স্বাক্ষর এবং কী সমন্বয় দিয়ে পার্টিশন যাচাই করতে:
-
/verity_key
এ/boot
পার্টিশনে libmincrypt-সামঞ্জস্যপূর্ণ বিন্যাসে একটি RSA-2048 কী যোগ করুন। হ্যাশ ট্রি যাচাই করতে ব্যবহৃত কীটির অবস্থান চিহ্নিত করুন। - প্রাসঙ্গিক এন্ট্রির জন্য fstab-এ
fs_mgr
পতাকাগুলিতেverify
যোগ করুন।
মেটাডেটা মধ্যে টেবিল স্বাক্ষর বান্ডিল
টেবিলের স্বাক্ষর এবং dm-verity টেবিলটিকে সত্য মেটাডেটাতে বান্ডেল করুন। মেটাডেটার সম্পূর্ণ ব্লকটি সংস্করণ করা হয়েছে তাই এটি প্রসারিত হতে পারে, যেমন একটি দ্বিতীয় ধরনের স্বাক্ষর যোগ করা বা কিছু ক্রম পরিবর্তন করা।
একটি স্যানিটি চেক হিসাবে, একটি ম্যাজিক নম্বর টেবিলের মেটাডেটার প্রতিটি সেটের সাথে যুক্ত থাকে যা টেবিলটিকে সনাক্ত করতে সাহায্য করে। যেহেতু দৈর্ঘ্যটি ext4 সিস্টেম ইমেজ হেডারে অন্তর্ভুক্ত করা হয়েছে, এটি ডেটার বিষয়বস্তু না জেনেই মেটাডেটা অনুসন্ধান করার একটি উপায় প্রদান করে।
এটি নিশ্চিত করে যে আপনি একটি অযাচাই করা পার্টিশন যাচাই করার জন্য নির্বাচন করেননি। যদি তাই হয়, এই ম্যাজিক নম্বরের অনুপস্থিতি যাচাইকরণ প্রক্রিয়াকে থামিয়ে দেয়। এই সংখ্যাটি 0xb001b001
অনুরূপ।
হেক্সে বাইট মান হল:
- প্রথম বাইট = b0
- দ্বিতীয় বাইট = 01
- তৃতীয় বাইট = b0
- চতুর্থ বাইট = 01
নিম্নলিখিত চিত্রটি সত্য মেটাডেটার ভাঙ্গন চিত্রিত করে:
<magic number>|<version>|<signature>|<table length>|<table>|<padding> \-------------------------------------------------------------------/ \----------------------------------------------------------/ | | | | 32K block content
এবং এই টেবিলটি সেই মেটাডেটা ক্ষেত্রগুলিকে বর্ণনা করে।
মাঠ | উদ্দেশ্য | আকার | মান |
---|---|---|---|
জাদু সংখ্যা | একটি স্যানিটি চেক হিসাবে fs_mgr দ্বারা ব্যবহৃত | 4 বাইট | 0xb001b001 |
সংস্করণ | মেটাডেটা ব্লক সংস্করণ করতে ব্যবহৃত | 4 বাইট | বর্তমানে 0 |
স্বাক্ষর | PKCS1.5 প্যাডেড আকারে টেবিলের স্বাক্ষর | 256 বাইট | |
টেবিলের দৈর্ঘ্য | বাইটে dm-verity টেবিলের দৈর্ঘ্য | 4 বাইট | |
টেবিল | পূর্বে বর্ণিত dm-verity টেবিল | টেবিল দৈর্ঘ্য বাইট | |
প্যাডিং | এই কাঠামোটি 0-প্যাডেড থেকে 32k দৈর্ঘ্যের | 0 |
dm-verity অপ্টিমাইজ করুন
dm-verity থেকে সেরা পারফরম্যান্স পেতে, আপনার উচিত:
- কার্নেলে, ARMv7 এর জন্য NEON SHA-2 এবং ARMv8 এর জন্য SHA-2 এক্সটেনশন চালু করুন।
- আপনার ডিভাইসের জন্য সর্বোত্তম কনফিগারেশন খুঁজে পেতে বিভিন্ন রিড-এড এবং prefetch_cluster সেটিংস নিয়ে পরীক্ষা করুন।