AArch64 ikili programları için yalnızca yürütme bellek (XOM)

.

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.