ראו הסבר על HWASan כדי לקבל מידע על הדרך שבה לקרוא קריסות של HWASan.
AddressSanitizer (HWASan) בסיוע חומרה הוא שגיאת זיכרון כלי זיהוי שדומה לזה AddressSanitizer. הוואסן משתמש בהרבה פחות RAM בהשוואה ל-ASan, ולכן הוא מתאים ניקיון המערכת כולו. HWASan זמין רק ב-Android 10 ומעלה, ורק בחומרה של AArch64.
למרות ש-HWASan שימושי בעיקר לקוד C/C++ הוא יכול לעזור בניפוי באגים בקוד Java שגורם קריסות ב-C/C++ שמשמשות להטמעת ממשקי Java. זה מועיל כי הוא תופס את הזיכרון בזמן שהן מתרחשות, ומפנים אתכם ישירות לקוד האחראי.
ניתן ליצור Flash תמונות HWASan מוכנות מראש למכשירי Pixel נתמכים מתוך ci.android.com (הוראות הגדרה מפורטות).
בהשוואה לאלן הקלאסי, יש ל-HWASan:
- תקורה דומה של המעבד (CPU) (כ-2x)
- תקורה של גודל קוד דומה (40-50%)
- תקורה קטנה בהרבה של RAM (10%-35%)
HWASan מזהה את אותה קבוצת באגים כמו ASan:
- גלישת נתונים/מאגר נתונים זמני של ערימה וערימה
- שימוש בערימה אחרי בחינם
- שימוש במקבץ מחוץ להיקף
- מיטה זוגית חופשיה/חינמית
בנוסף, HWASan מזהה שימוש בסטאק אחרי החזרה.
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.
אם עובדים עם ליבה (kernel) אחרת, HWASan דורש שהליבה של Linux תקבל גישה להפניות מתויגות ארגומנטים של קריאות מערכת. תמיכה בכך יושמה במערכי התיקונים הבאים ב-upstream:
- ABI של כתובת מתויגת של Arm64
- arm64: ביטול תיוג של מצביעי משתמש שמועברים לליבה
- mm: נמנעים מיצירה של כתובות וירטואליות חלופיות ב-brk()/mmap()/mremap()
- arm64: אימות כתובות מתויגות ב-access_ok() שנקראות משרשורי ליבה
אם אתם מפתחים באמצעות 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 מצטברות פועלות באופן עצמאי.
- אין צורך להריץ את נתוני המשתמש ב-Flash.
חלק מההגבלות של AddressSanitizer נעלמו גם הן:
- יש תמיכה בקובצי הפעלה סטטיים.
- מותר לוותר על חיטוי עבור כל יעד מלבד libc. בניגוד ל-ASan, אין דרישה שאם ספרייה עוברת חיטוי, היא חייבת להיות גם קובץ הפעלה שמקשר אליה.
ניתן לעבור בין HWASan לתמונות רגילות באותו מספר 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.
תחנת הבזק
למטרות פיתוח, ניתן לשדרג למכשיר Pixel גרסת AOSP שתואמת ל-HWASan עם תוכנת אתחול לא נעולה באמצעות Flashstation. בוחרים את היעד _hwasan, למשל: aosp_flame_hwasan-userdebug. לצפייה מסמכי תיעוד של NDK עבור HWASan למפתחים של אפליקציות, לקבלת פרטים נוספים.
דוחות קריסות טובים יותר
HWASan משתמש בתוכנת Unwinder מהירה שמבוססת על פריים כדי להקליט סטאק
לעקוב אחרי כל אירוע של הקצאת זיכרון ומיקום עסקה
בתוכנית. ב-Android, הסמן של משתמשים למסגרות מופעל בקוד AArch64 כברירת מחדל,
אז זה עובד מצוין בפועל. אם אתם צריכים להירגע
קוד מנוהל, הגדרה של HWASAN_OPTIONS=fast_unwind_on_malloc=0
בסביבת התהליך. שימו לב שמקבץ גישה לא טוב לזיכרון
עקבות משתמשים באופרטור "איטי" לבטל הרצה כברירת מחדל; ההגדרה הזו משפיעה רק על
מעקב אחרי הקצאה ו-Deallocation. האפשרות הזאת יכולה להיות
עתיר מעבד (CPU), בהתאם לעומס.
ייצוג
ראו סיבולזציה במאמר "הסבר על דוחות HWASan".
HWASan באפליקציות
בדומה ל- AddressSanitizer, ל-HWASan לא יכולה להיות גישה לקוד Java, אבל הוא יכול לזהות באגים בספריות ה-JNI. עד גרסה Android 14, ב-HWASan פועל HWASan במכשיר שאינו HWASan לא הייתה תמיכה באפליקציות.
במכשיר HWASan, אפשר לבדוק אפליקציות באמצעות HWASan על ידי פיתוח של
קוד עם SANITIZE_TARGET:=hwaddress
אינץ'
יצרן או -fsanitize=hwaddress
בדגלי מהדר.
במכשיר שאינו HWASan (עם Android מגרסה 14 ואילך), הגדרה של קובץ wrap.sh
צריך להוסיף את LD_HWASAN=1
.
לצפייה
תיעוד למפתחי אפליקציות
אפשר לקבל פרטים נוספים.