AArch64 sistem ikili programları için yürütülebilir kod bölümleri varsayılan olarak işaretlidir tam zamanında koda karşı daha sağlam bir çözüm olarak yalnızca yürütülebilir (okunamaz) tekrar kullanmamak anlamına gelir. Verileri ve kodu, bilinçli bir şekilde bir araya getiren kod bu bölümleri inceler (hafıza segmentlerini okunabilir olarak yeniden eşlemeden) çalışmıyor. SDK'sı 10 olan uygulamalar (API düzeyi 29 veya üstü) uygulama, tarayıcının kod bölümlerini okumaya çalışırsa önce çalıştırılmadan bellekte yalnızca yürütülebilir bellek (XOM) etkinleştirilmiş sistem kitaplıklarını bu bölümü okunabilir olarak işaretlemelidir.
Bu çözümden tam anlamıyla yararlanmak için hem donanım hem de çekirdek desteği gereklidir. Bu destek olmadan çözüm yalnızca kısmen uygulanabilir. İlgili içeriği oluşturmak için kullanılan Android 4.9 ortak çekirdeği, tüm SDK'ların düzgün şekilde ARMv8.2 cihazlarda bunun için destek sunar.
Uygulama
Derleyici tarafından oluşturulan AArch64 ikili programları, kod ve verilerin bir araya getirilmiştir. Bu özelliğin etkinleştirilmesi, için geçerlidir.
Chrome Tarayıcı'da kasıtlı bellek iç gözlemi yapması gereken
yürütülebilir segmentler, mprotect
ve okunabilir olmasını sağlamak için inceleme gerektiren kod segmentleri
İnceleme tamamlandığında okunabilirliği kaldırın.
.
Bu uygulama, şu şekilde işaretlenmiş bellek segmentlerinde okuma yapılmasına neden olur:
Segmentasyon hatasına (SEGFAULT
) yol açacak şekilde yürütülür.
Bu durum bir hata, güvenlik açığı, verilerin birbirine karışması
kod (düz havuz) veya kasıtlı bellek iç gözlemi.
Cihaz desteği ve etkisi
gerekli yamalar bu özelliği tam olarak desteklemeyebilir veya ondan yararlanamayabilir. Cihazlar
çekirdek desteği olmadan, salt yürütme belleğine kullanıcı erişimlerini zorunlu kılmayabilir.
bir sayfanın okunabilir olup olmadığını açıkça kontrol eden çekirdek kodu
process_vm_readv()
gibi bu özelliği zorunlu kılabilirsiniz.
CONFIG_ARM64_UAO
çekirdek işareti, çekirdekte
çekirdeğin "yalnızca yürütülebilir" olarak işaretlenen kullanıcı sayfası sayfalarına uyduğundan emin olun. Önceki ARMv8
cihazlar veya Kullanıcı Erişimini Geçersiz Kılma (UAO) özelliğinin devre dışı bırakıldığı ARMv8.2 cihazlar
tam anlamıyla yararlanabilir ve yalnızca aşağıdakileri kullanarak yürütülebilir sayfaları
syscall'lar.
Mevcut kodu yeniden düzenleme
AArch32'den taşınan kod, karışık veriler içerebilir ve
soruna neden olabilir. Çoğu durumda, bu sorunları çözmek için
işlevi, sabit değerleri derleme dosyasında bir .data
bölümüne taşımaktır.
Elle yazılmış montajın, yerel havuzlardan ayrılması için yeniden düzenlenmesi gerekebilir. sabitler.
Örnekler:
Clang derleyicisi tarafından oluşturulan ikili programlarda veri sorunu olmamalıdır bir sürü kod vardır. GNU derleyici koleksiyonu (GCC) tarafından oluşturulan kod (statik kitaplıktan), çıkış ikili programını inceleyerek sabit değerlerin kod bölümlerinde toplanmadığından emin olun.
Yürütülebilir kod bölümlerinde kod iç gözlemi gerekiyorsa
İlk olarak mprotect
öğesini çağırarak kodu okunabilir olarak işaretleyin. Ardından, bu işlemden sonra
tamamlandı, okunamaz olarak işaretlemek için mprotect
numarasını tekrar arayın.
XOM'u etkinleştir
Yalnızca yürütme, derlemedeki tüm 64 bit ikili programlar için varsayılan olarak etkindir bahsedeceğim.
XOM'yi devre dışı bırak
Yalnızca Yürütme işlevini modül düzeyinde, bir alt dizin ağacının tamamı veya global olarak sunmamız gerekir.
Yeniden düzenlenemeyen veya
LOCAL_XOM
ayarlayarak yürütülebilir kod
ve xom
değişkenlerini false
olarak ayarlayın.
// Android.mk LOCAL_XOM := false // Android.bp cc_binary { // or other module types ... xom: false, }
Statik kitaplıkta yalnızca yürütme bellek devre dışı bırakılırsa derleme sistemi
bunu, bu statik kitaplığın tüm bağımlı modüllerine uygulayabilir. Bu
bunu xom: true,
kullanarak gerçekleştirebilirsiniz.
Belirli bir alt dizinde (örneğin,
foo/bar/) ekleyerek değeri XOM_EXCLUDE_PATHS
işlevine iletin.
make -j XOM_EXCLUDE_PATHS=foo/bar
Alternatif olarak, PRODUCT_XOM_EXCLUDE_PATHS
değişkenine eklenmelidir.
Yalnızca yürütülebilir ikili programları,
make
komutunuza ENABLE_XOM=false
.
make -j ENABLE_XOM=false
Doğrulama
Yalnızca yürütülmeye yönelik kullanılabilir CTS veya doğrulama testi yok
hafızada bulabilirsiniz. İkili programları, readelf
ve kontrol işlevini kullanarak manuel olarak doğrulayabilirsiniz.
emin olun.