Etiketli İşaretçiler

Android 11'den başlayarak, 64 bit işlemler için, tüm yığın ayırmaların, ARM Top-byte Ignore (TBI) için çekirdek desteğine sahip cihazlarda işaretçinin üst baytında ayarlanmış bir uygulama tanımlı etiketi vardır. Bu etiketi değiştiren herhangi bir uygulama, serbest bırakma sırasında etiket kontrol edildiğinde sonlandırılır. Bu, ARM Bellek Etiketleme Uzantısı (MTE) desteğine sahip gelecekteki donanımlar için gereklidir.

Üst bayt Yoksay

ARM'nin Top-byte Ignore özelliği, tüm Armv8 AArch64 donanımlarında 64-bit kod için mevcuttur. Bu özellik, donanımın belleğe erişirken bir işaretçinin üst baytını yok saydığı anlamına gelir.

TBI, kullanıcı alanından geçirilen etiketli işaretçileri doğru şekilde işleyenuyumlu bir çekirdek gerektirir. 4.14 (Pixel 4) ve sonraki sürümlerdeki Android Ortak Çekirdekleri, gerekli TBI yamalarını içerir .

Çekirdekte TBI desteğine sahip cihazlar, işlem başlangıç ​​zamanında dinamik olarak algılanır ve tüm yığın tahsisleri için işaretçinin üst baytına uygulamaya bağlı bir etiket eklenir. Bundan sonra, bellek serbest bırakılırken etiketin kesilmediğinden emin olmak için bir kontrol yapılır.

Bellek Etiketleme Uzantısı hazırlığı

ARM'nin Bellek Etiketleme Uzantısı (MTE), bellek güvenliği sorunlarının çözülmesine yardımcı olur. MTE, yığın, yığın ve küreseller üzerindeki her bellek tahsisinin 56.-59. adres bitlerini etiketleyerek çalışır. Donanım ve komut seti, her bellek erişiminde doğru etiketin kullanıldığını otomatik olarak kontrol eder.

İşaretçinin en üst baytında bilgileri hatalı bir şekilde depolayan Android uygulamalarının, MTE özellikli bir cihazda kırılması garanti edilir . Etiketli işaretçiler, MTE cihazları kullanıma sunulmadan önce işaretçinin üst baytının yanlış kullanımlarını algılamayı ve reddetmeyi kolaylaştırır.

Geliştirici desteği

Uygulamanız kilitlendiyse ve sizden bu bağlantı istendiyse, bunun anlamı aşağıdakilerden biri olabilir:

  1. Uygulama, sistemin yığın ayırıcısı tarafından ayrılmamış bir işaretçiyi serbest bırakmaya çalıştı.
  2. Uygulamanızdaki bir şey, bir işaretçinin üst baytını değiştirdi. İşaretçinin üst baytı değiştirilemez ve bu sorunu gidermek için kodunuzun değiştirilmesi gerekir.

Yanlış kullanılan veya değiştirilen üst bayt işaretçisinin örnekleri.

  • Belirli bir türe yönelik işaretçiler, ilk 16 adres bitinde depolanan uygulamaya özel meta verilere sahiptir.
  • Bir işaretçi, alt adres bitlerini kaybederek iki katına ve ardından geri gönderilir.
  • Özyineleme derinliğini ölçmenin bir yolu olarak farklı yığın çerçevelerinden yerel değişkenlerin adresleri arasındaki farkı hesaplayan kod.

Bazı uygulamalar, işaretçinin üst baytı ayarlandığında yanlış davranan kitaplıklara bağlı olabilir. Kitaplıklardaki bu temel sorunları hızlı bir şekilde düzeltmenin önemsiz olabileceğinin farkındayız. Bu nedenle, targetSdkLevel < 30 kullanan uygulamalarda işaretçi etiketleme varsayılan olarak etkinleştirilmeyecektir. Ayrıca geçiş dönemini kolaylaştırmak için targetSdkLevel >= 30 ile oluşturulmuş uygulamalar için bir kaçış kapısı da sağlıyoruz.

Kaçış taraması, AndroidManifest.xml dosyanıza aşağıdakiler eklenerek kullanılır:

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

Bu, uygulamanız için İşaretçi Etiketleme özelliğini devre dışı bırakacaktır. Lütfen bunun temeldeki kod sağlığı sorununu çözmediğini unutmayın. Bu kaçış kapısı, Android'in gelecekteki sürümlerinde kaybolacaktır, çünkü bu tür sorunlar MTE ile uyumsuz olacaktır.