SELinux, varsayılan reddetmeye ayarlanmıştır; bu, çekirdekte bir kancaya sahip olduğu her bir erişime ilke tarafından açıkça izin verilmesi gerektiği anlamına gelir. Bu, bir ilke dosyasının kurallar, türler, sınıflar, izinler ve daha fazlasıyla ilgili büyük miktarda bilgiden oluştuğu anlamına gelir. SELinux'un tam olarak değerlendirilmesi bu belgenin kapsamı dışındadır, ancak yeni Android cihazları geliştirirken politika kurallarının nasıl yazılacağını anlamak artık çok önemlidir. Halihazırda SELinux ile ilgili çok sayıda bilgi mevcut. Önerilen kaynaklar için Destekleyici belgelere bakın.
Anahtar dosyalar
SELinux'u etkinleştirmek için en son Android çekirdeğini entegre edin ve ardından sistem/sepolicy dizininde bulunan dosyaları birleştirin. Derlendiğinde, bu dosyalar SELinux çekirdek güvenlik politikasını oluşturur ve yukarı akış Android işletim sistemini kapsar.
Genel olarak, system/sepolicy
dosyalarını doğrudan değiştirmemelisiniz. Bunun yerine, /device/ manufacturer / device-name /sepolicy
dizinine kendi cihaza özel ilke dosyalarınızı ekleyin veya düzenleyin. Android 8.0 ve sonraki sürümlerde, bu dosyalarda yaptığınız değişikliklerin yalnızca satıcı dizininizdeki politikayı etkilemesi gerekir. Android 8.0 ve sonraki sürümlerde genel sepolicy'nin ayrılması hakkında daha fazla ayrıntı için bkz . Android 8.0+ sürümünde SEPolicy'yi Özelleştirme . Android sürümü ne olursa olsun, yine de şu dosyaları değiştiriyorsunuz:
Politika dosyaları
*.te
ile biten dosyalar, etki alanlarını ve etiketlerini tanımlayan SELinux ilke kaynak dosyalarıdır. /device/ manufacturer / device-name /sepolicy
içinde yeni ilke dosyaları oluşturmanız gerekebilir, ancak mümkün olduğunda mevcut dosyaları güncellemeye çalışmalısınız.
bağlam dosyaları
Bağlam dosyaları, nesneleriniz için etiketler belirlediğiniz yerdir.
-
file_contexts
, dosyalara etiketler atar ve çeşitli kullanıcı alanı bileşenleri tarafından kullanılır. Yeni ilkeler oluştururken, dosyalara yeni etiketler atamak için bu dosyayı oluşturun veya güncelleyin. Yenifile_contexts
uygulamak için dosya sistemi görüntüsünü yeniden oluşturun veya yeniden etiketlenecek dosyadarestorecon
çalıştırın. Yükseltmelerde,file_contexts
yapılan değişiklikler, yükseltmenin bir parçası olarak sisteme ve kullanıcı verileri bölümlerine otomatik olarak uygulanır. Değişiklikler,restorecon_recursive
çağrıları ekleyerek diğer bölümlere yükseltme sırasında otomatik olarak uygulanabilir. board .rc dosyası bölüm monte edildikten sonra okuma-yazma. -
genfs_contexts
, genişletilmiş öznitelikleri desteklemeyenproc
veyavfat
gibi dosya sistemlerine etiketler atar. Bu yapılandırma, çekirdek ilkesinin bir parçası olarak yüklenir, ancak değişiklikler çekirdek içi düğümler için geçerli olmayabilir, bu da değişikliği tam olarak uygulamak için yeniden başlatmayı veya dosya sisteminin bağlantısını kesmeyi ve yeniden bağlamayı gerektirebilir.context=mount
seçeneği kullanılarakvfat
gibi belirli bağlamalara belirli etiketler de atanabilir. -
property_contexts
, hangi işlemlerin onları ayarlayabileceğini kontrol etmek için Android sistem özelliklerine etiketler atar. Bu yapılandırma, başlatma sırasındainit
işlemi tarafından okunur. -
service_contexts
, hangi işlemlerin ekleyebileceğini (kaydetebileceğini) ve hizmet için bir bağlayıcı referansı bulabileceğini (aradığını) kontrol etmek için Android bağlayıcı hizmetlerine etiketler atar. Bu yapılandırma, başlatma sırasındaservicemanager
işlemi tarafından okunur. -
seapp_contexts
, uygulama süreçlerine ve/data/data
dizinlerine etiketler atar. Bu yapılandırma, her uygulama açılışındazygote
işlemi tarafından ve başlatma sırasındainstalld
tarafından okunur. -
mac_permissions.xml
, imzalarına ve isteğe bağlı olarak paket adlarına göre uygulamalara birseinfo
etiketi atar.seinfo
etiketi, oseinfo
etiketine sahip tüm uygulamalara belirli bir etiket atamak içinseapp_contexts
dosyasında bir anahtar olarak kullanılabilir. Bu yapılandırma, başlatma sırasındasystem_server
tarafından okunur. -
keystore2_key_contexts
, Etiketleri Keystore 2.0 ad alanlarına atar. Bu ad alanı, keystore2 arka plan programı tarafından zorlanır. Anahtar deposu her zaman UID/AID tabanlı ad alanları sağlamıştır. Anahtar deposu 2.0 ek olarak sepolicy tanımlı ad alanlarını zorlar. Bu dosyanın biçiminin ve kurallarının ayrıntılı bir açıklaması burada bulunabilir.
BoardConfig.mk makefile
İlke ve bağlam dosyalarını düzenledikten veya ekledikten sonra, /device/ manufacturer / device-name /BoardConfig.mk
makefile sepolicy
alt dizinine ve her yeni ilke dosyasına başvuracak şekilde güncelleyin. BOARD_SEPOLICY
değişkenleri hakkında daha fazla bilgi için system/sepolicy/README
dosyasına bakın.
BOARD_SEPOLICY_DIRS += \ <root>/device/manufacturer/device-name/sepolicy BOARD_SEPOLICY_UNION += \ genfs_contexts \ file_contexts \ sepolicy.te
Yeniden oluşturma işleminden sonra cihazınız SELinux ile etkinleştirilir. Artık SELinux politikalarınızı, Özelleştirme bölümünde açıklandığı gibi Android işletim sistemine kendi eklemelerinizi barındıracak şekilde özelleştirebilir veya Doğrulama kapsamındaki mevcut kurulumunuzu doğrulayabilirsiniz.
Yeni ilke dosyaları ve BoardConfig.mk güncellemeleri yapıldığında, yeni ilke ayarları otomatik olarak son çekirdek ilke dosyasına yerleştirilir. Aygıtta sepolicy'nin nasıl oluşturulduğu hakkında daha fazla bilgi için bkz. sepolicy oluşturma .
uygulama
SELinux'u kullanmaya başlamak için:
- Çekirdekte SELinux'u etkinleştirin:
CONFIG_SECURITY_SELINUX=y
- kernel_cmdline veya bootconfig parametresini şu şekilde değiştirin:
BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
veyaBOARD_BOOTCONFIG := androidboot.selinux=permissive
Bu, yalnızca aygıt için ilkenin ilk geliştirmesi içindir. İlk önyükleme politikanız olduktan sonra, cihazınızın zorlaması veya CTS'de başarısız olması için bu parametreyi kaldırın. - Sistemi izinli olarak başlatın ve açılışta hangi retlerle karşılaşıldığını görün:
Ubuntu 14.04 veya daha yeni sürümlerde:adb shell su -c dmesg | grep denied | audit2allow -p out/target/product/BOARD/root/sepolicy
Ubuntu 12.04'te:adb pull /sys/fs/selinux/policy adb logcat -b all | audit2allow -p policy
- Çıktıyı
init: Warning! Service name needs a SELinux domain defined; please fix!
Talimatlar ve araçlar için Doğrulama bölümüne bakın. - Etiketlenmesi gereken cihazları ve diğer yeni dosyaları belirleyin.
- Nesneleriniz için mevcut veya yeni etiketleri kullanın. Nesnelerin daha önce nasıl etiketlendiğini görmek için
*_contexts
dosyalarına bakın ve yeni bir etiket atamak için etiket anlamlarını kullanın. İdeal olarak, bu, politikaya uyan mevcut bir etiket olacaktır, ancak bazen yeni bir etikete ihtiyaç duyulacak ve bu etikete erişim için kurallara ihtiyaç duyulacaktır. Etiketlerinizi uygun bağlam dosyalarına ekleyin. - Kendi güvenlik etki alanlarına sahip olması gereken etki alanlarını/süreçleri belirleyin. Muhtemelen her biri için tamamen yeni bir politika yazmanız gerekecektir. Örneğin
init
öğesinden oluşturulan tüm hizmetlerin kendilerine ait olması gerekir. Aşağıdaki komutlar, çalışmaya devam edenleri ortaya çıkarmaya yardımcı olur (ancak TÜM hizmetlerin böyle bir tedaviye ihtiyacı vardır):adb shell su -c ps -Z | grep init
tutucu6 l10n-yeradb shell su -c dmesg | grep 'avc: '
-
init. device .rc
etki alanı türü olmayan tüm etki alanlarını tanımlamak içininit. device .rc
.init
kurallar eklemekten veyainit
erişimlerini kendi politikalarındakilerle karıştırmaktan kaçınmak için geliştirme sürecinizin başlarında onlara bir etki alanı verin. -
BOARD_SEPOLICY_*
değişkenlerini kullanmak içinBOARD_CONFIG.mk
ayarlayın. Bunu ayarlamayla ilgili ayrıntılar içinsystem/sepolicy
bakın . - initi inceleyin. device .rc ve fstab. device dosyası oluşturun ve her
mount
kullanımının uygun şekilde etiketlenmiş bir dosya sistemine karşılık geldiğinden veya bircontext= mount
seçeneğinin belirtildiğinden emin olun. - Her reddetmeyi gözden geçirin ve her birini uygun şekilde işlemek için SELinux politikası oluşturun. Özelleştirme bölümündeki örneklere bakın.
AOSP'deki ilkelerle başlamalı ve ardından kendi özelleştirmeleriniz için bunları geliştirmelisiniz. Politika stratejisi hakkında daha fazla bilgi ve bu adımlardan bazılarına daha yakından bakmak için bkz. SELinux Politikası Yazma .
Kullanım durumları
Kendi yazılımınızı ve ilgili SELinux politikalarınızı oluştururken göz önünde bulundurmanız gereken belirli açıklardan yararlanma örnekleri şunlardır:
Sembolik bağlantılar - Sembolik bağlantılar dosya olarak göründüğünden, genellikle dosya olarak okunurlar ve bu da istismarlara yol açabilir. Örneğin, init
gibi bazı ayrıcalıklı bileşenler, belirli dosyaların izinlerini bazen aşırı açık olacak şekilde değiştirir.
Saldırganlar daha sonra bu dosyaları kontrol ettikleri koda sembolik bağlantılarla değiştirerek saldırganın rastgele dosyaların üzerine yazmasına izin verebilir. Ancak uygulamanızın bir sembolik bağlantıyı asla geçmeyeceğini biliyorsanız, bunu SELinux ile yapmasını engelleyebilirsiniz.
Sistem dosyaları - Yalnızca sistem sunucusu tarafından değiştirilmesi gereken sistem dosyalarının sınıfını düşünün. Yine de netd
, init
ve vold
root olarak çalıştığından bu sistem dosyalarına erişebilirler. Dolayısıyla, netd
güvenliği ihlal edilirse, bu dosyaları ve potansiyel olarak sistem sunucusunun kendisini tehlikeye atabilir.
SELinux ile bu dosyaları sistem sunucusu veri dosyaları olarak tanımlayabilirsiniz. Bu nedenle, bunlara okuma/yazma erişimi olan tek etki alanı sistem sunucusudur. netd
güvenliği ihlal edilse bile, etki alanlarını sistem sunucusu etki alanına geçiremez ve kök olarak çalışmasına rağmen bu sistem dosyalarına erişemezdi.
Uygulama verileri - Başka bir örnek, kök olarak çalışması gereken ancak uygulama verilerine erişmemesi gereken işlevler sınıfıdır. Uygulama verileriyle ilgisi olmayan belirli alan adlarının internete erişiminin yasaklanması gibi geniş kapsamlı iddialar yapılabileceğinden, bu inanılmaz derecede faydalıdır.
setattr - chmod
ve chown
gibi komutlar için, ilişkili etki alanının setattr
gerçekleştirebileceği dosya kümesini tanımlayabilirsiniz. Bunun dışındaki herhangi bir şey, kök tarafından bile bu değişikliklerden yasaklanabilir. Bu nedenle, bir uygulama chmod
çalıştırabilir ve app_data_files
etiketli olanlara karşı chown
olabilir, ancak shell_data_files
veya system_data_files
değil.