انظر فهم تقارير HWASan للحصول على معلومات حول كيفية قراءة HWASan أعطال!
يُعد AddressSanitizer (HWASan) المدعوم بالأجهزة أداة للكشف عن أخطاء الذاكرة تشبه AddressSanitizer . يستخدم HWASan ذاكرة وصول عشوائي أقل بكثير مقارنة بـ ASan ، مما يجعله مناسبًا لتعقيم النظام بالكامل. يتوفر HWASan فقط على نظام Android 10 والإصدارات الأحدث ، وفقط على أجهزة AArch64.
على الرغم من أنه مفيد في المقام الأول لرمز C / C ++ ، إلا أن HWASan يمكنه أيضًا المساعدة في تصحيح كود Java الذي يتسبب في حدوث أعطال في C / C ++ المستخدمة لتنفيذ واجهات Java. إنه مفيد لأنه يكتشف أخطاء الذاكرة عند حدوثها ، ويوجهك مباشرةً إلى الكود المسؤول.
يمكنك وميض صور HWASan التي تم إنشاؤها مسبقًا لأجهزة Pixel المدعومة من ci.android.com ( تعليمات الإعداد التفصيلية ).
بالمقارنة مع ASan الكلاسيكي ، فإن HWASan لديها:
- نفس حمل وحدة المعالجة المركزية (~ 2x)
- حجم الكود المشابه (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 kernel قبول المؤشرات ذات العلامات في وسيطات استدعاء النظام. تم تنفيذ الدعم لهذا في مجموعات التصحيحات الأولية التالية:
- arm64 عنوان موسوم ABI
- arm64: تم تمرير مؤشرات المستخدم untag إلى النواة
- 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
إلى كتلة التطهير في "libc_defaults"
في bionic / libc / Android.bp. ثم افعل الشيء نفسه في الهدف الذي تعمل عليه.
لاحظ أن تعقيم libc يتيح وضع علامات على تخصيصات ذاكرة الكومة على مستوى النظام ، بالإضافة إلى التحقق من العلامات لعمليات الذاكرة داخل libc.so
قد يؤدي هذا إلى اكتشاف الأخطاء حتى في الثنائيات التي لم يتم تمكين HWASan عليها إذا كان الوصول إلى الذاكرة السيئة في libc.so
(على سبيل المثال ، pthread_mutex_unlock()
على delete()
محرر كائن المزامنة).
ليس من الضروري تغيير أي ملفات بناء إذا تم إنشاء النظام الأساسي بالكامل باستخدام HWASan.
فلاشستيشن
لأغراض التطوير ، يمكنك وميض بنية AOSP ممكّنة لـ HWAS على جهاز 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
in Make، or -fsanitize=hwaddress
in compiler flags. على جهاز غير HWASan (يعمل بنظام Android 14 أو أحدث) ، يجب إضافة ملف wrap.sh إعداد LD_HWASAN=1
. راجع وثائق مطور التطبيق لمزيد من التفاصيل.