تصحيح أخطاء الذاكرة والحدّ منها

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

النص المختصر (tl;dr)

  • استخدام لغة آمنة للذاكرة كلما أمكن ذلك لجعل أخطاء الذاكرة مستحيلة
  • استخدام PAC/BTI دائمًا للحدّ من هجمات ROP/JOP
  • استخدام GWP-ASan دائمًا لرصد أخطاء الذاكرة النادرة أثناء الإنتاج
  • استخدام تطبيق HWASan لرصد أخطاء الذاكرة أثناء الاختبار
  • لا تتوفّر الأجهزة المتوافقة مع MTE بشكل عام في 2023، ولكن يمكنك استخدامها إذا كان بإمكانك رصد الأخطاء في مرحلة الإنتاج.
  • استخدام ASan أثناء الاختبار كحل أخير فقط

لغات آمنة للذاكرة

اللغة الآمنة للذاكرة هي الطريقة الوحيدة لتجنب أخطاء الذاكرة وتخفيفها تمامًا. يمكن أن تساعدك الأدوات الأخرى في هذه الصفحة في جعل الرموز البرمجية غير الآمنة أكثر أمانًا وموثوقية، ولكن استخدام لغة آمنة للذاكرة يقضي على الفئة الكاملة من المشكلات.

اللغات المعتمدة رسميًا للذاكرة الآمنة لنظام التشغيل Android هي Java وKotlin. من الأسهل تطوير معظم تطبيقات Android بإحدى هذه اللغات.

مع ذلك، هناك مطوّرو تطبيقات يستخدمون رمز شحن مكتوب بلغة Rust. إذا كنت تقرأ هذه الصفحة، لديك على الأرجح سبب وجيه لحاجتك إلى استخدام الرمز الأصلي (مثل قابلية النقل أو الأداء أو كليهما). يُعد الإصدار الصدئ الخيار الأفضل بالنسبة إلى الرموز البرمجية الأصلية الآمنة للذاكرة على Android. وليس بالضرورة أن يساعدك فريق NDK في حلّ المشاكل التي تواجهك إذا ما سلكت هذا المسار، ولكننا مهتمون بسماعها.

PAC/BTI

مصادقة المؤشر وتحديد هدف الفرع، المعروفة أيضًا باسم PAC/BTI، هما أداتان مناسبتان للاستخدام في الإنتاج. وعلى الرغم من أنها تقنيات منفصلة، إلا أنه يتم التحكم فيها من خلال علامة برنامج التجميع نفسها، لذلك يتم استخدامها معًا دائمًا.

هذه الميزات متوافقة مع الأنظمة القديمة مع الأجهزة التي لا تتوافق معها لأن التعليمات الجديدة المستخدَمة لا تعتمد على التشغيل على الأجهزة السابقة. من الضروري أيضًا أن يكون لديك نواة جديدة كافية وإصدار جديد كافٍ من نظام التشغيل. إنّ البحث عن paca وbti في /proc/cpuinfo يوضّح ما إذا كان لديك أجهزة جديدة كافية ونواة جديدة كافية. يتضمّن Android 12 (واجهة برمجة التطبيقات 31) الدعم اللازم في مساحة المستخدم.

الإيجابيات:

  • يمكن تفعيله في جميع الإصدارات بدون التسبب في مشاكل على الأجهزة القديمة أو النواة (ولكن احرص على اختبار نسخة من جهاز/kernel/نظام تشغيل) يتوافق مع هذه الميزة.)

السلبيات:

  • تتوفّر هذه الميزة لتطبيقات 64 بت فقط.
  • لا يخفف من الأخطاء على الأجهزة التي لا تتوافق معه
  • 1% زيادة في حجم الرمز

GWP-Asan

يمكن استخدام GWP-ASan لاكتشاف أخطاء الذاكرة في الحقل، إلا أن معدل العينات منخفض جدًا بحيث لا يمكن الحد منه بشكل فعال.

الإيجابيات:

  • ليست هناك أعباء كبيرة على وحدة المعالجة المركزية (CPU) أو الذاكرة
  • عنصر بسيط يمكن نشره: لا يتطلب إعادة إنشاء الرموز البرمجية الأصلية
  • العمل مع تطبيقات 32 بت

السلبيات:

  • إنّ انخفاض معدّل أخذ العينات يتطلّب عددًا كبيرًا من المستخدمين للعثور على الأخطاء بشكل فعّال.
  • يتم رصد أخطاء في تسلسل استدعاء الدوال البرمجية فقط، وليس أخطاء تسلسل استدعاء الدوال البرمجية.

هواسان

يُعد برنامج معالجة عناوين الأجهزة، المعروف أيضًا باسم HWASan، الأفضل ملاءمة لرصد أخطاء الذاكرة أثناء الاختبار. وهو مفيد للغاية عند الاستخدام مع الاختبار الآلي، خاصة عند إجراء اختبارات الزغب، ولكن بناءً على احتياجات أداء تطبيقك قد يكون قابلاً للاستخدام أيضًا على الهواتف المتطورة ضمن إعداد تجريبي.

الإيجابيات:

  • ما مِن نتائج موجبة خاطئة
  • ترصد فئات إضافية من الأخطاء التي لا يمكن لـ ASan استخدامها (استخدام التنضيد بعد الإرجاع)
  • معدّل القيم السالبة الخاطئة أقل من MTE (1 في 256 مقابل 1 في 16)
  • أعباء زائدة على الذاكرة أقل من دالة ASan، وهي أقرب بديل لها

السلبيات:

  • وحدة معالجة مركزية (CPU) كبيرة (حوالي 100٪)، وحجم الرمز (حوالي 50٪)، والذاكرة (10٪ - 35٪) الحد الأقصى للذاكرة
  • تتطلب واجهة برمجة التطبيقات 34 وNDK r26 تثبيت صورة متوافقة مع HWASan
  • هذه الميزة تعمل فقط على تطبيقات 64 بت.

إضافة وضع علامات الذاكرة (MTE)

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

الإيجابيات:

  • قدر كافٍ من النفقات العامة يمكن تحمله في مرحلة الإنتاج للعديد من التطبيقات
  • ما مِن نتائج موجبة خاطئة
  • لا يتطلب إعادة إنشاء التعليمات البرمجية لاكتشاف أخطاء كومة الذاكرة المؤقتة (ولكن لاكتشاف أخطاء التكدس)

السلبيات:

  • ما مِن أجهزة متاحة تجاريًا تم تفعيل إضافة وضع علامات الذاكرة (MTE) عليها تلقائيًا في عام 2024، ولكن توضّح مستندات Arm كيفية تفعيل إضافة وضع علامات الذاكرة (MTE) للاختبار على هواتف Pixel 8/Pixel 8 Pro.
  • معدّل سالب خاطئ لـ 1 من 16 مقارنةً بـ 1 لـ HWASan من في 256
  • تتوفّر هذه الميزة لتطبيقات 64 بت فقط.
  • يتطلب إنشاء مكتبات منفصلة لاستهداف كل من الأجهزة التي تستخدم إضافة وضع علامات الذاكرة (MTE) والأجهزة التي لا تتضمن هذه الميزة

أسان

معقّم العنوان، المعروف أيضًا باسم ASan، هو أقدم الأدوات المتاحة ومتاحة على نطاق واسع. وهو مفيد لاكتشاف أخطاء الذاكرة أثناء الاختبار وتصحيح الأخطاء التي تؤثر فقط على الأجهزة القديمة التي لا تتوفر بها أي أدوات أخرى. كلما أمكن ذلك، من الأفضل استخدام HWASan.

الإيجابيات:

  • متاحة على نطاق واسع. قد تعمل على أجهزة قديمة مثل KitKat
  • لا تتوفّر نتائج موجبة أو سالبة خاطئة عند الاستخدام بشكلٍ صحيح

السلبيات:

  • من الصعب إنشاءه وتغليفه بشكل صحيح
  • الحد الأقصى من التكاليف بين جميع الخيارات: وحدة معالجة مركزية (CPU) تبلغ نسبتها 100% تقريبًا، وحجم الرموز حوالي 50%، واستخدام الذاكرة بنسبة 100% تقريبًا
  • لم يعد متاحًا
  • به أخطاء معروفة لن يتم إصلاحها