يتيح Android أدوات متعددة لتصحيح أخطاء الذاكرة. هناك مزايا وعيوب لكل منهما، لذا يُرجى الاطّلاع على ما يلي لتحديد الطريقة الأنسب لحالة الاستخدام. يمنحك هذا المستند نظرة عامة على الأدوات المتاحة حتى تتمكّن من تحديد الأداة التي تريد إجراء مزيد من التحقيق بشأنها، ولكنّه يهدف إلى أن يكون موجزًا، لذا يُرجى قراءة المستندات المتعلّقة بالأدوات للحصول على التفاصيل.
النص المختصَر
- استخدِم لغة آمنة للذاكرة كلما أمكن ذلك لمنع حدوث أخطاء في الذاكرة.
- استخدام PAC/BTI دائمًا للحد من هجمات ROP/JOP
- استخدِم دائمًا GWP-ASan لرصد أخطاء الذاكرة النادرة في مرحلة الإنتاج.
- استخدام HWASan لرصد أخطاء الذاكرة أثناء الاختبار
- إنّ الأجهزة المزوّدة بتقنية MTE غير متاحة بشكل عام. لن يكون هذا مفيدًا إلى أن يتم إجراء التغييرات اللازمة.
- لا تستخدِم ASan أثناء الاختبار إلا كحلّ أخير.
اللغات الآمنة للذاكرة
إنّ استخدام لغة آمنة للذاكرة هو الطريقة الوحيدة لتجنُّب أخطاء الذاكرة تمامًا والحدّ منها. يمكن أن تساعدك الأدوات الأخرى في هذه الصفحة على جعل الرمز البرمجي غير الآمن للذاكرة أكثر أمانًا وموثوقية، ولكن استخدام لغة آمنة للذاكرة يزيل مجموعة المشاكل بالكامل.
اللغتان الرسميتان المتوافقتان مع ميزة "توفير الذاكرة" في Android هما Java وKotlin. ومن الأسهل تطوير معظم تطبيقات Android باستخدام إحدى هذه اللغات.
ومع ذلك، هناك مطوّرو تطبيقات يرسلون رمزًا مكتوبًا بلغة Rust، وإذا كنت تقرأ هذه الصفحة، من المحتمل أن يكون لديك سبب وجيه للحاجة إلى رمز أصلي (قابلية النقل أو الأداء أو كليهما). Rust هو الخيار الأفضل لكتابة رمز برمجي native آمن للذاكرة على Android. قد لا يتمكّن فريق NDK بالضرورة من مساعدتك في حلّ المشاكل التي تواجهك في حال اتّباع هذا المسار، ولكننا مهتمون بمعرفة تفاصيلها.
PAC/BTI
إنّ التحقّق من المؤشرات وتحديد استهداف الفروع، المعروفَين أيضًا باسم PAC/BTI، هما أداتان للحدّ من الهجمات مناسبة للاستخدام في مرحلة الإنتاج. على الرغم من أنّهما تقنيتان منفصلتان، يتم التحكّم فيهما باستخدام علامة المُجمِّع نفسها، لذلك يتم استخدامهما معًا دائمًا.
تتوافق هذه الميزات مع الأجهزة القديمة التي لا تتيح استخدامها،
لأنّ التعليمات الجديدة المستخدَمة لا تعمل على الأجهزة القديمة. يجب أيضًا
توفُّر نواة جديدة وإصدار جديد من نظام التشغيل.
يشير البحث عن paca
وbti
في /proc/cpuinfo
إلى ما إذا كان لديك جهاز
جديد بما يكفي ونواة جديدة بما يكفي. يتوفّر في نظام Android 12 (المستوى 31 من واجهة برمجة التطبيقات) التوافق اللازم
مع مساحة المستخدم.
الإيجابيات:
- يمكن تفعيلها في جميع الإصدارات بدون التسبب في مشاكل على الأجهزة أو النواة القديمة (ولكن تأكَّد من أنّك اختبرت هذه الميزة على جهاز/نواة/نظام تشغيل متوافق معها).
السلبيات:
- لا يتوفّر هذا الخيار إلا للتطبيقات التي تعمل بنظام 64 بت.
- لا تقلّل من الأخطاء على الأجهزة التي لا تتيح استخدامها
- زيادة بنسبة% 1 في حجم الرمز
GWP-Asan
يمكن استخدام GWP-ASan لرصد أخطاء الذاكرة في الحقل، ولكنّ معدّل أخذ العينات منخفض جدًا لكي يكون إجراءً وقائيًا فعّالاً.
الإيجابيات:
- عدم استخدام وحدة المعالجة المركزية أو الذاكرة بشكل كبير
- سهولة النشر: لا تتطلّب إعادة إنشاء الرمز الأصلي
- تعمل مع التطبيقات التي تعمل بنظام 32 بت
السلبيات:
- يتطلّب معدّل أخذ العينات المنخفض عددًا كبيرًا من المستخدمين للعثور على الأخطاء بفعالية.
- لا يرصد سوى أخطاء الذاكرة العشوائية، وليس أخطاء تسلسل استدعاء الدوال البرمجية.
HWASan
أداة فحص عناوين الأجهزة، المعروفة أيضًا باسم HWASan، هي الأكثر ملاءمةً لرصد أخطاء الذاكرة أثناء الاختبار. ويكون هذا الإعداد مفيدًا بشكلٍ خاص عند استخدامه مع الاختبار المبرمَج، خاصةً إذا كنت تُجري اختبارات الكشف عن الأخطاء، ولكن استنادًا إلى متطلبات أداء تطبيقك، قد يكون قابلاً للاستخدام أيضًا على الهواتف الراقية في إعداد "الإصدار التجريبي للموظفين الداخليين".
الإيجابيات:
- عدم ظهور نتائج إيجابية خاطئة
- رصد فئات إضافية من الأخطاء التي لا يمكن لـ ASan رصدها (استخدام الذاكرة المؤقتة بعد العودة)
- معدّل أقلّ للحالات السالبة الخاطئة مقارنةً بـ MTE (1 من 256 مقابل 1 من 16)
- تستهلك ذاكرة أقل من أداة ASan، وهي أقرب بديل لها
السلبيات:
- استخدام مرتفع لوحدة المعالجة المركزية (%100 تقريبًا) وحجم رمز البرنامج (%50 تقريبًا) والذاكرة (%10 إلى %35)
- حتى الإصدار 34 من حزمة تطوير البرامج (API) والإصدار 26 من حزمة تطوير البرامج (NDK)، يجب فلاش صورة متوافقة مع HWASan.
- لا تعمل هذه الميزة إلا على التطبيقات المتوافقة مع الإصدار 64 بت.
MTE
إضافة وضع علامات الذاكرة، المعروفة أيضًا باسم MTE، هي بديل منخفض التكلفة لميزة HWASan. بالإضافة إلى إمكانات تصحيح الأخطاء والاختبار، يمكن استخدامها لرصد تلف الذاكرة والحدّ منه في مرحلة الإنتاج. إذا كان لديك الأجهزة اللازمة لاختبار إصدارات وضع علامات الذاكرة (MTE)، عليك تفعيلها.
الإيجابيات:
- أن تكون النفقات العامة منخفضة بما يكفي لتكون مقبولة في مرحلة الإنتاج للعديد من التطبيقات
- عدم ظهور نتائج إيجابية خاطئة
- لا تتطلّب إعادة إنشاء الرمز البرمجي لرصد أخطاء الذاكرة (ولكنّها تتطلّب ذلك لرصد أخطاء الرمز البرمجي)
السلبيات:
- لا تتوفّر أجهزة متوفّرة تجاريًا تم تفعيل ميزة MTE فيها تلقائيًا في 2024، ولكن تشرح مستندات Arm كيفية تفعيل ميزة MTE للاختبار على هاتفَي Pixel 8/Pixel 8 Pro.
- نسبة النتائج السالبة الخاطئة هي 1 من 16 مقارنةً بنسبة 1 من 256 في HWASan
- لا تتوفّر إلا للتطبيقات التي تعمل بنظام 64 بت
- يتطلّب إنشاء مكتبات منفصلة لاستهداف كلّ من الأجهزة المزوّدة بإضافة وضع علامات الذاكرة (MTE) والأجهزة غير المزوّدة بإضافة MTE
آسان
أداة تنظيف العناوين، المعروفة أيضًا باسم ASan، هي أقدم الأدوات المتاحة والأكثر انتشارًا. وهي مفيدة لرصد أخطاء استهلاك الذاكرة أثناء الاختبار وتحديد المشاكل المتعلقة بتصحيح الأخطاء التي تؤثر فقط في الأجهزة القديمة التي لا تتوفّر فيها أي من الأدوات الأخرى. يُفضَّل استخدام HWASan كلما أمكن ذلك.
الإيجابيات:
- أن تكون متاحة على نطاق واسع قد تعمل على الأجهزة القديمة التي تعمل بنظام التشغيل KitKat
- عدم ظهور نتائج إيجابية أو سلبية خاطئة عند الاستخدام الصحيح
السلبيات:
- من الصعب إنشاء الحِزم وتعبئتها بشكل صحيح
- أعلى تكلفة لجميع الخيارات: استخدام وحدة المعالجة المركزية بنسبة% 100 تقريبًا وحجم الرمز البرمجي بنسبة% 50 تقريبًا واستخدام الذاكرة بنسبة% 100 تقريبًا
- لم يعُد متاحًا
- تحتوي على أخطاء معروفة لن يتم إصلاحها