Kol Bellek Etiketleme Uzantısı

Arm v9, etiketli belleğin donanım uygulaması olan Arm Bellek Etiketleme Uzantısını (MTE) sunar.

Yüksek düzeyde, MTE her bellek ayırmayı/yer ayırmayı ek meta verilerle etiketler. Bir bellek konumuna bir etiket atar ve bu etiket daha sonra o bellek konumuna referans veren işaretçilerle ilişkilendirilebilir. Çalışma zamanında CPU, işaretçinin ve meta veri etiketlerinin her yükleme ve depolamada eşleşip eşleşmediğini kontrol eder.

Android 12'de çekirdek ve kullanıcı alanı yığın bellek ayırıcısı, her ayırmayı meta verilerle artırabilir. Bu, kod tabanlarımızdaki bellek güvenliği hatalarının en yaygın kaynağı olan serbest kullanımdan sonra kullanım ve arabellek taşması hatalarının tespit edilmesine yardımcı olur.

MTE çalışma modları

MTE'nin üç çalışma modu vardır:

  • Senkron mod (SYNC)
  • Asenkron mod (ASYNC)
  • Asimetrik mod (ASYMM)

Senkron mod (SYNC)

Bu mod, performans üzerinden hata tespitinin doğruluğu için optimize edilmiştir ve daha yüksek performansın kabul edilebilir olduğu durumlarda hassas bir hata tespit aracı olarak kullanılabilir. Etkinleştirildiğinde, MTE SYNC bir güvenlik azaltıcı görevi görür. Etiket uyuşmazlığı durumunda, işlemci yürütmeyi derhal iptal eder ve SIGSEGV ( SEGV_MTESERR kodu) ve bellek erişimi ve arızalı adres hakkındaki tüm bilgileri vererek işlemi sonlandırır.

Bu modun test sırasında HWASan/KASAN'a alternatif olarak veya hedef işlemin savunmasız bir saldırı yüzeyini temsil ettiği üretimde kullanılmasını öneririz. Ek olarak, ASYNC modu bir hatanın varlığını gösterdiğinde, yürütmeyi SYNC moduna geçirmek için çalışma zamanı API'leri kullanılarak doğru bir hata raporu elde edilebilir.

SYNC modunda çalışırken, Android ayırıcı, tüm tahsisler ve tahsislerin kaldırılması için yığın izlerini kaydeder ve bunları, boş kullanımdan sonra kullanım veya arabellek taşması gibi bir bellek hatasının açıklamasını ve yığının açıklamasını içeren daha iyi hata raporları sağlamak için kullanır. İlgili hafıza olaylarının izleri. Bu tür raporlar daha bağlamsal bilgi sağlar ve hataların izlenmesini ve düzeltilmesini kolaylaştırır.

Asenkron mod (ASYNC)

Bu mod, hata raporlarının doğruluğundan ziyade performans için optimize edilmiştir ve bellek güvenliği hataları için düşük yük tespiti olarak kullanılabilir.
Etiket uyumsuzluğunda işlemci, en yakın çekirdek girişine (örneğin, bir sistem çağrısı veya zamanlayıcı kesintisi) kadar yürütmeye devam eder ve burada hatalı adresi veya bellek erişimini kaydetmeden SIGSEGV ( SEGV_MTEAERR kodu) ile işlemi sonlandırır.
Bu modun, bellek güvenliği hatalarının yoğunluğunun düşük olduğu bilinen, iyi test edilmiş kod tabanlarındaki üretimde kullanılmasını öneririz; bu, test sırasında SYNC modu kullanılarak elde edilir.

Asimetrik mod (ASYMM)

Arm v8.7-A'daki ek bir özellik olan Asimetrik MTE modu, ASYNC moduna benzer bir performansla bellek okumalarının eşzamanlı kontrolünü ve bellek yazmalarının eşzamansız kontrolünü sağlar. Çoğu durumda bu mod, ASYNC moduna göre bir iyileştirmedir ve mevcut olduğunda ASYNC yerine bu modu kullanmanızı öneririz.

Bu nedenle aşağıda açıklanan API'lerin hiçbirinde Asimetrik moddan bahsedilmemektedir. Bunun yerine işletim sistemi, Eşzamansız istendiğinde her zaman Asimetrik modu kullanacak şekilde yapılandırılabilir. Daha fazla bilgi için lütfen "CPU'ya özgü tercih edilen MTE düzeyini yapılandırma" bölümüne bakın.

Kullanıcı alanında MTE

Aşağıdaki bölümlerde MTE'nin sistem işlemleri ve uygulamaları için nasıl etkinleştirilebileceği açıklanmaktadır. Aşağıdaki seçeneklerden biri belirli bir işlem için ayarlanmadığı sürece MTE varsayılan olarak devre dışıdır ( aşağıda MTE'nin hangi bileşenler için etkinleştirildiğine bakın).

Derleme sistemini kullanarak MTE'yi etkinleştirme

Süreç çapında bir özellik olarak MTE, ana yürütülebilir dosyanın oluşturma zamanı ayarı tarafından kontrol edilir. Aşağıdaki seçenekler, bu ayarın tek tek yürütülebilir dosyalar için veya kaynak ağaçtaki tüm alt dizinler için değiştirilmesine olanak tanır. Ayar, kitaplıklarda veya yürütülebilir veya test olmayan herhangi bir hedefte yoksayılır.

1. Belirli bir proje için Android.bp MTE'yi etkinleştirme ( örnek ):

MTE Modu Ayar
Asenkron MTE
  sanitize: {
  memtag_heap: true,
  }
Senkron MTE
  sanitize: {
  memtag_heap: true,
  diag: {
  memtag_heap: true,
  },
  }

veya Android.mk'de Android.mk:

MTE Modu Ayar
Asynchronous MTE LOCAL_SANITIZE := memtag_heap
Synchronous MTE LOCAL_SANITIZE := memtag_heap
LOCAL_SANITIZE_DIAG := memtag_heap

2. Bir ürün değişkeni kullanarak kaynak ağacındaki bir alt dizinde MTE'yi etkinleştirme:

MTE modu Listeyi dahil et Listeyi hariç tut
eşzamansız PRODUCT_MEMTAG_HEAP_ASYNC_INCLUDE_PATHS MEMTAG_HEAP_ASYNC_INCLUDE_PATHS PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS MEMTAG_HEAP_EXCLUDE_PATHS
senkronizasyon PRODUCT_MEMTAG_HEAP_SYNC_INCLUDE_PATHS MEMTAG_HEAP_SYNC_INCLUDE_PATHS

veya

MTE Modu Ayar
Asenkron MTE MEMTAG_HEAP_ASYNC_INCLUDE_PATHS
Senkron MTE MEMTAG_HEAP_SYNC_INCLUDE_PATHS

veya yürütülebilir dosyanın hariç tutma yolunu belirterek:

MTE Modu Ayar
Asenkron MTE PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS MEMTAG_HEAP_EXCLUDE_PATHS
Senkron MTE

Örnek, ( PRODUCT_CFI_INCLUDE_PATHS ile benzer kullanım)

  PRODUCT_MEMTAG_HEAP_SYNC_INCLUDE_PATHS=vendor/$(vendor)
  PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS=vendor/$(vendor)/projectA \
                                    vendor/$(vendor)/projectB

Sistem özelliklerini kullanarak MTE'yi etkinleştirme

Yukarıdaki derleme ayarları, çalışma zamanında aşağıdaki sistem özelliği ayarlanarak geçersiz kılınabilir:

arm64.memtag.process.<basename> = (off|sync|async)

Burada basename yürütülebilir dosyanın temel adını temsil eder.

Örneğin, /system/bin/ping veya /data/local/tmp/ping eşzamansız MTE kullanacak şekilde ayarlamak için adb shell setprop arm64.memtag.process.ping async kullanın.

Bir ortam değişkeni kullanarak MTE'yi etkinleştirme

Derleme ayarını geçersiz kılmanın bir yolu da ortam değişkenini tanımlamaktır: MEMTAG_OPTIONS=(off|sync|async) Hem ortam değişkeni hem de sistem özelliği tanımlanmışsa, değişken öncelik kazanır.

Uygulamalar için MTE'yi etkinleştirme

Belirtilmemişse MTE varsayılan olarak devre dışıdır ancak MTE kullanmak isteyen uygulamalar bunu AndroidManifest.xml dosyasındaki <application> veya <process> etiketi altında android:memtagMode ayarlayarak yapabilir.

android:memtagMode=(off|default|sync|async)

<application> etiketinde ayarlandığında, bu özellik uygulama tarafından kullanılan tüm işlemleri etkiler ve <process> etiketi ayarlanarak bireysel işlemler için geçersiz kılınabilir.

Deneme amaçlı olarak, bildirimde herhangi bir değer belirtmeyen (veya default değerini belirten) bir uygulama için memtagMode özelliğinin varsayılan değerini ayarlamak amacıyla uyumluluk değişiklikleri kullanılabilir.
Bunlar genel ayarlar menüsünde System > Advanced > Developer options > App Compatibility Changes altında bulunabilir. NATIVE_MEMTAG_ASYNC veya NATIVE_MEMTAG_SYNC ayarının yapılması, belirli bir uygulama için MTE'yi etkinleştirir.
Alternatif olarak bu, am komutu kullanılarak aşağıdaki şekilde ayarlanabilir:

$ adb shell am compat enable NATIVE_MEMTAG_[A]SYNC my.app.name

MTE sistem görüntüsü oluşturma

Geliştirme ve kullanıma sunma sırasında tüm yerel ikili dosyalar üzerinde MTE'nin etkinleştirilmesini önemle öneririz. Bu, bellek güvenliği hatalarının erken tespit edilmesine yardımcı olur ve test yapılarında etkinleştirilirse gerçekçi kullanıcı kapsamı sağlar.

Geliştirme sırasında tüm yerel ikili dosyalar üzerinde MTE'nin Eşzamanlı modda etkinleştirilmesini önemle öneririz.

SANITIZE_TARGET=memtag_heap SANITIZE_TARGET_DIAG=memtag_heap m

Derleme sistemindeki herhangi bir değişkende olduğu gibi SANITIZE_TARGET bir ortam değişkeni veya make ayarı olarak kullanılabilir (örneğin, bir product.mk dosyasında).
Lütfen bunun MTE'yi tüm yerel işlemler için etkinleştirdiğini ancak yukarıdaki talimatlar izlenerek MTE'nin etkinleştirilebildiği uygulamalar ( zygote64 çatallananlar) için geçerli olmadığını unutmayın.

CPU'ya özgü tercih edilen MTE düzeyini yapılandırma

Bazı CPU'larda MTE'nin ASYMM ve hatta SYNC modlarındaki performansı ASYNC'inkine benzer olabilir. Bu, performans olumsuzlukları olmadan daha sıkı kontrollerin hata tespit avantajlarından yararlanmak amacıyla, daha az katı bir kontrol modu talep edildiğinde bu CPU'lar üzerinde daha sıkı kontrollerin etkinleştirilmesini değerli kılar.
Varsayılan olarak ASYNC modunda çalışacak şekilde yapılandırılmış işlemler tüm CPU'larda ASYNC modunda çalışacaktır. Çekirdeği bu işlemleri belirli CPU'larda SYNC modunda çalıştıracak şekilde yapılandırmak için, değer senkronizasyonunun önyükleme sırasında /sys/devices/system/cpu/cpu<N>/mte_tcf_preferred sysfs girişine yazılması gerekir. Bu bir init betiğiyle yapılabilir. Örneğin, 0-1 CPU'larını SYNC modunda ASYNC modu işlemlerini çalıştıracak şekilde ve 2-3 CPU'larını ASYMM modunda çalıştırmayı kullanacak şekilde yapılandırmak için, satıcı init betiğinin init cümlesine aşağıdakiler eklenebilir:

  write /sys/devices/system/cpu/cpu0/mte_tcf_preferred sync
  write /sys/devices/system/cpu/cpu1/mte_tcf_preferred sync
  write /sys/devices/system/cpu/cpu2/mte_tcf_preferred asymm
  write /sys/devices/system/cpu/cpu3/mte_tcf_preferred asymm

SYNC modunda çalışan ASYNC modu işlemlerinin iptal taşları, bellek hatasının konumunun kesin bir yığın izini içerecektir. Ancak, bir tahsis veya tahsisin kaldırılması yığın izlemesini içermezler. Bu yığın izlemeleri yalnızca işlem SENKRONİZASYON modunda çalışacak şekilde yapılandırılmışsa kullanılabilir.

int mallopt(M_THREAD_DISABLE_MEM_INIT, level)

level 0 veya 1'dir.
Malloc'ta bellek başlatmayı devre dışı bırakır ve doğruluk için gerekmedikçe bellek etiketlerinin değiştirilmesini önler.

int mallopt(M_MEMTAG_TUNING, level)

level nerede:

  • M_MEMTAG_TUNING_BUFFER_OVERFLOW
  • M_MEMTAG_TUNING_UAF

Etiket ayırma stratejisini seçer.

  • Varsayılan ayar M_MEMTAG_TUNING_BUFFER_OVERFLOW .
  • M_MEMTAG_TUNING_BUFFER_OVERFLOW - bitişik tahsislere farklı etiket değerleri atayarak doğrusal arabellek taşması ve yetersiz akış hatalarının deterministik tespitini sağlar. Bu modun, serbest kullanımdan sonra kullanım hatalarını tespit etme şansı biraz düşüktür çünkü her bellek konumu için olası etiket değerlerinin yalnızca yarısı mevcuttur. Lütfen MTE'nin aynı etiket parçası (16 baytlık hizalanmış yığın) içindeki taşmayı tespit edemediğini ve bu modda bile küçük taşmaları kaçırabileceğini unutmayın. Bu tür bir taşma, bellek bozulmasının nedeni olamaz çünkü bir granül içindeki bellek hiçbir zaman birden fazla ayırma için kullanılmaz.
  • M_MEMTAG_TUNING_UAF - hem uzamsal (arabellek taşması) hem de zamansal (serbest kaldıktan sonra kullanın) hataları tespit etme olasılığı ~%93 olan bağımsız olarak rastgeleleştirilmiş etiketleri etkinleştirir.

Yukarıda açıklanan API'lere ek olarak deneyimli kullanıcılar aşağıdakilerden haberdar olmak isteyebilir:

  • PSTATE.TCO donanım kaydının ayarlanması, etiket kontrolünü geçici olarak engelleyebilir ( örnek ). Örneğin, bilinmeyen etiket içeriğine sahip bir bellek aralığını kopyalarken veya sıcak döngüdeki performans darboğazını ele alırken.
  • M_HEAP_TAGGING_LEVEL_SYNC kullanıldığında, sistem kilitlenme işleyicisi tahsis ve serbest bırakma yığın izleri gibi ekstra bilgiler sağlar. Bu işlevsellik, etiket bitlerine erişim gerektirir ve sinyal işleyiciyi ayarlarken SA_EXPOSE_TAGBITS bayrağının iletilmesiyle etkinleştirilir. Kendi sinyal işleyicisini ayarlayan ve bilinmeyen çökmeleri sisteme devreden herhangi bir programın da aynısını yapması önerilir.

Çekirdekteki MTE

Çekirdek için MTE ile hızlandırılmış KASAN'ı etkinleştirmek için çekirdeği CONFIG_KASAN=y , CONFIG_KASAN_HW_TAGS=y ile yapılandırın. Bu yapılandırmalar, Android 12-5.10 başlayarak GKI çekirdeklerinde varsayılan olarak etkindir.
Bu, aşağıdaki komut satırı bağımsız değişkenleri kullanılarak önyükleme sırasında kontrol edilebilir:

  • kasan=[on|off] - KASAN'ı etkinleştirir veya devre dışı bırakır (varsayılan: on )
  • kasan.mode=[sync |async ] - eşzamanlı ve eşzamansız mod arasında seçim yapın (varsayılan: sync )
  • kasan.stacktrace=[on|off] - yığın izlemelerinin toplanıp toplanmayacağı (varsayılan: on )
    • yığın izleme koleksiyonu ayrıca stack_depot_disable=off gerektirir.
  • kasan.fault=[report|panic] - yalnızca raporun yazdırılacağı veya aynı zamanda çekirdeğin panikleneceği (varsayılan: report ). Bu seçenekten bağımsız olarak, etiket kontrolü ilk bildirilen hatadan sonra devre dışı bırakılır.

Açma, geliştirme ve test sırasında SYNC modunu kullanmanızı önemle tavsiye ederiz. Bu seçenek, ortam değişkenini kullanan veya yapı sistemiyle birlikte tüm işlemler için genel olarak etkinleştirilmelidir. Bu modda, hatalar geliştirme sürecinde erken tespit edilir, kod tabanı daha hızlı stabil hale getirilir ve üretimin ilerleyen aşamalarında hataların tespit edilmesinin maliyeti önlenir.

Üretimde ASYNC modunun kullanılmasını şiddetle tavsiye ederiz. Bu, bir süreçteki bellek güvenliği hatalarının varlığının tespit edilmesinin yanı sıra daha derinlemesine savunma için düşük maliyetli bir araç sağlar. Bir hata tespit edildiğinde geliştirici, SYNC moduna geçmek ve örneklenmiş bir kullanıcı grubundan doğru bir yığın izlemesi almak için çalışma zamanı API'lerinden yararlanabilir.

SoC için CPU'ya özgü tercih edilen MTE düzeyini yapılandırmanızı önemle öneririz. Asymm modu tipik olarak ASYNC ile aynı performans özelliklerine sahiptir ve neredeyse her zaman ona tercih edilir. Küçük sıralı çekirdekler genellikle her üç modda da benzer performans gösterir ve SYNC'i tercih edecek şekilde yapılandırılabilir.

Geliştiriciler, /data/tombstones , logcat kontrol ederek veya son kullanıcı hataları için satıcının DropboxManager işlem hattını izleyerek çökmelerin varlığını kontrol etmelidir. Android yerel kodunda hata ayıklama hakkında daha fazla bilgi için buradaki bilgilere bakın.

MTE özellikli platform bileşenleri

Android 12'de, güvenlik açısından kritik bir dizi sistem bileşeni, son kullanıcı çökmelerini tespit etmek ve ek bir derinlemesine savunma katmanı görevi görmek için MTE ASYNC'i kullanıyor. Bu bileşenler şunlardır:

  • Ağ oluşturma programları ve yardımcı programları ( netd hariç)
  • Bluetooth, SecureElement, NFC HAL'ler ve sistem uygulamaları
  • statsd arka plan programı
  • system_server
  • zygote64 (uygulamaların MTE kullanımına dahil olmasına izin vermek için)

Bu hedefler aşağıdaki kriterlere göre seçilmiştir:

  • Ayrıcalıklı bir süreç (unprivileged_app SELinux etki alanının erişemediği bir şeye erişimi olan bir süreç olarak tanımlanır)
  • Güvenilir olmayan girdileri işler ( İki Kuralı )
  • Kabul edilebilir performans yavaşlaması (yavaşlama, kullanıcının görebileceği gecikme yaratmaz)

Satıcıları yukarıda belirtilen kriterleri takip ederek daha fazla bileşen için üretimde MTE'yi etkinleştirmeye teşvik ediyoruz. Geliştirme sırasında, kolayca düzeltilen hataları tespit etmek ve performansları üzerindeki ASYNC etkisini değerlendirmek için bu bileşenleri SYNC modunu kullanarak test etmenizi öneririz.
Gelecekte Android, MTE'nin etkinleştirildiği sistem bileşenleri listesini, gelecek donanım tasarımlarının performans özelliklerine göre genişletmeyi planlıyor.