نشانگرهای برچسب زده شده

با شروع اندروید 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 آسان‌تر می‌کنند.

پشتیبانی از توسعه دهندگان

اگر برنامه شما خراب شد و این پیوند از شما خواسته شد، ممکن است به معنای یکی از موارد زیر باشد:

  1. برنامه سعی کرد نشانگری را آزاد کند که توسط تخصیص دهنده هیپ سیستم تخصیص داده نشده بود.
  2. چیزی در برنامه شما بایت بالای نشانگر را تغییر داده است. بایت بالای نشانگر قابل تغییر نیست و برای رفع این مشکل کد شما باید تغییر کند.

نمونه هایی از نشانگر بایت بالا که اشتباه استفاده یا اصلاح شده است.

  • اشاره‌گرها به یک نوع خاص دارای متادیتای خاص برنامه هستند که در 16 بیت آدرس بالا ذخیره می‌شوند.
  • یک اشاره گر برای دوبرابر کردن و سپس برگشتن، از دست دادن بیت های آدرس پایینی استفاده می شود.
  • محاسبه کد تفاوت بین آدرس‌های متغیرهای محلی از فریم‌های پشته‌ای مختلف به عنوان راهی برای اندازه‌گیری عمق بازگشت.

برخی از برنامه‌ها ممکن است به کتابخانه‌هایی بستگی داشته باشند که وقتی بایت بالای اشاره‌گر تنظیم می‌شود، رفتار نادرست دارند. ما می دانیم که رفع سریع این مشکلات اساسی در کتابخانه ها ممکن است بی اهمیت باشد. به این ترتیب، برنامه‌هایی که از targetSdkLevel < 30 استفاده می‌کنند، به‌طور پیش‌فرض، برچسب‌گذاری اشاره‌گر را فعال نخواهند کرد. ما همچنین یک دریچه فرار برای برنامه های ساخته شده با targetSdkLevel >= 30 برای سهولت دوره انتقال ارائه می کنیم.

دریچه فرار با افزودن موارد زیر به فایل AndroidManifest.xml شما استفاده می شود:

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

با این کار ویژگی Pointer Tagging برای برنامه شما غیرفعال می شود. لطفاً توجه داشته باشید که این مشکل سلامت کد اساسی را برطرف نمی کند. این دریچه فرار در نسخه‌های آینده اندروید ناپدید می‌شود، زیرا مسائلی از این قبیل با MTE ناسازگار خواهند بود.