Etiketli İşaretçiler

Android 11'den başlayarak, 64 bit işlemler için tüm yığın tahsislerinde, ARM Top-byte Ignore (TBI) çekirdek desteğine sahip cihazlarda işaretçinin üst baytında ayarlanmış, uygulama tanımlı bir etiket bulunur. 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'in 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 işaretçinin üst baytını göz ardı ettiği anlamına gelir.

TBI, kullanıcı alanından iletilen etiketli işaretçileri doğru şekilde işleyen uyumlu bir çekirdek gerektirir. 4.14 (Pixel 4) ve üzeri Android Common Kernel'leri 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, belleğin konumu kaldırılırken etiketin kesilmediğinden emin olmak için bir kontrol yapılır.

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

ARM'in Bellek Etiketleme Uzantısı (MTE), bellek güvenliği sorunlarının giderilmesine yardımcı olur. MTE, yığın, yığın ve globallerdeki her bellek tahsisinin 56. ila 59. adres bitlerini etiketleyerek çalışır. Donanım ve talimat seti, her hafıza erişiminde doğru etiketin kullanıldığını otomatik olarak kontrol eder.

Bilgileri hatalı bir şekilde işaretçinin üst baytında saklayan Android uygulamalarının , MTE özellikli bir cihazda bozulması garanti edilir. Etiketli işaretçiler, MTE aygıtları kullanıma sunulmadan önce işaretçinin üst baytının yanlış kullanımlarını tespit etmeyi ve reddetmeyi kolaylaştırır.

Geliştirici desteği

Uygulamanız kilitlendiyse ve sizden bu bağlantı istendiyse bu aşağıdakilerden biri anlamına gelebilir:

  1. Uygulama, sistemin yığın ayırıcısı tarafından tahsis edilmemiş bir işaretçiyi serbest bırakmaya çalıştı.
  2. Uygulamanızdaki bir şey işaretçinin üst baytını değiştirdi. İşaretçinin üst baytı değiştirilemez ve bu sorunu düzeltmek 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 iki katına çıkıp sonra geri dönerek düşük adres bitlerini kaybeder.
  • Özyineleme derinliğini ölçmenin bir yolu olarak, farklı yığın çerçevelerindeki yerel değişkenlerin adresleri arasındaki farkı hesaplayan kod.

Bazı uygulamalar, işaretçinin üst baytı ayarlandığında hatalı davranan kitaplıklara bağlı olabilir. Kütüphanelerdeki bu temel sorunları hızlı bir şekilde çözmenin önemsiz olabileceğinin farkındayız. Bu nedenle, targetSdkLevel < 30 kullanan uygulamalarda varsayılan olarak işaretçi etiketleme etkin olmayacaktır. Geçiş sürecini kolaylaştırmak amacıyla targetSdkLevel >= 30 ile oluşturulan uygulamalar için de bir kaçış kapısı sağlıyoruz.

Kaçış kapağı, AndroidManifest.xml dosyanıza aşağıdakilerin eklenmesiyle 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 temel kod durumu sorununu gidermediğini unutmayın. Bu kaçış yolu Android'in gelecek sürümlerinde ortadan kalkacak çünkü bu tür sorunlar MTE ile uyumsuz olacaktır.