HWAddressSnitizer

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 מבוסס על גישת תיוג הזיכרון , שבה ערך תג אקראי קטן משויך הן למצביעים והן לטווחים של כתובות זיכרון. כדי שגישה לזיכרון תהיה חוקית, המצביע ותגי הזיכרון צריכים להתאים. HWASan מסתמך על התעלמות בתים עליונים של ARMv8 (TBI), הנקרא גם תיוג כתובת וירטואלית , כדי לאחסן את תג המצביע בסיביות הגבוהות ביותר של הכתובת.

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

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

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

דרישות

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

תיקונים אלה זמינים כיציאות אחוריות בקרנל האנדרואיד הנפוץ בענפי אנדרואיד-4.14 ומעלה, אך לא בענפים ספציפיים ל-Android 10 כגון android-4.14-q .

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

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

באמצעות HWASan

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

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

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

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

כדי לדלג על חיטוי של מודול, השתמש ב- LOCAL_NOSANITIZE := hwaddress או sanitize: { hwaddress: false } .

ניתן לבצע חיטוי של מודולים בודדים עם HWASan, עם האזהרה ש- libc גם מותאמת ל-HWASan. ניתן לעשות זאת על ידי הוספת sanitize: { hwaddress: true } להגדרת מודול Android.bp המתאימה. כל פלטפורמת האנדרואיד בנויה עם HWASan בעת שימוש ב- _hwasan -סיומת build (כולל libc ), וככזה חיטוי ידני של libc אינו הכרחי עבור בניית HWASan.

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

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

סימבוליזציה

ראה סימבוליזציה בתיעוד ASan .

HWAsan באפליקציות

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

במכשיר HWASan, ניתן לבדוק אפליקציות עם HWASan על ידי בניית הקוד שלהם עם SANITIZE_TARGET:=hwaddress ב-Make, או -fsanitize=hwaddress בדגלי מהדר. עיין בתיעוד למפתחי האפליקציה לפרטים נוספים.