Android 11'den itibaren, 64 bit işlemler için tüm yığın tahsislerinde, ARM Üst Bayt Yoksayma (TBI) için çekirdek desteği olan cihazlarda işaretçinin üst baytında uygulama tanımlı bir etiket bulunur. Bu etiket, tahsis iptal edilirken kontrol edildiğinde, etiketi değiştiren tüm uygulamalar sonlandırılır. Bu, gelecekte ARM Bellek Etiketleme Uzantısı (MTE) desteğine sahip donanımlar için gereklidir.
Üst bayt yoksayma
ARM'ın Üst Bayt Yoksayma özelliği, tüm Armv8 AArch64 donanımlarında 64 bit kod için kullanılabilir. Bu özellik, donanımın belleğe erişirken işaretçinin üst baytını yoksayması 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 sonraki sürümlerdeki Android Ortak Çekirdekleri, gerekli TBI yamalarını içerir.
Çekirdekte TBI desteği olan cihazlar, işlem başlangıç zamanında dinamik olarak algılanır ve tüm yığın ayırma işlemleri için işaretçinin en üst baytına uygulamaya bağlı bir etiket eklenir. Ardından, bellek tahsisi kaldırıldığında etiketin kısaltılmadığından emin olmak için bir kontrol çalıştırılır.
Bellek Etiketleme Uzantısı'na hazırlık
ARM'ın Bellek Etiketleme Uzantısı (MTE), bellekle ilgili güvenlik sorunlarının giderilmesine yardımcı olur. MTE, yığın, yığın alanı ve genel alanlarda her bellek ayırma işleminin 56. ila 59. adres bitlerini etiketleyerek çalışır. Donanım ve talimat seti, her bellek erişiminde doğru etiketin kullanılıp kullanılmadığını otomatik olarak kontrol eder.
İşaretçinin üst baytında yanlış bilgi depolayan Android uygulamalarının MTE özellikli bir cihazda çalışmaması garanti edilir. Etiketli işaretçiler, MTE cihazları kullanıma sunulmadan önce işaretçinin üst baytının yanlış kullanımını tespit edip reddetmeyi kolaylaştırır.
Geliştirici desteği
Uygulamanız kilitlendiyse ve bu bağlantıyı gördüyseniz aşağıdakilerden biri söz konusu olabilir:
- Uygulama, sistemin yığın ayırıcısı tarafından ayrılmayan bir işaretçiyi serbest bırakmaya çalıştı.
- Uygulamanızdaki bir şey, işaretçinin üst baytını değiştirdi. İşaretçinin üst baytı değiştirilemez. Bu sorunu düzeltmek için kodunuzun değiştirilmesi gerekir.
Üst bayt işaretçisinin yanlış kullanıldığı veya değiştirildiği örnekler.
- Belirli bir türe ait işaretçiler, ilk 16 adres bitinde uygulamaya özgü meta verilere sahiptir.
- Bir işaretçi, çifte ve ardından geriye doğru yayınlandığında alt adres bitleri kaybedilir.
- Yinelemenin derinliğini ölçmek için farklı yığın çerçevelerindeki 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ın hızlı bir şekilde düzeltilmesinin kolay olmayabileceğinin farkındayız. Bu nedenle, targetSdkLevel < 30
kullanan uygulamalarda işaretçi etiketleme varsayılan olarak etkin değildir. Geçiş dönemini kolaylaştırmak için targetSdkLevel >= 30
ile oluşturulan uygulamalar için bir kaçış kapısı da sağlıyoruz.
Acil durum çıkışı, AndroidManifest.xml
dosyanıza aşağıdakiler eklenerek kullanılır:
<application android:allowNativeHeapPointerTagging="false"> ... </application>
Bu işlem, uygulamanız için İşaretçi Etiketleme özelliğini devre dışı bırakır. Bu işlem, altta yatan kod sağlığı sorununu çözüme ulaştırmaz. Bu tür sorunlar MTE ile uyumlu olmayacağı için bu çıkış yolu Android'in gelecekteki sürümlerinde kaldırılacaktır.