מצוין מתויג

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

התעלמות מהטופ בייט

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

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

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

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

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

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

תמיכה למפתחים

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

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

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

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

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

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

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

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