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 gelecekteki donanım için gerekli olan ARM Hafıza Etiketleme Extension (MTE) desteği.

Üst bayt Yoksay

ARM'nin Top-byte Ignore ö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 bir işaretçinin üst baytını yok saydığı anlamına gelir.

TBI bir gerektiriyoruyumlu çekirdek doğru kolları işaretçileri userspace geçirilen etiketlediğinizi. Android Ortak 4.14 den içleri (Piksel 4) ve daha yüksek özellik gerekli TBI yamalar .

Ç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ın ve genel ya her bir bellek tahsis 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.

Yanlış pointer üst byte bilgiyi depolamak Android uygulamaları bir MTE özellikli cihazda kırmak için 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 döndü.
  • Ö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. Bunun gibi, kullandığınız uygulamaları targetSdkLevel < 30 işaretçi etiketleme olmaz varsayılan olarak etkin. Biz de birlikte inşa uygulamalar için bir kaçış yolunu sağlamak targetSdkLevel >= 30 geçiş dönemi hafifletmek için.

Kaçış yolun senin için aşağıdakileri ekleyerek kullanılır AndroidManifest.xml dosyası:

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

Bu, uygulamanız için İşaretçi Etiketleme özelliğini devre dışı bırakacaktır. Not Bu altta yatan kod sağlık sorunu çözmek almadığını lütfen söyledi. Bu yapıdaki sorunlar ile uyumsuz olacak çünkü bu kaçış yolun, Android'in gelecekteki sürümlerinde kaybolur MTE .