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
.
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 veSA_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
- yığın izleme (stack trace) toplaması da
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.
Önerilen kullanım
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