أداة 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 ما يلي:

  • استهلاك وحدة المعالجة المركزية (CPU) بشكل مشابه (مرتين تقريبًا)
  • الزيادة في حجم الرموز البرمجية المتشابهة (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 استخدام HWAS مباشرةً. لا تتوافق فروع 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 إلى مجموعة sanitize في "libc_defaults" في bionic/libc/Android.bp. بعد ذلك، افعل الشيء نفسه في الهدف الذي تعمل عليه.

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

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

Flashstation

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

تتبُّعات بنية تخزين العناصر المحسّنة

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

الترميز

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

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

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

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