Bellek etiketleme uzantısını etkinleştir

.

Kol v9'da, Arm Bellek özelliği kullanıma sunuldu. Etiketleme Uzantısı (MTE), bir donanım uygulaması etiketli bellek.

Yüksek bir düzeyde MTE, her bellek ayırmayı/aktarmayı ek meta veriler. Bir bellek konumuna bir etiket atar. Bu daha sonra işaretleyicilerle ilişkilendirildiğinden emin olun. Çalışma zamanında CPU her yükleme ve depoda işaretçi ile meta veri etiketlerinin eşleşip eşleşmediğini kontrol eder.

Android 12'de çekirdek ve kullanıcı alanı yığın belleği ayırıcısı, meta veriyle gösterilir. Bu şekilde demlemeden sonra kullanılabilir ve bellek güvenliği hatalarının en yaygın kaynağı olan arabellek taşması hataları yeni bir kod tabanımız var.

MTE çalışma modları

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

  • Eşzamanlı mod (SYNC)
  • Eşzamansız mod (ASYNC)
  • Asimetrik mod (ASYMM)

Eşzamanlı mod (SYNC)

Bu mod, performans ve performansa göre hata algılama doğruluğu için optimize edilmiştir. daha yüksek performans ek yükü olduğunda hassas bir hata algılama aracı olarak kullanılabilir kabul edilir. MTE SYNC etkinleştirildiğinde bir güvenlik çözümü görevi görür. Bir etiket uyuşmazlığı durumunda işlemci, yürütmeyi hemen iptal eder ve işlemi SIGSEGV (kod SEGV_MTESERR) ve bellek erişimi ve hatası veren adrestir.

Test sırasında HWASan/KASAN ya da üretim aşamasında, hedef süreç belirli bir saldırıya uğrayan yüzeylere bakın. Ayrıca, ASYNC modu bir API'leri kullanarak hata yoksa doğru bir hata raporu almak için senkronize etme moduna geçirin.

SENKRONİZASYON modunda çalışırken Android ayırıcı, tüm cihazlar için yığın izlemeleri tahsisleri ve dağıtımları ile bunları, bir belleğin açıklamasını içeren daha iyi hata raporları sağlamak için kullanır veya arabellekte taşma gibi hataları içeren iletilerin yığın izlemeleri veya önemli anı etkinlikleriyle ilgilidir. Bu tür raporlar bağlamla ilgili daha fazla bilgi sağlar daha kolay bir şekilde izlenmesini ve düzeltilmesini sağlar.

Eşzamansız mod (ASYNC)

Bu mod, hata raporlarının doğruluğu yerine performans için optimize edilmiştir ve olarak algılanmak üzere hafıza güvenliği hataları için düşük ek yük algılama olarak kullanılır.
. Bir etiket uyuşmazlığı durumunda işlemci, en yakın sonlandırılması gereken çekirdek girişi (örneğin, syscall veya zamanlayıcı kesme) SIGSEGV ile işlem (SEGV_MTEAERR kodu) olmadan veya belleğe erişimi kaydetmeliyiz.
. Bu modu, üretimde kullanabileceğiniz iyi test edilmiş kod tabanlarında bellek güvenliği hatalarının yoğunluğunun düşük olduğu bilinmektedir. Bunun için senkronize etmek için kullanılır.

Asimetrik mod (ASYMM)

Arm v8.7-A'daki ek bir özellik olan asimetrik MTE modu, eşzamanlı bellek okumalarını ve bellek yazmalarının eşzamansız kontrolünün ile ASYNC modununkine benzer bir performansa sahiptir. Çoğu durumda bu, modu, ASYNC modu üzerinde yapılan bir iyileştirmedir. Bu nedenle, Kullanılabilir olduğunda ASYNC.

Bu nedenle, aşağıda açıklanan API'lerin hiçbirinde asimetrik yatırım yapmanız önemlidir. Bunun yerine işletim sistemi, aşağıdaki durumlarda her zaman asimetrik modu kullanacak şekilde Eşzamansız istenir. Daha fazla bilgi için lütfen tercih edilen MTE düzeyi" bölümüne bakın.

Kullanıcı alanında MTE

Aşağıdaki bölümlerde, MTE'nin sistem işlemleri için nasıl etkinleştirilebileceği açıklanmaktadır. ve uygulamalar. Aşağıdaki seçeneklerden biri değilse MTE varsayılan olarak devre dışıdır belirli bir işlem için ayarlandığını aşağıda görebilirsiniz (MTE'nin hangi bileşenler için etkinleştirildiğini inceleyin).

Derleme sistemini kullanarak MTE'yi etkinleştirme

İşlem genelinde bir mülk olan MTE, yürütülebilir dosya. Aşağıdaki seçenekler, bu ayarın değiştirilmesine olanak tanır. tek tek yürütülebilir dosyalar veya kaynak ağacındaki tüm alt dizinler için ayrı ayrı çalıştırılabilir. İlgili içeriği oluşturmak için kullanılan ayarı kitaplıklarda veya yürütülebilir olmayan ya da testi.

1. Android.bp ürününde MTE'yi etkinleştirme (örnek), açıklamanız gerekir:

MTE Modu Ayar
Eşzamansız MTE
  sanitize: {
  memtag_heap: true,
  }
Eşzamanlı MTE
  sanitize: {
  memtag_heap: true,
  diag: {
  memtag_heap: true,
  },
  }

veya Android.mk: içinde

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

2. Ürün kullanarak kaynak ağaçtaki bir alt dizinde MTE'yi etkinleştirme değişken:

MTE modu Listeyi dahil et Hariç tutulanlar listesi
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
Eşzamansız MTE MEMTAG_HEAP_ASYNC_INCLUDE_PATHS
Eşzamanlı MTE MEMTAG_HEAP_SYNC_INCLUDE_PATHS

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

MTE Modu Ayar
Eşzamansız MTE PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS MEMTAG_HEAP_EXCLUDE_PATHS
Eşzamanlı 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ı, şu sistem özelliğini kullanın:

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

basename burada yürütülebilir dosyanın temel adıdır.

Örneğin, /system/bin/ping veya /data/local/tmp/ping değerini ayarlamak için eşzamansız MTE'yi kullanmak 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 diğer yolu da ortamı tanımlamaktır. değişken: MEMTAG_OPTIONS=(off|sync|async) Hem ortam değişkeni hem de sistem özelliği tanımlıysa değişkeni önceliklidir.

Uygulamalar için MTE'yi etkinleştir

Belirtilmezse MTE varsayılan olarak devre dışı bırakılır, ancak MTE kullanmak isteyen uygulamalar bunu android:memtagMode ayarlayarak yapabilir <application> veya <process> etiketi AndroidManifest.xml.

ziyaret edin. android:memtagMode=(off|default|sync|async)

<application> etiketinde ayarlandığında özelliği, uygulama tarafından kullanılan tüm işlemleri etkiler ve geçersiz kılınabilir. reklam öğesi ayarlarını yaparak <process> etiketi.

Deneme için uyumluluk değişiklikleri, bir verinin varsayılan değerini ayarlamak için Aşağıdaki özelliklere sahip bir uygulamanın memtagMode özelliği: manifest dosyasında herhangi bir değer belirtmemelidir (veya default) tıklayın.
Bunları, genel ayarlar menüsündeki System > Advanced > Developer options > App Compatibility Changes altında bulabilirsiniz. Ayar NATIVE_MEMTAG_ASYNC veya NATIVE_MEMTAG_SYNC, MTE'yi etkinleştirir kullanabilirsiniz.
Alternatif olarak bu, am kullanılarak da ayarlanabilir komutuna dahil etmek için aşağıdaki komutu çalıştırın:

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

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

Geliştirme sırasında tüm yerel ikili programlarda MTE'yi etkinleştirmenizi önemle tavsiye ederiz yapabiliriz. Bu, bellek güvenliği hatalarının erkenden tespit edilmesine yardımcı olur ve gerçekçi görüntüler sağlar kullanıcı kapsamının genişletilmesidir.

Geliştirme sırasında tüm yerel ikili programlarda MTE'yi Eşzamanlı modda etkinleştirmenizi önemle tavsiye ederiz

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ılır (örneğin, bir product.mk dosyası) ekleyebilirsiniz.
. Bunun, MTE'yi tüm yerel işlemler için etkinleştirdiğini ancak MTE'yi tüm yerel işlemler için etkinleştirdiğini lütfen unutmayın. MTE'nin dahil olabileceği uygulamaları (zygote64 üzerinden çatallanır) yukarıdaki talimatlar uygulanarak etkinleştirilir.

CPU'ya özel tercih edilen MTE seviyesini yapılandırın

Bazı CPU'larda MTE'nin ASYMM ve hatta SENKRONİZASYON modlarındaki performansı şuna benzer olabilir: temel bir kaynaktır. Bu nedenle, daha katı bir denetim modu istendiğinde bu CPU'lar için daha sıkı denetimler gerçekleştirir. daha sıkı kontrollerin hata algılama avantajlarından yararlanmak için olumsuz yönde etkilenmemesini sağlayabilirsiniz.
. Varsayılan olarak, ASYNC modunda çalışacak şekilde yapılandırılan işlemler ASYNC'de çalışır. modunu kullanabilirsiniz. Çekirdeği bu işlemleri SENKRONİZE modunda çalıştıracak şekilde yapılandırmak için için değer senkronizasyonu, sysfs giriş Açılışta /sys/devices/system/cpu/cpu<N>/mte_tcf_preferred gerekir. Bu işlem, bir başlangıç komut dosyasıyla yapılabilir. Örneğin, CPU'ları 0-1 yapılandırmak için SYNC modunda ASYNC modu işlemlerini, 2-3 arası CPU'ları da ASYMM modunda çalıştırmayı gerektirir. bir tedarikçi başlatma komut dosyasının init yan tümcesine 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 modundaki Tombstones bir Bellek hatasının konumuna ilişkin tam yığın izleme (stack trace) Ancak, ayırma veya dağıtımdan elde edilen yığın izleme (stack trace) içermesi gerekir. Bu yığın izlemeler yalnızca işlem SENKRONİZE modunda çalışacak şekilde yapılandırılmışsa kullanılabilir.

ziyaret edin. int mallopt(M_THREAD_DISABLE_MEM_INIT, level)

burada level değeri 0 veya 1'dir.
. Malloc'da bellek başlatmayı devre dışı bırakır ve bellek etiketlerinin değiştirilmesini önler (doğruluk için gerekli olmadığı sürece)

int mallopt(M_MEMTAG_TUNING, level)

Burada level şöyle olur:

  • 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 - belirginleştirmeyi mümkün kılar ayrı bir etiket atayarak doğrusal arabellek taşması ve yetersiz akış hatalarının tespiti bitişik ayırmalara değerleridir. Bu modun ücretsiz sonrası kullanım hatalarını algılamak için, olası etiket değerlerinin yalnızca yarısı kullanılabilir. Lütfen MTE'nin Google tarafından algılanamadığını lütfen unutmayın. aynı etiket granülünün (16 baytlık uyumlu parça) içinde taşar ve küçükleri gözden kaçırabilir değer taşar. Bu tür bir taşma, belleğin nedeni olamaz bozulabilir, çünkü bir granül içindeki bellek hiçbir zaman birden fazla tahsisler.
  • M_MEMTAG_TUNING_UAF - bağımsız olarak rastgele hale getirilmiş etiketleri etkinleştirir ve aynı zamanda uzamsal (arabellek taşması) ve zamansal (ücretsiz olduğunda kullanın) hatalar.

Yukarıda açıklanan API'lere ek olarak, deneyimli kullanıcılar şunlara dikkat edin:

  • PSTATE.TCO donanım kasasının ayarlanması geçici olarak etiket kontrolünü engelleme (örnek). Örneğin, bilinmeyen etiket içerikleri olan bir bellek aralığını kopyalarken veya devredeki bir performans sorununu ele alma.
  • M_HEAP_TAGGING_LEVEL_SYNC kullanılırken sistem kilitlenme işleyici ayırma ve dağıtım yığın izlemeleri gibi ek bilgiler sağlar. Bu işlev, etiket bitlerine erişim gerektirir ve SA_EXPOSE_TAGBITS. işaretini tıklayın. Kendi sinyalini belirleyen tüm programlar bilinmeyen kilitlenmeleri sisteme aktarmanızı sağlar. Bunun için aynı.

Çekirdekteki MTE

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

  • kasan=[on|off] - KASAN'ı etkinleştirme veya devre dışı bırakma (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] - toplanıp toplanmayacağı yığın izlemeler (varsayılan: on)
    • yığın izleme (stack trace) toplaması da stack_depot_disable=off
  • kasan.fault=[report|panic]: Rapor yalnızca yazdırılır, ya da çekirdeği paniğe kaptırın (varsayılan: report). Bundan bağımsız olarak seçeneğinde, etiket denetimi ilk bildirilen hatadan sonra devre dışı bırakılır.
ziyaret edin.

Getirme, geliştirme ve çalıştırma sırasında SYNC modunu kullanmanızı teşvik etmek anlamına gelir. Bu seçenek, ortam değişkenini kullanan tüm işlemler için genel olarak veya derleme sistemi ile etkinleştirilmelidir. Bu modda hatalar algılanır kod tabanı daha hızlı stabilize edilir ve kod tabanı üretimde hata tespitinin maliyeti ortadan kalkar.

Üretimde ASYNC modunu kullanmanızı önemle tavsiye ederiz. Bu durum, düşük işlemlerde bellek güvenliği hatalarının varlığını algılamaya yönelik ek yük aracı hem de daha derinlemesine bir savunmayı geliştiriyor. Bir hata algılandığında geliştirici, SENKRONİZASYON moduna geçmek ve doğru yığın izleme (stack trace) elde etmek için çalışma zamanı API'lerinden yararlanın. örneklenmiş bir kullanıcı grubundan

Mobil cihazlar için CPU'ya özel tercih edilen MTE düzeyini çip üzerinde çalıştım. Asymm modu genellikle ASYNC ile aynı performans özelliklerine sahiptir. bu yüzden her zaman daha çok tercih edilir. Sıralı küçük çekirdekler genellikle benzer her üç modda da çalışır ve SENKRONİZASYONU tercih edecek şekilde yapılandırılabilir.

Geliştiriciler şunu kontrol ederek kilitlenme olup olmadığını kontrol etmelidir: /data/tombstones, logcat veya tedarikçiyi izleyerek DropboxManager geliştirme işini kolaylaştırır. Android yerel kodunda hata ayıklama hakkında daha fazla bilgi için buradaki bilgiler.

MTE özellikli platform bileşenleri

Android 12'de güvenlik açısından kritik öneme sahip bir dizi sistem bileşeni MTE ASYNC'i kullanır. yardımcı olacak ek bir katman olarak işlev görecektir. tıklayın. Bu bileşenler şunlardır:

  • Ağ iletişimi arka plan programları ve yardımcı programları ( netd) olarak değiştirildi
  • Bluetooth, SecureElement, NFC HAL'ler ve sistem uygulamaları
  • statsd arka plan programı
  • system_server
  • zygote64 (uygulamaların MTE'yi etkinleştirmesine izin vermek için)

Bu hedefler aşağıdaki ölçütlere göre seçilmiştir:

  • Ayrıcalıklı bir süreç (bir şeye erişimi olan süreç olarak tanımlanır) buna izin verilmez.)
  • Güvenilir olmayan girişleri işler (Kural /iki)
  • Kabul edilebilir performans yavaşlaması (yavaşlama, kullanıcının görünmesini engellemez) gecikme)

Tedarikçi firmaların daha fazla bileşen için üretimde MTE'yi etkinleştirmelerini öneririz. izin verilmez. Geliştirme sırasında test etmenizi bu bileşenleri SENKRONİZE modunu kullanarak, kolayca düzeltilen hataları tespit edebilir ve ASYNC'in performansları üzerindeki etkisi.
. Gelecekte Android, MTE'nin sistem bileşenleri listesini genişletmeyi planlıyor: özellikleri temel alınarak geliştirilen, yeni donanımların