أداة AddressSanitizer بمساعدة الأجهزة

انظر فهم HWASan تقارير للحصول على معلومات حول كيفية قراءة أعطال HWASan

أداة AddressSanitizer (HWASan) المدعومة بالأجهزة هي أداة لرصد أخطاء الذاكرة مشابهة لأداة AddressSanitizer. يستخدم HWASan ذاكرة وصول عشوائي أقل بكثير مقارنةً بـ ASan، ما يجعله مناسبًا لتطهير النظام بالكامل. لا يتوفّر HWASan إلا على الإصدار 10 من نظام Android والإصدارات الأحدث، وعلى أجهزة AArch64 فقط.

على الرغم من أنّ أداة HWASan مفيدة في الأساس لرمز C/C++، إلا أنّها يمكن أن تساعد أيضًا في تصحيح أخطاء رمز Java الذي يتسبب في تعطُّل لغة C/C++ المستخدَمة لتنفيذ واجهات Java. ويُعدّ ذلك مفيدًا لأنّه يرصد أخطاء الذاكرة عند حدوثها، ويوجّهك مباشرةً إلى الرمز البرمجي المسؤول عنها.

يمكنك فلاش صور HWASan المُعدّة مسبقًا على أجهزة Pixel المتوافقة من ci.android.com (تعليمات الإعداد التفصيلية).

مقارنةً بـ ASan الكلاسيكي، توفّر HWASan ما يلي:

  • أعباء وحدة المعالجة المركزية مماثلة (حوالي ضعف)
  • الزيادة في حجم الرموز البرمجية المتشابهة (40% و 50%)
  • استخدام ذاكرة وصول عشوائي أقل بكثير (من %10 إلى %35)

يرصد HWASan المجموعة نفسها من الأخطاء التي يرصدها ASan:

  • تجاوز/تدفق المخزن المؤقت للتكديس وأجزاء من الذاكرة
  • استخدام لقطات لأجزاء من الذاكرة بعد الفترة المجانية
  • استخدام التكديس خارج النطاق
  • رسوم مجانية مضاعفة/رسوم مجانية بدون قيود

بالإضافة إلى ذلك، يرصد HWASan استخدام الحزمة بعد الرجوع.

يتوافق بروتوكول HWASan (مثل ASan) مع UBSan، يمكن تفعيلهما معًا على هدف في الوقت نفسه.

تفاصيل التنفيذ والقيود المفروضة عليه

يعتمد HWASan على الذاكرة وضع العلامات، حيث يتم ربط قيمة علامة عشوائية صغيرة باستخدام كل من المؤشرات ونطاقات عناوين الذاكرة. لكي يكون إذن الوصول إلى ذكرى صالحًا، يجب أن تتطابق علامة المؤشر وعلامة الذكرى. تعتمد تقنية HWASan على ميزة ARMv8 لتجاوز البايت العلوي (TBI)، والتي تُعرف أيضًا باسم وضع علامة على العنوان الافتراضي، لتخزين علامة المؤشر في أعلى بتات العنوان.

يمكنك قراءة المزيد عن التصميم HWASan على موقع وثائق Clang.

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

ومع ذلك، لدى HWASan عددًا محدودًا من قيم العلامات المحتملة (256)، مما يعني أن هناك احتمال 0.4% لفقدان أي خطأ خلال إحدى عمليات تنفيذ البرنامج.

المتطلبات

الإصدارات الحديثة (4.14 أو أحدث) من دعم نواة Android الشائعة حزمة HWASan. لا تتوافق فروع Android 10 المحدّدة مع HWASan.

يتوفّر دعم مساحة المستخدم لـ HWASan اعتبارًا من الإصدار Android 11.

إذا كنت تعمل باستخدام نواة مختلفة، فإن HWASan تتطلب نواة Linux لقبول المؤشرات ذات العلامات في وسيطات طلب بيانات النظام. تمّ توفير إمكانية استخدام هذه الميزة في حِزم التصحيح التالية في الإصدارات السابقة:

إذا كنت تنشئ باستخدام سلسلة أدوات مخصّصة، تأكَّد من أنّها تتضمّن كل البيانات حتى تنفيذ LLVM. c336557f.

استخدام HWASan

استخدِم الأوامر التالية لإنشاء النظام الأساسي بالكامل باستخدام HWASan:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

ولتسهيل الأمر، يمكنك إضافة الإعداد SANITIZE_TARGET إلى تعريف المنتج، مشابه لـ aosp_coral_hwasan.

بالنسبة إلى المستخدمين الذين لديهم دراية بأداة AddressSanitizer، يمكن إزالة الكثير من تعقيدات الإنشاء:

  • لا حاجة إلى التنفيذ مرتين.
  • البناء التزايدي يعمل خارج الصندوق.
  • لا داعي لتحديث بيانات المستخدم.

تم أيضًا إلغاء بعض قيود أداة AddressSanitizer:

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

يمكن إجراء التبديل بين صور HWASan والصور العادية برقم الإصدار نفسه (أو إصدار أعلى). يتم ذلك بحرية. لا يلزم مسح الجهاز.

لتخطّي عملية إزالة البيانات غير الصالحة من إحدى الوحدات، استخدِم LOCAL_NOSANITIZE := hwaddress (Android.mk) أو sanitize: { hwaddress: false } (Android.bp).

تنظيف الاستهدافات الفردية

يمكن تفعيل HWASan لكل هدف في إصدار عادي (غير مُعقَّم)، طالما أنّ libc.so مُعقَّم أيضًا. أضِف "hwaddress: true" إلى مربّع التعقيم في ""libc_defaults"" في Binic/libc/Android.bp. بعد ذلك، يمكنك إجراء الخطوات نفسها في الهدف الذي تعمل عليه.

لاحظ أن تنقيح libc يتيح وضع علامات على تخصيصات الذاكرة لأجزاء من الذاكرة على مستوى النظام، بالإضافة إلى جارٍ التحقّق من علامات عمليات الذاكرة داخل libc.so. قد يؤدي ذلك إلى رصد الأخطاء حتى في الملفات الثنائية التي لم يتم تفعيل HWASan فيها إذا كان الوصول إلى الذاكرة غير الصالح في libc.so (مثل pthread_mutex_unlock() في كائن كائن delete()).

ليس من الضروري تغيير أي ملفات إنشاء إذا تم إنشاء المنصة بأكملها باستخدام HWASan.

محطة فلاش

لأغراض التطوير، يمكنك فلاش إصدار AOSP مزوّد بميزة HWASan على جهاز Pixel الذي تم فتح أداة تشفير التمهيد فيه باستخدام Flashstation. اختَر الهدف ‎_hwasan، مثلاً aosp_flame_hwasan-userdebug. اطّلِع على مستندات حزمة تطوير البرامج (NDK) لـ HWASan لمطوّري التطبيقات للحصول على مزيد من التفاصيل.

تحسين عمليات تتبُّع تسلسل استدعاء الدوال البرمجية

يستخدم HWASan أداة إلغاء سريعة مستندة إلى مؤشر الإطار لتسجيل حزمة لكل عملية تخصيص للذاكرة وترتيب حدث في البرنامج. يفعّل Android مؤشرات الإطارات في رمز AArch64 تلقائيًا، لذا يعمل هذا الإجراء بشكل جيد في الممارسة. إذا كنت بحاجة إلى إلغاء التفويض من خلال رمز مُدار، اضبط HWASAN_OPTIONS=fast_unwind_on_malloc=0 في بيئة العملية. ملاحظة: ضعف الوصول إلى الذاكرة تستخدم الآثار "البطء" التراجع تلقائيًا لا يؤثّر هذا الإعداد إلّا في آثار التخصيص والتوزيع. يمكن أن يكون هذا الخيار تستهلك وحدة المعالجة المركزية (CPU) وحدة معالجة مركزية (CPU) حسب الحِمل.

الترميز

اطّلِع على التصنيف في مقالة "التعرّف على تقارير HWASan".

HWASan في التطبيقات

على غرار أداة AddressSanitizer، لا يمكن لأداة HWASan الاطّلاع على رمز Java، ولكن يمكنها رصد الأخطاء في مكتبات JNI. حتى نظام التشغيل Android 14، سيتم تشغيل HWASan لم يكن التطبيق متوافقًا مع جهاز غير HWASan.

يمكن التحقّق من التطبيقات باستخدام بروتوكول HWASan على جهاز HWASan من خلال إنشاء رمز يحتوي على SANITIZE_TARGET:=hwaddress بوصة إنشاء أو -fsanitize=hwaddress في علامات برنامج التجميع. على جهاز غير مزوّد بتقنية HWASan (يعمل بنظام التشغيل Android 14 أو إصدار أحدث)، يجب إضافة إعداد ملف wrap.sh LD_HWASAN=1. اطّلِع على مستندات مطوّري التطبيقات للحصول على مزيد من التفاصيل.