אפשר להפעיל את MTE בנפרד בליבה של Android ובכל תהליך במערכת Android. Google לא מחייבת הגדרה ספציפית כלשהי, ומטרתה לספק גמישות מקסימלית למפתחי המכשירים.
במסמך הזה מתוארים ההגדרות וההיקף של MTE, שלדעתנו מספקים פשרה טובה בין אבטחה לעלויות למשתמשים ב-Android, ככלי למניעת נקודות חולשה שפועל תמיד.
בועה
ההגדרה של MTE בליבה מתבצעת דרך שורת הפקודה. ברירת המחדל היא מצב מופעל במצב סנכרון. הדבר עשוי להשתנות בעתיד מכמה סיבות:
- הוכח שהיא משפיעה באופן משמעותי על הביצועים, ויש צורך לבצע אופטימיזציה שלה.
- איכות הקוד של הליבה נחשבת ללא מספיקה כדי לשלוח MTE במצב האכיפה (כלומר, מצב של חרדה כשיש כשל).
ההמלצה הנוכחית היא להשבית את MTE של הליבה במכשירים בסביבת הייצור. כדי לעשות זאת, מוסיפים את kasan=off
לשורת הפקודה של הליבה.
מרחב הפעולה של המשתמש
Google מספקת רשימת ברירת מחדל של קובצי בינארי במרחב המשתמש שצריך להגן עליהם באמצעות MTE. הרשימה נוצרה על סמך הקלט מ-Android Security, והיא כוללת רכיבים שיש להם הרשאות ו/או מטפלים בקלט לא מהימן. רשימה עדכנית של קבצים בינאריים מקומיים מומלצים לשימוש עם MTE מופיעה בקובץ memtag-common.mk במערכת ה-build של Android. בנוסף, נכללות גם כמה אפליקציות מערכת: נכון לעכשיו, Nfc, Bluetooth ו-SecureElement. כברירת מחדל, האפליקציות והקבצים הבינאריים האלה מופעלים במצב אסינכררוני.
ההמלצה הנוכחית היא להשתמש ברשימת היעד שמוגדרת כברירת מחדל (אין צורך לבצע שינויים). בנוסף, מומלץ להעריך את התוספים של BSP ו-OEM למערכת הליבה ולהפעיל את MTE באלה שקשורים לאבטחה.
אפליקציות
שלוש אפליקציות המערכת שצוינו למעלה הן היחידות שמשתמשות כרגע ב-MTE. כדי שאפליקציה של צד שלישי תוכל להפעיל את MTE, צריך לציין ב-AndroidManifest.xml
את הערך android:memtagMode
עם ערך שונה מ-off
. לכן, חבילות של מדדי ביצועים נפוצים כמו Geekbench או AnTuTu לא פועלות עם MTE. אם גם MTE של הליבה מושבת (ראו kasan=off
למעלה), ההשפעה על הביצועים במדדי השוואה אמורה להיות מוגבלת מאוד, אם בכלל.
לגבי האפליקציות האחרות, מתבצע פיתוח פעיל של תמיכה ב-MTE ב-Chrome. הגרסה הנוכחית של Chrome בחנות Play כוללת את ההגדרה memtagMode=async
במניפסט. אנחנו גם צופים שבסופו של דבר מספר אפליקציות שמתמקדות באבטחה בסביבת Android (למשל, אפליקציות בנקאיות) יעשו את אותו הדבר. לעומת זאת, אנחנו צופים שבאפליקציות מסוימות שדורשות ביצועי מעבד שיא, כמו משחקים, יבחרו להשאיר את MTE מושבת.
מצבים אחרים
ההוראות שלמעלה משתמשות רק במצב MTE אסינכרוני בכל מקום. בהתאם לחומרה, יכול להיות שמצבים אחרים יהיו מהירים כמעט באותה מידה, או בדיוק באותה מידה. הם גם מספקים אבחון טוב יותר ומאפיינים חזקים יותר למזעור נקודות חולשה.
מומלץ לבדוק הגדרה אחת או שתיים נוספות כדי לראות אם הן מתאימות לדרישות הביצועים או לצריכת החשמל שלכם. אפשר להגדיר את המצבים של MTE לכל ליבה של מעבד ה-CPU במערכת על ידי כתיבת /sys/devices/system/cpu/cpu*/mte_tcf_preferred
. לדוגמה, כתיבת sync
(או asymm
) תגרום לשדרוג אוטומטי של כל תהליך במרחב המשתמש שביקש מצב Async למצב Sync (או Asymm) בזמן שהוא פועל בליבה הזו. אפשר לבצע את ההגדרה הזו בקובץ .rc בזמן האתחול של המכשיר.
מומלץ למדוד הגדרות נוספות אחת או שתיים כדי לבדוק אם הן עומדות בדרישות הביצועים והעוצמה שלכם. כמה הגדרות מעניינות שאפשר לבדוק:
- Asymm בכל הליבות.
- Asymm בליבות גדולות, Sync בליבות אחרות.
כדי לוודא שתהליך מסוים מבקש מצב Async (עם שדרוג אוטומטי אפשרי), צריך לבדוק שהשורה הבאה כוללת גם את PR_MTE_TCF_SYNC וגם את PR_MTE_TCF_ASYNC:
debuggerd <PID> | head -30 | grep tagged_addr
לצערנו, אין דרך קלה לראות את המצב היעיל של תהליך כלשהו, אבל כל תהליך שמוצגים בו שני הערכים שצוינו למעלה כפוף להתנהגות השדרוג האוטומטי.