HWAddressSnitizer

ראה הבנת דוחות 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+) של ליבת אנדרואיד הנפוצה תומכות ב-HWASan מהקופסה. לסניפים הספציפיים של Android 10 אין תמיכה ב-HWASan.

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

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

אם אתה בונה עם שרשרת כלים מותאמת אישית, ודא שהוא כולל הכל עד LLVM commit c336557f .

באמצעות HWASan

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

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

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

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

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

כמה הגבלות AddressSnitizer נעלמו גם כן:

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

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

כדי לדלג על חיטוי של מודול, השתמש 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() ב- delete() ed mutex).

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

תחנת פלאש

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

עקבות מחסנית טובים יותר

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

סימבוליזציה

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

HWAsan באפליקציות

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

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