מערכת Android תומכת בכמה כלים לניפוי באגים של שגיאות זיכרון. לכל אחת מהאפשרויות יש יתרונות וחסרונות, ולכן כדאי לקרוא את ההסבר שבהמשך כדי להחליט איזו אפשרות הכי מתאימה לתרחיש השימוש שלכם. במסמך הזה מופיע סקירה כללית של הכלים הזמינים, כדי שתוכלו להחליט אילו כלים כדאי לבדוק לעומק. עם זאת, המידע כאן הוא תמציתי, ולכן כדאי לקרוא את המסמכים הספציפיים לכל כלי כדי לקבל פרטים נוספים.
אמל"ק
- כדאי להשתמש בשפה בטוחה לזיכרון כשאפשר, כדי למנוע שגיאות זיכרון
- תמיד יש להשתמש ב-PAC/BTI כדי לצמצם את הסיכון להתקפות ROP/JOP
- תמיד להשתמש ב-GWP-ASan כדי לזהות שגיאות זיכרון נדירות בסביבת ייצור
- שימוש ב-HWASan כדי לזהות שגיאות זיכרון במהלך הבדיקה
- MTE זמין כאפשרות במכשירים נבחרים.
- שימוש ב-ASan במהלך בדיקות רק כמוצא אחרון
שפות בטוחות בזיכרון
הדרך היחידה להימנע לחלוטין משגיאות בזיכרון ולצמצם אותן היא להשתמש בשפה שמאפשרת ניהול זיכרון בטוח. הכלים האחרים בדף הזה יכולים לעזור לכם להפוך את הקוד שאינו בטוח לזיכרון לבטוח ואמין יותר, אבל שימוש בשפה בטוחה לזיכרון מבטל את כל סוג הבעיות.
השפות הבטוחות לזיכרון שנתמכות רשמית ב-Android הן Java ו-Kotlin. קל יותר לפתח את רוב האפליקציות ל-Android באחת מהשפות האלה.
עם זאת, יש מפתחי אפליקציות ששולחים קוד שנכתב ב-Rust, ואם אתם קוראים את הדף הזה, כנראה שיש לכם סיבה טובה להזדקק לקוד מקורי (ניידות, ביצועים או שניהם). Rust היא הבחירה הטובה ביותר לקוד מקורי בטוח לזיכרון ב-Android. אם תבחרו בדרך הזו, יכול להיות שצוות NDK לא יוכל לעזור לכם בבעיות שתיתקלו בהן, אבל נשמח לשמוע עליהן.
PAC/BTI
Pointer Authentication and Branch Target Identification, שנקראים גם PAC/BTI, הם כלים להפחתת סיכונים שמתאימים לשימוש בסביבת ייצור. אלה טכנולוגיות נפרדות, אבל הן נשלטות על ידי אותו דגל קומפילציה, ולכן הן תמיד בשימוש ביחד.
התכונות האלה תואמות לאחור למכשירים שלא תומכים בהן, כי ההוראות החדשות שבהן נעשה שימוש הן פעולות ללא השפעה במכשירים קודמים. בנוסף, צריך לוודא שיש לכם גרסה עדכנית מספיק של ליבת מערכת ההפעלה ושל מערכת ההפעלה עצמה.
חיפוש של paca
ושל bti
ב-/proc/cpuinfo
יראה לכם אם יש לכם חומרה וליבה חדשות מספיק. Android 12 (API 31) כולל את התמיכה הנדרשת במרחב המשתמש.
יתרונות:
- אפשר להפעיל את התכונה בכל הגרסאות בלי לגרום לבעיות במכשירים או בקרנלים ישנים יותר (אבל חשוב לוודא שבדקתם בפועל ששילוב של מכשיר, קרנל ומערכת הפעלה תומך בתכונה!).
חסרונות:
- האפשרות זמינה רק לאפליקציות של 64 ביט
- לא מצמצם שגיאות במכשירים שלא תומכים בו
- 1% code size overhead
GWP-Asan
אפשר להשתמש ב-GWP-ASan כדי לזהות שגיאות זיכרון בשדה, אבל קצב הדגימה נמוך מדי כדי שיהיה יעיל.
יתרונות:
- אין תקורה משמעותית של מעבד (CPU) או זיכרון
- קל להטמעה: לא נדרשת בנייה מחדש של קוד מקורי
- פועל באפליקציות 32 ביט
חסרונות:
- שיעור דגימה נמוך מחייב מספר גדול של משתמשים כדי למצוא באגים בצורה יעילה
- מזהה רק שגיאות ב-heap, לא שגיאות ב-stack
HWASan
Hardware address sanitizer, שנקרא גם HWASan, הוא הכלי הכי מתאים לזיהוי שגיאות זיכרון במהלך בדיקות. השימוש בה הכי יעיל כשמשתמשים בה עם בדיקות אוטומטיות, במיוחד אם מריצים בדיקות fuzzing, אבל בהתאם לצרכים של ביצועי האפליקציה, יכול להיות שאפשר להשתמש בה גם בטלפונים מתקדמים בהגדרת dogfood.
יתרונות:
- אין תוצאות חיוביות שגויות
- מזהה סוגים נוספים של שגיאות ש-ASan לא יכול לזהות (שימוש במחסנית אחרי החזרה)
- שיעור נמוך יותר של תוצאות שליליות שגויות בהשוואה ל-MTE (1 מתוך 256 לעומת 1 מתוך 16)
- תקורה נמוכה יותר של זיכרון בהשוואה ל-ASan, החלופה הקרובה ביותר
חסרונות:
- תקורה משמעותית של מעבד (CPU) (בערך 100%), גודל קוד (בערך 50%) וזיכרון (10% עד 35%)
- עד API 34 ו-NDK r26, נדרש צריבת תמונה שתואמת ל-HWASan
- פועל רק באפליקציות של 64 ביט
MTE
תוסף תיוג הזיכרון, שנקרא גם MTE, הוא חלופה זולה יותר ל-HWASan. בנוסף ליכולות ניפוי הבאגים והבדיקה, אפשר להשתמש בו כדי לזהות ולצמצם את השפעת השחיתות בזיכרון בסביבת הייצור. אם יש לכם חומרה לבדיקת גרסאות MTE, כדאי להפעיל אותה.
יתרונות:
- התקורה נמוכה מספיק כדי שיהיה אפשר להשתמש בה בסביבת ייצור עבור הרבה אפליקציות
- אין תוצאות חיוביות שגויות
- לא נדרש לבנות מחדש את הקוד כדי לזהות שגיאות ב-heap (אבל כן כדי לזהות שגיאות ב-stack)
חסרונות:
- אין מכשירים זמינים מסחרית עם MTE שמופעל כברירת מחדל בשנת 2024, אבל במסמכי Arm מוסבר איך להפעיל MTE לצורך בדיקה ב-Pixel 8 או ב-Pixel 8 Pro.
- שיעור השליליים הכוזבים של 1 מתוך 16 לעומת 1 מתוך 256 ב-HWASan
- האפשרות זמינה רק לאפליקציות של 64 ביט
- נדרשת בנייה של ספריות נפרדות לטירגוט מכשירים עם MTE וגם מכשירים ללא MTE
ASan
Address sanitizer, שנקרא גם ASan, הוא הכלי הכי ותיק והכי זמין מבין הכלים הקיימים. הוא שימושי לזיהוי שגיאות בזיכרון במהלך בדיקות ולניפוי באגים בבעיות שמשפיעות רק על מכשירים ישנים שבהם אף אחד מהכלים האחרים לא זמין. כשאפשר, כדאי להשתמש ב-HWASan.
יתרונות:
- זמין במקומות רבים. יכול להיות שהאפליקציה תפעל במכשירים ישנים כמו KitKat
- אם משתמשים בהם בצורה נכונה, הם לא מניבים תוצאות חיוביות או שליליות שגויות
חסרונות:
- קשה לבנות ולעטוף בצורה נכונה
- התקורה הכי גבוהה מכל האפשרויות: ~100% CPU, ~50% code size, ~100% memory use
- אין יותר תמיכה בגרסה הזו
- יש באפליקציה באגים ידועים שלא יתוקנו