أداة AddressSanitizer بمساعدة الأجهزة

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

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

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

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

بالمقارنة مع ASan الكلاسيكي، يتميز HWASan بما يلي:

  • أعباء وحدة المعالجة المركزية مماثلة (حوالي ضعف)
  • الزيادة في حجم الرموز البرمجية المتشابهة (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.

يتوفَّر دعم Userspace لنظام 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" إلى مربّع التعقيم في ""libc_defaults"" في Binic/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 بوصة إنشاء أو -fsanitize=hwaddress في علامات برنامج التجميع. إعداد ملف wrap.sh على جهاز غير متوافق مع HWASan (يعمل بنظام التشغيل Android 14 أو إصدار أحدث) يجب إضافة LD_HWASAN=1. يمكنك الاطّلاع على مستندات مطوّري التطبيقات لمزيد من التفاصيل.