از اندروید 11 شروع میشود، برای فرآیندهای 64 بیتی، همه تخصیصهای پشته دارای یک تگ تعریفشده پیادهسازی هستند که در بایت بالای اشارهگر روی دستگاههایی با پشتیبانی هسته از ARM Top-byte Ignore (TBI) تنظیم شده است. هر برنامهای که این تگ را تغییر میدهد، زمانی که تگ در حین توزیع بررسی شود، خاتمه مییابد. این برای سخت افزار آینده با پشتیبانی از ARM Memory Tagging Extension (MTE) ضروری است.
بایت بالا نادیده گرفته شود
ویژگی Top-byte Ignore ARM برای کدهای 64 بیتی در تمام سخت افزار Armv8 AArch64 موجود است. این ویژگی به این معنی است که سخت افزار هنگام دسترسی به حافظه، بایت بالایی یک اشاره گر را نادیده می گیرد.
TBI به یکهسته سازگار نیاز دارد که به درستی نشانگرهای برچسب گذاری شده را که از فضای کاربر ارسال می شود، مدیریت کند. هستههای مشترک Android نسخه 4.14 (Pixel 4) و بالاتر دارای وصلههای TBI مورد نیاز هستند.
دستگاه هایی با پشتیبانی TBI در هسته به صورت پویا در زمان شروع فرآیند شناسایی می شوند و یک برچسب وابسته به پیاده سازی در بایت بالای اشاره گر برای همه تخصیص های پشته درج می شود. پس از این، یک بررسی انجام می شود تا اطمینان حاصل شود که برچسب در هنگام انتقال حافظه کوتاه نشده است.
آمادگی افزونه برچسب گذاری حافظه
افزونه برچسب گذاری حافظه ARM (MTE) به رفع مشکلات ایمنی حافظه کمک می کند. MTE با برچسب گذاری بیت های آدرس 56-59 هر تخصیص حافظه در پشته، heap و globals کار می کند. سخت افزار و مجموعه دستورالعمل به طور خودکار بررسی می کند که برچسب صحیح در هر دسترسی به حافظه استفاده شود.
برنامههای Android که اطلاعات را به اشتباه در بایت بالای نشانگر ذخیره میکنند ، در دستگاههای دارای MTE تضمین میشوند. نشانگرهای برچسب گذاری شده تشخیص و رد استفاده نادرست از بایت بالای نشانگر را قبل از در دسترس بودن دستگاه های MTE آسان تر می کند.
پشتیبانی از توسعه دهندگان
اگر برنامه شما خراب شد و این پیوند از شما خواسته شد، ممکن است به معنای یکی از موارد زیر باشد:
- برنامه سعی کرد نشانگری را آزاد کند که توسط تخصیص دهنده هیپ سیستم تخصیص داده نشده بود.
- چیزی در برنامه شما بایت بالای نشانگر را تغییر داده است. بایت بالای نشانگر قابل تغییر نیست و برای رفع این مشکل کد شما باید تغییر کند.
نمونه هایی از نشانگر بایت بالا که اشتباه استفاده یا اصلاح شده است.
- اشارهگرها به یک نوع خاص دارای ابردادههای خاص برنامه هستند که در 16 بیت آدرس بالا ذخیره میشوند.
- یک نشانگر برای دوبرابر کردن و سپس برگشتن، از دست دادن بیت های آدرس پایینی استفاده می شود.
- محاسبه کد تفاوت بین آدرسهای متغیرهای محلی از فریمهای پشتهای مختلف به عنوان راهی برای اندازهگیری عمق بازگشت.
برخی از برنامهها ممکن است به کتابخانههایی بستگی داشته باشند که وقتی بایت بالای اشارهگر تنظیم میشود، رفتار نادرست دارند. ما می دانیم که رفع سریع این مشکلات اساسی در کتابخانه ها ممکن است بی اهمیت باشد. به این ترتیب، برنامههایی که از targetSdkLevel < 30
استفاده میکنند، بهطور پیشفرض، برچسبگذاری اشارهگر را فعال نخواهند کرد. ما همچنین یک دریچه فرار برای برنامه های ساخته شده با targetSdkLevel >= 30
ارائه می کنیم تا دوره انتقال را تسهیل کنیم.
دریچه فرار با افزودن موارد زیر به فایل AndroidManifest.xml
شما استفاده می شود:
<application android:allowNativeHeapPointerTagging="false"> ... </application>
با این کار ویژگی Pointer Tagging برای برنامه شما غیرفعال می شود. لطفاً توجه داشته باشید که این مشکل سلامت کد اساسی را برطرف نمی کند. این دریچه فرار در نسخههای آینده اندروید ناپدید میشود، زیرا مسائلی از این دست با MTE ناسازگار خواهند بود.