অ্যান্ড্রয়েড 11 থেকে শুরু করে, 64-বিট প্রক্রিয়াগুলির জন্য, সমস্ত হিপ অ্যালোকেশনে এআরএম টপ-বাইট উপেক্ষা (টিবিআই) এর জন্য কার্নেল সমর্থন সহ ডিভাইসগুলিতে পয়েন্টারের শীর্ষ বাইটে একটি বাস্তবায়ন সংজ্ঞায়িত ট্যাগ সেট করা আছে। এই ট্যাগটি পরিবর্তন করে এমন যেকোনো অ্যাপ্লিকেশন বন্ধ হয়ে যায় যখন ট্যাগটি ডিলোকেশনের সময় চেক করা হয়। ARM মেমরি ট্যাগিং এক্সটেনশন (MTE) সমর্থন সহ ভবিষ্যতের হার্ডওয়্যারের জন্য এটি প্রয়োজনীয়।
টপ-বাইট উপেক্ষা করুন
ARM-এর টপ-বাইট উপেক্ষা বৈশিষ্ট্যটি সমস্ত Armv8 AArch64 হার্ডওয়্যারে 64-বিট কোডের জন্য উপলব্ধ। এই বৈশিষ্ট্যটির মানে হল যে হার্ডওয়্যার মেমরি অ্যাক্সেস করার সময় একটি পয়েন্টারের শীর্ষ বাইট উপেক্ষা করে।
TBI-এর জন্য একটিসামঞ্জস্যপূর্ণ কার্নেল প্রয়োজন যা ব্যবহারকারীর স্থান থেকে পাস করা ট্যাগ করা পয়েন্টার সঠিকভাবে পরিচালনা করে। 4.14 (Pixel 4) থেকে অ্যান্ড্রয়েড কমন কার্নেল এবং উচ্চতর বৈশিষ্ট্যের প্রয়োজনীয় TBI প্যাচ ।
কার্নেলে টিবিআই সমর্থন সহ ডিভাইসগুলি প্রক্রিয়া শুরুর সময় গতিশীলভাবে সনাক্ত করা হয় এবং সমস্ত হিপ বরাদ্দের জন্য পয়েন্টারের শীর্ষ বাইটে একটি বাস্তবায়ন-নির্ভর ট্যাগ ঢোকানো হয়। এর পরে, মেমরি ডিলকেটিং করার সময় ট্যাগটি কাটা হয়নি তা নিশ্চিত করার জন্য একটি চেক চালানো হয়।
মেমরি ট্যাগিং এক্সটেনশন প্রস্তুতি
ARM-এর মেমরি ট্যাগিং এক্সটেনশন (MTE) মেমরি নিরাপত্তা সমস্যা সমাধানে সাহায্য করে। MTE স্ট্যাক, হিপ এবং গ্লোবালগুলিতে প্রতিটি মেমরি বরাদ্দের 56-59 তম ঠিকানা বিট ট্যাগ করে কাজ করে। হার্ডওয়্যার এবং নির্দেশ সেট স্বয়ংক্রিয়ভাবে পরীক্ষা করে যে সঠিক ট্যাগটি প্রতিটি মেমরি অ্যাক্সেসে ব্যবহার করা হয়েছে।
যে অ্যান্ড্রয়েড অ্যাপগুলি ভুলভাবে পয়েন্টারের উপরের বাইটে তথ্য সঞ্চয় করে সেগুলি MTE-সক্ষম ডিভাইসে ব্রেক করার গ্যারান্টি দেওয়া হয় । ট্যাগ করা পয়েন্টারগুলি MTE ডিভাইসগুলি উপলব্ধ হওয়ার আগে পয়েন্টারের উপরের বাইটের ভুল ব্যবহার সনাক্ত করা এবং প্রত্যাখ্যান করা সহজ করে তোলে।
বিকাশকারী সমর্থন
যদি আপনার অ্যাপ ক্র্যাশ হয়ে যায় এবং আপনাকে এই লিঙ্কটি দিয়ে অনুরোধ করা হয়, তাহলে এর অর্থ নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:
- অ্যাপ্লিকেশনটি একটি পয়েন্টার মুক্ত করার চেষ্টা করেছে যা সিস্টেমের হিপ অ্যালোকেটর দ্বারা বরাদ্দ করা হয়নি।
- আপনার অ্যাপে কিছু একটি পয়েন্টারের শীর্ষ বাইট পরিবর্তন করেছে। পয়েন্টারের উপরের বাইট পরিবর্তন করা যাবে না এবং এই সমস্যাটি সমাধান করতে আপনার কোড পরিবর্তন করতে হবে।
টপ বাইট পয়েন্টার ভুলভাবে ব্যবহার বা পরিবর্তিত হওয়ার উদাহরণ।
- একটি নির্দিষ্ট ধরণের নির্দেশকগুলির শীর্ষ 16টি ঠিকানা বিটে অ্যাপ্লিকেশন নির্দিষ্ট মেটাডেটা সংরক্ষিত থাকে।
- একটি পয়েন্টার ঢালাই দ্বিগুণ এবং তারপর ফিরে, নিম্ন ঠিকানা বিট হারান.
- পুনরাবৃত্ত গভীরতা পরিমাপ করার উপায় হিসাবে বিভিন্ন স্ট্যাক ফ্রেম থেকে স্থানীয় ভেরিয়েবলের ঠিকানাগুলির মধ্যে পার্থক্য কম্পিউট করা কোড।
কিছু অ্যাপ্লিকেশন লাইব্রেরির উপর নির্ভর করতে পারে যা পয়েন্টারের শীর্ষ বাইট সেট করার সময় ভুলভাবে আচরণ করে। আমরা স্বীকার করি যে লাইব্রেরিতে এই অন্তর্নিহিত সমস্যাগুলি দ্রুত সমাধান করা অতুচ্ছ হতে পারে। যেমন, targetSdkLevel < 30
ব্যবহার করে এমন অ্যাপ্লিকেশনগুলিতে ডিফল্টরূপে পয়েন্টার ট্যাগিং সক্রিয় থাকবে না। আমরা ট্রানজিশনাল পিরিয়ড সহজ করতে targetSdkLevel >= 30
দিয়ে নির্মিত অ্যাপ্লিকেশনগুলির জন্য একটি এস্কেপ হ্যাচও প্রদান করি।
আপনার AndroidManifest.xml
ফাইলে নিম্নলিখিত যোগ করে এস্কেপ হ্যাচ ব্যবহার করা হয়:
<application android:allowNativeHeapPointerTagging="false"> ... </application>
এটি আপনার অ্যাপ্লিকেশনের জন্য পয়েন্টার ট্যাগিং বৈশিষ্ট্য নিষ্ক্রিয় করবে। দয়া করে মনে রাখবেন যে এটি অন্তর্নিহিত কোড স্বাস্থ্য সমস্যার সমাধান করে না । এই এস্কেপ হ্যাচ অ্যান্ড্রয়েডের ভবিষ্যত সংস্করণে অদৃশ্য হয়ে যাবে, কারণ এই প্রকৃতির সমস্যাগুলি MTE- এর সাথে বেমানান হবে৷