HWAddressSanitizer

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

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

אתה יכול פלאש תמונות prebuilt HWASan למכשירי פיקסל נתמכים מן ci.android.com ( הוראות התקנה מפורטות ).

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

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

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

  • הצפה וערימה של מאגר הצפה/תת זרימה
  • שימוש בערמה לאחר חינם
  • שימוש בערימה מחוץ להיקף
  • חינם כפול/חינם

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

פרטי יישום ומגבלות

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

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

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

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

דרישות

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

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

תמיכה מרחב משתמש עבור HWASan הוא מוצא זמין עם אנדרואיד 11.

אם אתה בונה עם toolchain המנהג, לוודא שהוא כולל הכל עד LLVM להתחייב 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 היא גם-ified HWASan. ניתן לעשות זאת על ידי הוספת sanitize: { hwaddress: true } אל בהתאמה Android.bp הגדרת המודול. פלטפורמת האנדרואיד כולה בנויה עם HWASan בעת שימוש _hwasan לבנות -suffixed (כולל libc ), וככזה והחיטוי ידני libc אינו הכרחי עבור HWASan בונה.

עקבות ערימה טובות יותר

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

סמל

ראה הסמלה בתיעוד אסאן.

HWASan באפליקציות

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

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