انظر فهم HWASan تقارير للحصول على معلومات حول كيفية قراءة أعطال HWASan
أداة AddressSanitizer (HWASan) المدعومة بالأجهزة هي أداة لرصد أخطاء الذاكرة مشابهة لأداة AddressSanitizer. يستخدم HWASan ذاكرة وصول عشوائي أقل بكثير مقارنةً بـ ASan، ما يجعله مناسبًا لتطهير النظام بالكامل. لا تتوفّر خدمة HWASan إلا على نظام التشغيل Android 10. وأعلى، وعلى أجهزة 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 قبول المؤشرات المُشار إليها في وسيطات طلب النظام. تمّ توفير إمكانية استخدام هذه الميزة في حِزم التصحيح التالية في الإصدارات السابقة:
- عنوان 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، يمكن إزالة الكثير من تعقيدات الإنشاء:
- لا حاجة إلى التنفيذ مرتين.
- تعمل عمليات الإنشاء المتزايدة تلقائيًا.
- لا داعي لتحديث بيانات المستخدم.
سيتم أيضًا إزالة بعض قيود 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.
محطة فلاش
لأغراض التطوير، يمكنك تثبيت إصدار 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
في
Make أو -fsanitize=hwaddress
في علامات المُجمِّع.
إعداد ملف wrap.sh على جهاز غير متوافق مع HWASan (يعمل بنظام التشغيل Android 14 أو إصدار أحدث)
يجب إضافة LD_HWASAN=1
.
يمكنك الاطّلاع على
مستندات مطوّري التطبيقات
لمزيد من التفاصيل.