מערכת 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, הם כלים לצמצום נזקים שמתאימים לשימוש בסביבת הייצור. אלה שתי טכנולוגיות נפרדות, אבל הן נשלטות על ידי אותו דגל של המהדר, ולכן הן תמיד משמשות יחד.
התכונות האלה תואמות לאחור למכשירים שלא תומכים בהן, כי ההוראות החדשות הן no-ops במכשירים קודמים. בנוסף, צריך ליצור ליבה חדשה מספיק וגרסה חדשה מספיק של מערכת ההפעלה.
חיפוש הערכים paca
ו-bti
בקובץ /proc/cpuinfo
מאפשר לכם לבדוק אם החומרה והליבה שלכם עדכניים מספיק. ב-Android 12 (API 31) יש את התמיכה הנדרשת במרחב המשתמש.
יתרונות:
- אפשר להפעיל את התכונה בכל גרסאות ה-build בלי לגרום לבעיות במכשירים ישנים או בליבות ישנות (אבל חשוב לוודא שבדקתם את התכונה בשילוב של מכשיר/ליבה/מערכת הפעלה שכן תומכים בה!).
חסרונות:
- האפשרות זמינה רק לאפליקציות של 64 סיביות
- לא מצמצמת שגיאות במכשירים שלא תומכים בה
- 1% יתרת קוד
GWP-Asan
אפשר להשתמש ב-GWP-ASan כדי לזהות שגיאות זיכרון בשדה, אבל קצב הדגימה נמוך מדי כדי לספק הקלה יעילה.
יתרונות:
- ללא תקורה משמעותית של מעבד (CPU) או זיכרון
- קל לפרוס: לא נדרש בנייה מחדש של קוד מקורי
- מתאים לאפליקציות 32-bit
חסרונות:
- כדי למצוא באגים ביעילות, צריך שיהיה שיעור דגימה נמוך עם מספר גדול של משתמשים
- זיהוי שגיאות ב-heap בלבד, לא שגיאות ב-stack
HWASan
Hardware address sanitizer (כלי לניקוי כתובות בחומרה), שנקרא גם HWASan, הוא הכלי המתאים ביותר לזיהוי שגיאות זיכרון במהלך הבדיקה. הכלי שימושי במיוחד כשמשתמשים בו בבדיקות אוטומטיות, במיוחד אם אתם מריצים בדיקות fuzz, אבל בהתאם לצרכים של האפליקציה שלכם, יכול להיות שתוכלו להשתמש בו גם בטלפונים מתקדמים בהגדרה של dogfood.
יתרונות:
- אין תוצאות חיוביות כוזבות
- זיהוי של סוגים נוספים של שגיאות ש-ASan לא יכול לזהות (שימוש ב-stack אחרי חזרה)
- שיעור נמוך יותר של תוצאות שליליות שגויות בהשוואה ל-MTE (1 ל-256 לעומת 1 ל-16)
- תקורה נמוכה יותר של זיכרון בהשוואה ל-ASan, החלופה הקרובה ביותר
חסרונות:
- עלות משמעותית של מעבד (CPU) (~100%), קוד (~50%) וזיכרון (10% עד 35%)
- עד API 34 ו-NDK r26, צריך להציג קובץ אימג' תואם ל-HWASan
- התכונה פועלת רק באפליקציות של 64 ביט
MTE
תוסף תיוג זיכרון, שנקרא גם MTE, הוא חלופה בעלות נמוכה יותר ל-HWASan. בנוסף ליכולות של ניפוי באגים ובדיקות, אפשר להשתמש בו כדי לזהות ולצמצם פגיעה בזיכרון בסביבת הייצור. אם יש לכם חומרה לבדיקה של גרסאות build של MTE, כדאי להפעיל אותה.
יתרונות:
- עלות תפעול נמוכה מספיק כדי לאפשר שימוש באפליקציות רבות בסביבת הייצור
- אין תוצאות חיוביות כוזבות
- לא נדרש לבנות מחדש את הקוד כדי לזהות שגיאות בערימה (אבל כן כדי לזהות שגיאות בסטאק)
חסרונות:
- בשנת 2024 לא יהיו מכשירי MTE זמינים מסחרית שמופעלת בהם MTE כברירת מחדל, אבל במסמכי העזרה של Arm מוסבר איך מפעילים את MTE לצורך בדיקה ב-Pixel 8 או ב-Pixel 8 Pro.
- שיעור תוצאות שליליות שגויות של 1 ל-16 לעומת 1 ל-256 ב-HWASan
- האפשרות זמינה רק לאפליקציות של 64 סיביות
- צריך ליצור ספריות נפרדות לטירגוט למכשירים שתומכים ב-MTE ולמכשירים שלא תומכים ב-MTE
ASan
ניקוי כתובות, שנקרא גם ASan, הוא הכלי הישן ביותר והזמין ביותר. הוא שימושי לזיהוי שגיאות זיכרון במהלך בדיקה ולפתרון בעיות ניפוי באגים שמשפיעות רק על מכשירים ישנים שבהם אף אחד מהכלים האחרים לא זמין. כשאפשר, כדאי להעדיף את HWASan.
יתרונות:
- זמין במקומות רבים. יכול להיות שהאפליקציה תפעל במכשירים ישנים כמו KitKat
- אין תוצאות חיוביות או שליליות מטעות כשמשתמשים בהם בצורה נכונה
חסרונות:
- קשה לבנות ולארז בצורה נכונה
- תקורת העלויות הגבוהה ביותר מבין כל האפשרויות: כ-100% מעבד, כ-50% מגודל הקוד, כ-100% שימוש בזיכרון
- אין יותר תמיכה
- יש בה באגים ידועים שלא יתוקנו