HWAddressSanitizer

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

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

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

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

بالمقارنة مع Asan الكلاسيكي، فإن HWASan لديه:

  • حمل مماثل لوحدة المعالجة المركزية (~2x)
  • حجم الكود المماثل (40 - 50٪)
  • حجم ذاكرة الوصول العشوائي (RAM) أصغر بكثير (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 قبول المؤشرات ذات العلامات في وسيطات استدعاء النظام. تم تنفيذ الدعم لهذا في مجموعات التصحيح الأولية التالية:

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

باستخدام هواسان

استخدم الأوامر التالية لإنشاء النظام الأساسي بأكمله باستخدام 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() ed mutex).

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

محطة فلاش

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

آثار المكدس أفضل

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

الترميز

راجع الترميز في "فهم تقارير 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 . راجع وثائق مطور التطبيق لمزيد من التفاصيل.