المؤشرات الموسومة

بدءًا من Android 11، بالنسبة لعمليات 64 بت، تحتوي جميع عمليات تخصيص الكومة على علامة تنفيذ محددة تم تعيينها في البايت العلوي للمؤشر على الأجهزة التي تدعم kernel لتجاهل ARM Top-byte (TBI). يتم إنهاء أي تطبيق يقوم بتعديل هذه العلامة عند فحص العلامة أثناء إلغاء التخصيص. يعد هذا ضروريًا للأجهزة المستقبلية التي تدعم ARM Memory Tagged Extension (MTE).

تجاهل البايت العلوي

تتوفر ميزة تجاهل البايت الأعلى لـ ARM لرمز 64 بت في جميع أجهزة Armv8 AArch64. تعني هذه الميزة أن الجهاز يتجاهل البايت العلوي للمؤشر عند الوصول إلى الذاكرة.

يتطلب TBI نواة متوافقة تتعامل بشكل صحيح مع المؤشرات ذات العلامات التي تم تمريرها من مساحة المستخدم. تتميز Android Common Kernels بدءًا من الإصدار 4.14 (Pixel 4) والإصدارات الأحدث بتصحيحات TBI المطلوبة.

يتم اكتشاف الأجهزة التي تدعم TBI في kernel ديناميكيًا في وقت بدء العملية ويتم إدراج علامة تعتمد على التنفيذ في البايت العلوي للمؤشر لجميع عمليات تخصيص الكومة. بعد ذلك، يتم إجراء فحص للتأكد من عدم اقتطاع العلامة عند إلغاء تخصيص الذاكرة.

جاهزية تمديد علامات الذاكرة

يساعد ملحق وضع علامات الذاكرة (MTE) الخاص بـ ARM على معالجة مشكلات سلامة الذاكرة. تعمل MTE عن طريق وضع علامات على بتات العناوين من 56 إلى 59 لكل تخصيص للذاكرة على المكدس، والكومة، والمجموعات العالمية. تتحقق مجموعة الأجهزة والتعليمات تلقائيًا من استخدام العلامة الصحيحة عند كل وصول إلى الذاكرة.

تطبيقات Android التي تخزن المعلومات بشكل غير صحيح في البايت العلوي للمؤشر مضمونة للتعطل على جهاز يدعم MTE . تعمل المؤشرات ذات العلامات على تسهيل اكتشاف ورفض الاستخدامات غير الصحيحة للبايت العلوي للمؤشر قبل توفر أجهزة MTE.

دعم المطور

إذا تعطل تطبيقك وتمت مطالبتك بهذا الرابط، فقد يعني ذلك واحدًا مما يلي:

  1. حاول التطبيق تحرير مؤشر لم يتم تخصيصه بواسطة مُخصص الكومة الخاصة بالنظام.
  2. هناك شيء ما في تطبيقك أدى إلى تعديل البايت العلوي للمؤشر. لا يمكن تعديل البايت العلوي للمؤشر ويجب تغيير التعليمات البرمجية الخاصة بك لإصلاح هذه المشكلة.

أمثلة على استخدام مؤشر البايت العلوي أو تعديله بشكل غير صحيح.

  • تحتوي المؤشرات إلى نوع معين على بيانات تعريف خاصة بالتطبيق مخزنة في أعلى 16 بت عنوان.
  • يتم تحويل المؤشر إلى مضاعفة ثم الرجوع مرة أخرى، مما يؤدي إلى فقدان بتات العنوان السفلية.
  • كود حساب الفرق بين عناوين المتغيرات المحلية من إطارات مكدسة مختلفة كوسيلة لقياس عمق العودية.

قد تعتمد بعض التطبيقات على مكتبات تتصرف بشكل غير صحيح عند تعيين البايت العلوي للمؤشر. نحن ندرك أنه قد يكون من غير السهل إصلاح هذه المشكلات الأساسية في المكتبات بسرعة. على هذا النحو، لن يتم تمكين وضع علامات المؤشر بشكل افتراضي على التطبيقات التي تستخدم targetSdkLevel < 30 . نوفر أيضًا فتحة هروب للتطبيقات المبنية باستخدام targetSdkLevel >= 30 لتسهيل الفترة الانتقالية.

يتم استخدام فتحة الهروب عن طريق إضافة ما يلي إلى ملف AndroidManifest.xml الخاص بك:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

سيؤدي هذا إلى تعطيل ميزة وضع علامات على المؤشر لتطبيقك. الرجاء ملاحظة أن هذا لا يعالج مشكلة سلامة التعليمات البرمجية الأساسية. ستختفي فتحة الهروب هذه في الإصدارات المستقبلية من Android، لأن المشكلات من هذا النوع لن تكون متوافقة مع MTE .