بدءًا من Android 11، بالنسبة إلى العمليات التي تعمل بنظام 64 بت، تم تحديد علامة محدّدة التنفيذ في أعلى البايت من المؤشر في جميع عمليات تخصيص الذاكرة في الشريحة على الأجهزة التي تتضمّن ميزة "تجاهل البايت العلوي" (TBI) لمعالجات ARM على مستوى النواة. ويتم إنهاء أي تطبيق يعدّل هذه العلامة عند التحقّق منها أثناء إلغاء التخصيص. هذا الإجراء ضروري للأجهزة المستقبلية المتوافقة مع إضافة وضع علامات الذاكرة (MTE) من ARM.
تجاهل البايت العلوي
تتوفّر ميزة "تجاهل أول بايت" في ARM للرمز البرمجي بسعة 64 بت في جميع الأجهزة التي تعمل بنظام التشغيل Armv8 AArch64. تعني هذه الميزة أنّ الجهاز يتجاهل البايت العلوي من المؤشر عند الوصول إلى الذاكرة.
تتطلّب تقنية TBI قشرة متوافقة تعالج بشكل صحيح المؤشرات المُشار إليها التي يتم تمريرها من مساحة المستخدم. تتضمّن نواة Android Common Kernels من الإصدار 4.14 (هاتف Pixel 4) والإصدارات الأحدث تصحيحات TBI المطلوبة.
يتم رصد الأجهزة المزوّدة بميزة TBI في kernel بشكل ديناميكي في وقت بدء العملية، ويتم إدراج علامة تعتمد على التنفيذ في أعلى باييت المؤشر لجميع عمليات تخصيص الذاكرة. بعد ذلك، يتم إجراء عملية تحقّق لتأكيد عدم اقتطاع العلامة عند إلغاء تخصيص الذاكرة.
مدى جاهزية إضافة وضع علامات الذاكرة
تساعد إضافة وضع علامات الذاكرة (MTE) من ARM في معالجة مشاكل أمان الذاكرة. تعمل تقنية MTE من خلال وضع علامة على الأرقام الثنائيّة للعنوان من 56 إلى 59 لكل عملية تخصيص للذاكرة في الحزمة والمساحة الفارغة والعناصر الكلية. يتحقّق الجهاز ومجموعة التعليمات تلقائيًا من استخدام العلامة الصحيحة عند كل عملية وصول إلى الذاكرة.
إنّ تطبيقات Android التي تخزِّن المعلومات بشكل غير صحيح في أعلى بايتة من السهم تؤدي بالتأكيد إلى حدوث خلل على جهاز مزوّد بتقنية MTE. تسهِّل المؤشرات المُشار إليها رصد الاستخدامات غير الصحيحة لأعلى بايت من المؤشر ورفضها قبل توفُّر أجهزة MTE.
دعم مطوّر البرامج
إذا تعطّل تطبيقك وظهر لك هذا الرابط، قد يعني ذلك أحد ما يلي:
- حاول التطبيق تحرير مؤشر لم يتم تخصيصه من قِبل ملف عناوين برمجية المخصّص للنظام.
- عدّل عنصر في تطبيقك أول بايت من المؤشر. لا يمكن تعديل البايت العلوي من المؤشر، ويجب تغيير الرمز البرمجي لحلّ هذه الصعوبة.
أمثلة على استخدام مؤشر البايت العلوي أو تعديله بشكل غير صحيح
- تحتوي مؤشرات النوع المحدّد على بيانات وصفية خاصة بالتطبيق يتم تخزينها في أعلى 16 بت من العنوان.
- مؤشر تم تحويله إلى مزدوج ثم إلى العكس، ما يؤدي إلى فقدان بتات العنوان الأدنى
- رمز يحسب الفرق بين عناوين المتغيّرات المحلية من إطارات الحزمة المختلفة كطريقة لقياس عمق التكرار
قد تعتمد بعض التطبيقات على مكتبات تعمل بشكل غير صحيح عند ضبط
البايت العلوي للمؤشر. ندرك أنّه قد يكون
من الصعب حلّ هذه المشاكل الأساسية في المكتبات بسرعة. ونتيجةً لذلك، لن تكون ميزة وضع العلامات على المؤشرات مفعّلة تلقائيًا في التطبيقات التي تستخدم targetSdkLevel < 30
. نوفّر أيضًا مخرجًا
للتطبيقات التي تم إنشاؤها باستخدام targetSdkLevel >= 30
لتسهيل الفترة الانتقالية.
يتم استخدام ميزة "الخروج" من خلال إضافة ما يلي إلىملف
AndroidManifest.xml
:
<application android:allowNativeHeapPointerTagging="false"> ... </application>
يؤدي ذلك إلى إيقاف ميزة "وضع علامات على المؤشرات" في تطبيقك، ولكنّ ذلك لا يعالج المشكلة الأساسية في صحة الرمز البرمجي. ستتم إزالة هذا الخيار في الإصدارات المستقبلية من Android، لأنّ المشاكل من هذا النوع ستكون غير متوافقة مع MTE.