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

סימבוליזציה

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

HWAsan באפליקציות

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

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