SELinux "default-deny" değerine ayarlanır, bu da politika tarafından açıkça izin verilmelidir. Bu bir politika dosyasının, kullanıcıların büyük bir kısmını etkileyen özellikler, türler, sınıflar, izinler ve daha fazlasını içerir. SELinux'un tam olarak değerlendirilmesi ancak bu belgenin kapsamı dışındadır ancak politika kurallarının kritik öneme sahip olduğunu unutmayın. Bir SELinux ile ilgili çok fazla bilgi zaten mevcut. Bkz. Destekleyici dokümanlarına göz atın.
Anahtar dosyalar
SELinux'u etkinleştirmek için en son Android çekirdeğine benzerdir ve ardından sistem/sepolicy dizin. Bu dosyalar derlendiğinde SELinux çekirdek güvenliğini oluşturur Android işletim sistemini kapsamalıdır.
Genel olarak, system/sepolicy
dosyalarını değiştirmemeniz gerekir.
doğrudan ekleyebilirsiniz. Bunun yerine, cihaza özel politika dosyalarınızı
/device/manufacturer/device-name/sepolicy
.
dizin. Android 8.0 ve sonraki sürümlerde bu dosyalarda yaptığınız değişiklikler
yalnızca tedarikçi firma dizininizdeki politikayı etkiler. Paydaşların ayrılmasıyla ilgili daha
Android 8.0 ve sonraki sürümlerde herkese açık sepolicy için bkz.
Android'de SEPolicy'yi özelleştirme
8.0 ve sonraki sürümler. Android sürümünden bağımsız olarak şu dosyaları değiştirmeye devam edersiniz:
Politika dosyaları
*.te
ile biten dosyalar, SELinux politika kaynak dosyalarıdır ve
alan adlarını ve etiketlerini tanımlar. Şu ürünlerde yeni politika dosyaları oluşturmanız gerekebilir:
/device/manufacturer/device-name/sepolicy
,
ancak mümkün olduğunda mevcut dosyaları güncellemeyi denemelisiniz.
Bağlam dosyaları
Bağlam dosyaları, nesneleriniz için etiketler belirttiğiniz yerdir.
file_contexts
, dosyalara etiketler atar ve çeşitli komut dosyaları kullanıcı alanı bileşenleri hakkında daha fazla bilgi edinin. Yeni politikalar oluştururken bu dosyayı oluşturun veya güncelleyin tuşuna basarak dosyalara yeni etiket atayın. Yenifile_contexts
özelliğini uygulamak için yeniden oluşturun veya dosya üzerinderestorecon
komutunu çalıştırarak yeniden etiketlenmesi gerekebilir. Yükseltmelerdefile_contexts
ile ilgili değişiklikler şunun bir parçası olarak, sistem ve kullanıcı verisi bölümlerine otomatik yükseltmeye yardımcı olur. Ayrıca değişiklikler, bölüm eklemek içinrestorecon_recursive
bölüm eklendikten sonra init.board.rc dosyasını okuma-yazma.genfs_contexts
, dosya sistemlerine şunun gibi etiketler atar: Genişletilmiş desteği desteklemeyenproc
veyavfat
özellikleri hakkında daha fazla bilgi edinin. Bu yapılandırma, çekirdek politikasının bir parçası olarak yüklenir ancak değişiklikler çekirdek içi düğümlerde uygulanmayabilir, yeniden başlatma veya değişikliği tam olarak uygulamak için dosya sisteminin bağlantısını kesme ve yeniden ekleme. Aşağıdaki gibi bağlantılara da belirli etiketler atanabilir:vfat
içincontext=mount
seçeneğini kullanabilirsiniz.property_contexts
, etiketleri Android sistem özelliklerine atar. hangi süreçlerin onları belirleyebileceğini kontrol edebilirsiniz. Bu yapılandırma Başlatma sırasındainit
işlem.service_contexts
, etiketleri Android bağlayıcı hizmetlerine atar hangi işlemlerin bir bağlayıcı ekleyebileceğini (kaydetebileceğini) ve bulabileceğini (arayacağını) kontrol et bu hizmet için bir referanstır. Bu yapılandırma Başlatma sırasındaservicemanager
işlem.seapp_contexts
, uygulama işlemlerine etiketler atar ve/data/data
dizin. Bu yapılandırma Her uygulama başlatma işleminde veinstalld
tarihine kadarzygote
süreci unutmayın.mac_permissions.xml
, uygulamalara birseinfo
etiketi atar tercih edebilirsiniz. İlgili içeriği oluşturmak için kullanılanseinfo
etiketi, daha sonra Şuna sahip tüm uygulamalara belirli bir etiket atamak için:seapp_contexts
buseinfo
etiketi. Bu yapılandırma okuyan: Başlatma sırasındasystem_server
.keystore2_key_contexts
, Anahtar Deposu 2.0 ad alanlarına etiketler atar. Bu ad alanı, keystore2 arka plan programı tarafından zorunlu kılınır. Anahtar deposu her zaman UID/AID tabanlı ad alanları sağlar. Anahtar Deposu 2.0 ayrıca sepolicy'yi de zorunlu kılar tanımlanmış ad alanları. Bu videonun formatı ve kurallarıyla ilgili ayrıntılı açıklama dosyasını burada bulabilirsiniz.
BoardConfig.mk oluşturma dosyası
Politika ve bağlam dosyalarını düzenledikten veya ekledikten sonra,
/device/manufacturer/device-name/BoardConfig.mk
.
Makefile ile sepolicy
alt dizinine ve her yeni politika dosyasına referans verin.
BOARD_SEPOLICY
değişkenleri hakkında daha fazla bilgi için bkz.
system/sepolicy/README
dosya.
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 için etkinleştirilir. Artık şunlardan birini yapabilirsiniz: SELinux politikalarınızı Android işletim sistemi konusunda açıklandığı gibi Özelleştirme veya mevcut kurulumun Doğrulama.
Yeni politika dosyaları ve BoardConfig.mk güncellemeleri uygulandığında politika ayarları, nihai çekirdek politika dosyasına otomatik olarak eklenir. sepolicy'in cihazda nasıl oluşturulduğuyla ilgili daha fazla bilgi için Site politikası oluşturma.
Uygulama
SELinux'u kullanmaya başlamak için:
- Çekirdekteki SELinux'u etkinleştirin:
CONFIG_SECURITY_SELINUX=y
. - kernel_cmdline veya bootconfig parametresini değiştirerek şunları yapın:
BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
. veyaBOARD_BOOTCONFIG := androidboot.selinux=permissive
Bu yalnızca cihaza yönelik politikanın ilk geliştirme süreciyle ilgilidir. Siz bir başlangıç önyükleme politikanız varsa, yoksa CTS'de başarısız olur. - Sistemi mümkün olduğunca başlatın ve başlatma sırasında 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!
ile benzer uyarılar olup olmadığını değerlendirin. Bkz. Talimatlar için doğrulama ve araçlar. - Cihazları ve etiketlenmesi gereken diğer yeni dosyaları tanımlayın.
- Nesneleriniz için mevcut veya yeni etiketleri kullanın. Şuraya bakın:
Öğelerin daha önce nasıl etiketlendiğini görmek için
*_contexts
dosya yükleyin ve yeni bir etiket atamak için etiketlerin anlamlarını bilmeniz gerekir. İdeal koşullarda bu, politikaya uyacak mevcut bir etiket olur, ancak yeni bir etiket gerekecektir ve bu etikete erişim kuralları gerekir. Etiketlerinizi uygun bağlam dosyalarına ekleyin. - Kendi güvenlik alanlarına sahip olması gereken alanları/işlemleri belirleyin.
Her biri için tamamen yeni bir politika yazmanız gerekecektir. Tümü
örneğin
init
alan adından ortaya çıkan hizmetlerin sahip olmalıdır. Aşağıdaki komutlar, çalışmaya devam eden komutların ortaya çıkarılmasına yardımcı olur (ancak TÜMÜ aşağıdaki hizmetlerin uygulanması gerekir):
adb shell su -c ps -Z | grep init
adb shell su -c dmesg | grep 'avc: '
init.device.rc
alan adını inceleyin ve sahip değiller. Müşterilerinizin Google Hesabı'nda erken veyainit
veya aksi takdirde,init
erişimlerini kendi kendi politikanıza ihtiyaç duyabilirsiniz.BOARD_SEPOLICY_*
özelliğini kullanmak içinBOARD_CONFIG.mk
uygulamasını kurun değişkenlerine karşılık gelir. Bkz. BENİOKU kurulumla ilgili ayrıntılı bilgi içinsystem/sepolicy
adresini ziyaret edin.- init.device.rc ve fstab.device dosyasını inceleyin ve
her
mount
kullanımının doğru bir şekilde etiketli dosya sistemi veyacontext= mount
seçeneğinin belirtiliyor. - Her redde gözden geçirin ve her birinin doğru şekilde ele alınması için SELinux politikası oluşturun. Görüntüleyin Özelleştirme bölümündeki örneklere göz atın.
AOSP'deki politikalarla başlamalı ve daha sonra bunları geliştirmek için özelleştirebilirsiniz. Politika stratejisi hakkında daha fazla bilgi ve daha ayrıntılı incelemek için bkz. SELinux Politikası yazma.
Kullanım örnekleri
Kendi öykünüzü tasarlarken göz önünde bulundurmanız gereken istismarlara dair spesifik örnekleri burada bulabilirsiniz yazılımı ve ilişkili SELinux politikaları:
Sembolik bağlantılar - Sembolik bağlantılar dosya olarak göründüğünden genellikle
dosyalar olarak okunur. Bu da kötüye kullanımlara yol açabilir. Örneğin bazı ayrıcalıklı
init
gibi bileşenler belirli dosyaların izinlerini değiştirir,
bazı durumlarda
çok açık olabilir.
Saldırganlar daha sonra bu dosyaları, kontrol ettikleri koddaki sembolik bağlantılarla değiştirebilir saldırganın rastgele dosyaların üzerine yazmasına izin verir. Ancak ne yazık ki uygulama sembolik bir bağlantıyı hiçbir zaman taşımaz; bunu yapmasını yasaklayabilirsiniz daha fazla bilgi edindiniz.
Sistem dosyaları - Sistemdeki dosyaların sınıfını
yalnızca sistem sunucusu tarafından değiştirilmelidir. Yine de netd
tarihinden beri,
init
ve vold
kök olarak çalışır, erişebilir
bu sistem dosyalarını kullanabilirsiniz. Yani, netd
hesabının güvenliği ihlal edilirse
güvenlik ihlaline sebep olabilir.
SELinux ile bu dosyaları sistem sunucusu veri dosyaları olarak tanımlayabilirsiniz.
Bu nedenle, okuma/yazma erişimi olan tek alan adı sistem sunucusudur.
netd
hesabının güvenliği ihlal edilmiş olsa bile alan adları
sistem sunucusu alanına erişebilir ve kök olarak çalıştırılsa da bu sistem dosyalarına erişebilir.
Uygulama verileri: Başka bir örnek de kök olarak çalıştırılmalıdır. Bu inanılmaz Alakasız belirli alan adları gibi geniş kapsamlı onaylar yapılabileceği için uygulama verilerine erişimi kısıtlanabilir.
setattr - chmod
ve benzeri komutlar için
chown
gibi, ilişkili olduğu dosya kümesini
alan adı setattr
işlemini gerçekleştirebilir. Bunun dışındaki herhangi bir şey
kökten bile olsa bu değişikliklerin uygulanması yasaktır. Yani bir uygulama,
Etiketlenenlere kıyasla chmod
ve chown
app_data_files
ancak shell_data_files
değil
veya system_data_files
.