מתויג מצביעים

החל באנדרואיד 11, עבור תהליכים של 64 סיביות, לכל הקצאות הערימה יש תג מוגדר יישום המוגדר בבייט העליון של המצביע במכשירים עם תמיכה בליבה ב-ARM Top-byte Ignore (TBI). כל יישום שמשנה תג זה נסגר כאשר התג נבדק במהלך ביטול ההקצאה. זה הכרחי עבור חומרה עתידית עם תמיכת ARM Memory Tagging Extension (MTE).

התעלם מהבית העליון

תכונת ההתעלמות של Top-byte של ARM זמינה עבור קוד 64 סיביות בכל החומרה של Armv8 AArch64. מאפיין זה אומר שהחומרה מתעלמת מהבייט העליון של מצביע בעת גישה לזיכרון.

TBI דורש ליבה תואמת המטפלת בצורה נכונה במצביעים מתויגים המועברים ממרחב המשתמש. גרעיני Android Common מגרסה 4.14 (Pixel 4) ומעלה כוללים את תיקוני ה-TBI הנדרשים.

התקנים עם תמיכת TBI בליבה מזוהים באופן דינמי בזמן תחילת התהליך ותג תלוי יישום מוכנס לבייט העליון של המצביע עבור כל הקצאות הערימה. לאחר מכן, מתבצעת בדיקה כדי לוודא שהתג לא נחתך בעת ביטול הקצאת הזיכרון.

מוכנות לתיוג זיכרון

הרחבת תיוג זיכרון (MTE) של ARM עוזרת לטפל בבעיות בטיחות בזיכרון. MTE פועל על ידי תיוג סיביות הכתובות ה-56-59 של כל הקצאת זיכרון בערימה, הערימה והגלובלים. ערכת החומרה וההוראות בודקת אוטומטית שהשימוש בתג הנכון בכל גישה לזיכרון.

אפליקציות אנדרואיד המאחסנות מידע באופן שגוי בבייט העליון של המצביע מובטחות להישבר במכשיר התומך ב-MTE . מצביעים מתויגים מקלים על זיהוי ולדחייה של שימושים שגויים בבייט העליון של המצביע לפני שמכשירי MTE זמינים.

תמיכת מפתחים

אם האפליקציה שלך קרסה והתבקשת להזין את הקישור הזה, זה יכול להיות אחד מהדברים הבאים:

  1. האפליקציה ניסתה לשחרר מצביע שלא הוקצה על ידי מקצה הערימות של המערכת.
  2. משהו באפליקציה שלך שינה את הבית העליון של מצביע. לא ניתן לשנות את הבית העליון של המצביע ויש לשנות את הקוד שלך כדי לפתור בעיה זו.

דוגמאות של מצביע הבתים העליון בשימוש שגוי או שינוי.

  • למצביעים לסוג מסוים יש מטא נתונים ספציפיים ליישום המאוחסנים ב-16 סיביות הכתובות המובילות.
  • מצביע מטיל להכפל ואז אחורה, ומאבד את סיביות הכתובת התחתונות.
  • קוד מחשוב את ההבדל בין הכתובות של משתנים מקומיים ממסגרות מחסניות שונות כדרך למדידת עומק רקורסיה.

יישומים מסוימים עשויים להיות תלויים בספריות שמתנהגות בצורה לא נכונה כאשר הבת העליון של המצביע מוגדר. אנו מכירים בכך שזה עשוי להיות לא טריוויאלי לתקן את הבעיות הבסיסיות הללו בספריות במהירות. ככזה, ליישומים המשתמשים targetSdkLevel < 30 לא תהיה תיוג מצביע מופעל כברירת מחדל. אנו מספקים גם פתח מילוט עבור יישומים שנבנו עם targetSdkLevel >= 30 כדי להקל על תקופת המעבר.

פתח המילוט משמש על ידי הוספת הפריטים הבאים לקובץ AndroidManifest.xml שלך:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

פעולה זו תשבית את תכונת תיוג המצביע עבור היישום שלך. שים לב שזה לא מטפל בבעיית בריאות הקוד הבסיסית. פתח המילוט הזה ייעלם בגרסאות עתידיות של אנדרואיד, מכיוון שבעיות מסוג זה לא יהיו תואמות ל- MTE .