يمكنك الاطّلاع على فهم تقارير 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 مباشرةً. لا تتوفّر ميزة HWASan في الفروع الخاصة بنظام التشغيل Android 10.
يتوفّر دعم مساحة المستخدم لـ HWASan اعتبارًا من الإصدار Android 11.
إذا كنت تستخدم نواة مختلفة، تتطلّب أداة HWASan أن تقبل نواة Linux المؤشرات المُشار إليها في وسيطات طلب النظام. تمّ توفير إمكانية استخدام هذه الميزة في حِزم التصحيح التالية في الإصدارات السابقة:
- معرّف ABI لعنوان arm64 المُشار إليه
- arm64: إزالة علامة مؤشرات المستخدم التي تم تمريرها إلى النواة
- mm: تجنُّب إنشاء عناوين بديلة افتراضية في brk()/mmap()/mremap()
- arm64: التحقّق من العناوين المُشار إليها في دالة access_ok() التي يتمّ استدعاؤها من سلاسل مهام kernel
إذا كنت بصدد إنشاء حِزمة باستخدام مجموعة أدوات مخصّصة، تأكَّد من أنّها تتضمّن كل شيء حتى عملية الدفع في LLVM c336557f.
استخدام HWASan
استخدِم الأوامر التالية لإنشاء النظام الأساسي بالكامل باستخدام HWASan:
lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j
للتيسير، يمكنك إضافة الإعداد SANITIZE_TARGET إلى تعريف المنتج، على غرار aosp_coral_hwasan.
بالنسبة إلى المستخدمين المطلعين على أداة AddressSanitizer، تمّت إزالة الكثير من التعقيدات في عملية الإنشاء:
- لا حاجة إلى تشغيل make مرتين.
- تعمل عمليات الإنشاء المتزايدة بشكل تلقائي.
- ما مِن حاجة إلى فلاش بيانات المستخدمين.
تم أيضًا إلغاء بعض قيود أداة 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. حتى إصدار Android 14، لم يكن تشغيل تطبيقات HWASan على جهاز غير مزوّد ببرنامج HWASan متوافقًا.
على جهاز HWASan، يمكن التحقّق من التطبيقات باستخدام HWASan من خلال إنشاء
رمزها باستخدام SANITIZE_TARGET:=hwaddress
في
Make أو -fsanitize=hwaddress
في علامات المُجمِّع.
على جهاز غير مزوّد بتقنية HWASan (يعمل بنظام التشغيل Android 14 أو إصدار أحدث)، يجب إضافة إعداد ملف wrap.sh
LD_HWASAN=1
.
اطّلِع على
مستندات مطوّري التطبيقات
للحصول على مزيد من التفاصيل.