מוצרי AddressSanitizer בסיוע חומרה

ראו הסבר על HWASan כדי לקבל מידע על הדרך שבה לקרוא קריסות של HWASan!

AddressSanitizer (HWASan) בסיוע חומרה הוא שגיאת זיכרון כלי זיהוי שדומה לזה AddressSanitizer. ב-HWASan נעשה שימוש בפחות זיכרון RAM בהשוואה ל-ASAN, ולכן הוא מתאים לניקוי של כל המערכת. ‏HWASan זמין רק ב-Android מגרסה 10 ואילך, ורק בחומרה מסוג AArch64.

למרות שהוא שימושי בעיקר לקוד C/C++, HWASan יכול גם לעזור בניפוי באגים בקוד Java שגורם קריסות ב-C/C++ שמשמשות להטמעת ממשקי Java. זה מועיל כי הוא תופס את הזיכרון בזמן שהן מתרחשות, ומפנים אתכם ישירות לקוד האחראי.

ניתן ליצור Flash תמונות HWASan מוכנות מראש למכשירי Pixel נתמכים מתוך ci.android.com (הוראות הגדרה מפורטות).

בהשוואה ל-ASan הקלאסי, ל-HWASan יש:

  • תקורה דומה של המעבד (CPU) (כ-2x)
  • יתרת קוד דומה (40% עד 50%)
  • תקורה קטנה בהרבה של RAM (10%-35%)

HWASan מזהה את אותה קבוצת באגים כמו ASan:

  • גלישת נתונים/מאגר נתונים זמני של ערימה וערימה
  • שימוש בערימה (heap) אחרי 'free'
  • שימוש במקבץ מחוץ להיקף
  • חופש כפול/חינמי

בנוסף, HWASan מזהה שימוש ב-stack אחרי החזרה.

‏HWAsan (זהה ל-ASan) תואם ל-UBSan, ואפשר להפעיל את שניהם ביעד בו-זמנית.

פרטים על ההטמעה ומגבלות

HWASan מבוסס על זיכרון גישת תיוג, שבה משויך ערך קטן של תג אקראי גם באמצעות מצביעים וגם טווחים של כתובות זיכרון. לזיכרון ושהגישה חוקית, תג הסמן ותגי הזיכרון חייבים להיות תואמים. HWASan מסתמך על התעלמות מבייט עליונה של התכונה ARMv8 (TBI), שנקרא גם תיוג כתובת וירטואלי, לאחסון תג המצביע הביטים הגבוהים ביותר של הכתובת.

אפשר לקרוא עוד על העיצוב של HWASan באתר התיעוד של Clang.

מעצם הגדרתו, ל-HWAsan אין אזורי סכנה בגודל מוגבל כמו ב-ASan לזיהוי זליגות, או מקום מוגבל בבידוד כמו ב-ASan לזיהוי שימוש לאחר סיום תקופת הניסיון. לכן, מערכת HWASan יכולה לזהות באג לא משנה כמה גדול החריגה או לפני כמה זמן הזיכרון היה : transactionlocation הודות לכך, ל-HWASan יש יתרון גדול על פני ASan.

עם זאת, ל-HWASan יש מספר מוגבל של ערכי תגים אפשריים (256), כלומר יש 0.4% סיכוי לפספס באג במהלך הפעלה אחת של התוכנית.

הדרישות

גרסאות אחרונות (4.14 ומעלה) של תמיכה בליבה (kernel) נפוצה של Android HWASan מוכן מראש. ההסתעפויות הספציפיות ל-Android 10 לא תומכות ב-HWASan.

תמיכה במרחב המשתמשים ב-HWASan זמינה החל מ-Android 11.

אם אתם עובדים עם ליבה אחרת, HWASan מחייב את ליבה של Linux לקבל מצביעים מתויגים בארגומנטים של קריאות מערכת. תמיכה בכך יושמה במערכי התיקונים הבאים ב-upstream:

אם אתם מפתחים באמצעות chain בהתאמה אישית, צריך לוודא שהוא כולל את כל מה שצריך עד LLVM בקישור c336557f.

שימוש ב-HWASan

כדי ליצור את כל הפלטפורמה באמצעות HWASan, משתמשים בפקודות הבאות:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

מטעמי נוחות, אפשר להוסיף את ההגדרה SANITIZE_TARGET להגדרת מוצר, דומה ל- aosp_coral_hwasan.

למשתמשים שמכירים את AddressSanitizer, הרבה יותר מורכבות מה-build נעלמת:

  • אין צורך להריץ פעמיים.
  • גרסאות build מצטברות פועלות באופן עצמאי.
  • אין צורך לבצע איפוס נתוני המשתמש.

חלק מההגבלות של AddressSanitizer נעלמו גם הן:

  • יש תמיכה בקובצי הפעלה סטטיים.
  • מותר לוותר על חיטוי עבור כל יעד מלבד libc. בניגוד ל-ASan, אין דרישה שאם ספרייה עוברת חיטוי, היא חייבת להיות גם קובץ הפעלה שמקשר אליה.

אפשר לעבור בקלות בין קובצי אימג' של HWASan לבין קובצי אימג' רגילים עם אותו מספר build (או מספר build גבוה יותר). אין צורך לאפס את נתוני המכשיר.

כדי לדלג על תהליך החיטוי של המודול, משתמשים ב- LOCAL_NOSANITIZE := hwaddress (Android.mk) או sanitize: { hwaddress: false } (Android.bp).

חיטוי יעדים ספציפיים

ניתן להפעיל HWASan לכל יעד ב-build רגיל (לא מאובטח), כל עוד libc.so מוחלט. הוספת hwaddress: true לבלוק החיטוי ב-"libc_defaults" ב-bionic/libc/Android.bp. לאחר מכן חוזרים על הפעולה ביעד שעליו אתם עובדים.

חשוב לשים לב שחיטוי libc מאפשר תיוג של הקצאות זיכרון של הזיכרון ברמת המערכת, וגם בדיקה של התגים לפעולות זיכרון בתוך libc.so. כך אפשר לזהות באגים גם בקובצי בינארי שלא הופעל בהם HWASan, אם הגישה השגויה לזיכרון נמצאת ב-libc.so (למשל: pthread_mutex_unlock() על מנעול משולב (mutex) delete()).

אין צורך לשנות קובצי build אם כל הפלטפורמה נבנתה באמצעות HWASan.

Flashstation

למטרות פיתוח, ניתן לשדרג למכשיר Pixel גרסת build של AOSP שתומך ב-HWASan עם תוכנת אתחול לא נעולה באמצעות Flashstation. בוחרים את היעד _hwasan, למשל: aosp_flame_hwasan-userdebug. לצפייה מסמכי תיעוד של NDK עבור HWASan למפתחים של אפליקציות, לקבלת פרטים נוספים.

דוחות קריסות טובים יותר

‏HWASan משתמש ב-unwinder מהיר שמבוסס על מצביע מסגרת כדי לתעד מעקב סטאק לכל אירוע הקצאה וביטול הקצאה של זיכרון בתוכנית. ב-Android, הסמן של משתמשים למסגרות מופעל בקוד AArch64 כברירת מחדל, אז זה עובד מצוין בפועל. אם אתם צריכים להירגע קוד מנוהל, הגדרה של HWASAN_OPTIONS=fast_unwind_on_malloc=0 בסביבת התהליך. שימו לב שמקבץ גישה לא טוב לזיכרון עקבות משתמשים באופרטור "איטי" לבטל הרצה כברירת מחדל; ההגדרה הזו משפיעה רק על מעקבי הקצאה ו-Deallocation. האפשרות הזו עשויה להיות מאוד תובענית על המעבד, בהתאם לעומס.

ייצוג

ראו סיבולזציה במאמר "הסבר על דוחות HWASan".

HWASan באפליקציות

בדומה ל- AddressSanitizer, ל-HWASan לא יכולה להיות גישה לקוד Java, אבל הוא יכול לזהות באגים בספריות ה-JNI. עד Android 14, לא הייתה תמיכה בהפעלת אפליקציות HWASan במכשיר שאינו HWASan.

במכשיר HWASan, אפשר לבדוק אפליקציות באמצעות HWASan על ידי בניית הקוד שלהן באמצעות SANITIZE_TARGET:=hwaddress ב-Make או -fsanitize=hwaddress בדגלים של המהדר. במכשיר שאינו HWASan (עם Android מגרסה 14 ואילך), צריך להוסיף את ההגדרה LD_HWASAN=1 לקובץ wrap.sh. פרטים נוספים זמינים במסמכי התיעוד למפתחי אפליקציות.