SELinux'u uygulama

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. Bkz Destek belgeleri önerilen kaynaklar için.

Anahtar dosyalar

SELinux'u etkinleştirmek için entegre Android çekirdek son ve sonra dosyaları bulunan dahil sistemi / sepolicy dizininde. Derlendiğinde, bu dosyalar SELinux çekirdek güvenlik politikasını oluşturur ve yukarı akış Android işletim sistemini kapsar.

Genel olarak, değişiklik olmamalı system/sepolicy dosyaları doğrudan. Bunun yerine, kendi cihaza özel politika dosyaları eklemek veya düzenlemek /device/ manufacturer / device-name /sepolicy dizininde. 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 kamu sepolicy ayrılması ve daha yüksek hakkında daha fazla bilgi için, bkz 8.0+ Android'de uyarlama SEPolicy . Android sürümü ne olursa olsun, yine de şu dosyaları değiştiriyorsunuz:

Politika dosyaları

Dosyalar ile bu son *.te alanlar ve bunların etiketlerini tanımlamak SELinux'un ilke kaynak dosyalarıdır. İçeri Yeni politika dosyaları oluşturmak gerekebilir /device/ manufacturer / device-name /sepolicy ama mümkünse mevcut dosyaları güncelleştirmek için çalışmalısınız.

bağlam dosyaları

Bağlam dosyaları, nesneleriniz için etiketler belirlediğiniz yerdir.

  • file_contexts dosyalara atar etiketleri 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. Yeni uygulamak için file_contexts , dosya sistemi görüntüsünü yeniden oluşturma veya çalıştırmak restorecon relabeled edilecek dosyada. Yükseltmeleri üzerinde yapılan değişiklikler file_contexts otomatik yükseltme parçası olarak sisteme ve userdata bölümleri uygulanır. Değişiklikler de otomatik olarak ekleyerek diğer bölümleri için yükseltme uygulanabilir restorecon_recursive da init çağrıları. board bölüm sonra .Rc dosya okuma-yazma monte olmuştur.
  • genfs_contexts gibi dosya sistemleri için atar etiketler, proc veya vfat genişletilmiş özelliklerini desteklemez. 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. Spesifik etiketler de gibi spesifik bağlar, atanabilir vfat kullanarak context=mount seçeneği.
  • property_contexts Android sistem özelliklerine atar etiketleri süreçleri bunları ayarlayabilirsiniz denetlemek için. Bu yapılandırma ile okunur init başlatma sırasında sürecin.
  • service_contexts süreçler eklemek (kayıt) ne kontrol edebilir ve bulmak (arama) hizmeti için bir bağlayıcı referans hizmet bağlayıcı Android'e atar etiketler. Bu yapılandırma ile okunur servicemanager başlatma sırasında sürecin.
  • seapp_contexts uygulama süreçlerine ve atar etiket /data/data dizinleri. Bu yapılandırma ile okunur zygote her uygulama başlatma ve bu sürece installd başlangıç sırasında.
  • mac_permissions.xml atar bir seinfo onların imzası ve isteğe bağlı olarak paket adına göre uygulamalara etiketi. seinfo etiketi sonra bir anahtar olarak kullanılabilir seapp_contexts bununla tüm uygulamalar için belirli bir etiket atamak için dosyanın seinfo etiketi. Bu yapılandırma ile okunur system_server başlatma sırasında.

BoardConfig.mk makefile

Düzenleme ya da politika ve bağlam dosyaları ekleyerek sonra, güncellemek /device/ manufacturer / device-name /BoardConfig.mk başvurmak için makefile sepolicy alt dizin ve her yeni politika dosyası. Hakkında daha fazla bilgi için BOARD_SEPOLICY değişkenler, bkz system/sepolicy/README dosyası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 bunlardan açıklandığı gibi Android işletim sistemi için kendi eklemeler karşılamak için SELinux'un politikaları özelleştirebilirsiniz Özelleştirme veya kaplı olarak mevcut ayarlarınızı doğrulamak Doğrulama .

Yeni ilke dosyaları ve BoardConfig.mk güncellemeleri yapıldığında, yeni ilke ayarları otomatik olarak son çekirdek ilke dosyasına yerleştirilir. Sepolicy cihazının üzerine kuruludur hakkında daha fazla bilgi için bkz Bina sepolicy .

uygulama

SELinux'u kullanmaya başlamak için:

  1. Çekirdek SELinux'u etkinleştirme: CONFIG_SECURITY_SELINUX=y
  2. : Böylece kernel_cmdline parametreyi değiştirin
    BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
    Bu yalnızca cihaz için politika ilk geliştirme 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.
  3. 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 Açık
    adb shell su -c dmesg | grep denied | audit2allow -p out/target/product/BOARD/root/sepolicy
    
    : Ubuntu 12.04 Açık
    adb pull /sys/fs/selinux/policy
    adb logcat -b all | audit2allow -p policy
    
  4. Benzeyen uyarıları çıkışını değerlendirin init: Warning! Service name needs a SELinux domain defined; please fix! Bkz Doğrulama talimatlar ve araçlar için.
  5. Etiketlenmesi gereken cihazları ve diğer yeni dosyaları belirleyin.
  6. Nesneleriniz için mevcut veya yeni etiketleri kullanın. Bak *_contexts dosyaları yenisini atamak için etiket anlamlarının nasıl işler önceden etiketlenmiş ve kullanım bilgisini görmek için. İ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.
  7. 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. Daha çıktı Tüm hizmetler init örneğin, kendi sahip olmalıdır. 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
    
    adb shell su -c dmesg | grep 'avc: '
    
  8. Gözden init. device .rc etki alanı türü yoktur herhangi alanlarını belirlemek üzere. İçin kurallar ekleyerek önlemek için erken geliştirme sürecinde onlara bir etki alanını ver init veya başka kafa karıştırıcı init kendi politikasında olanlar ile erişir.
  9. Yukarı ayarlayın BOARD_CONFIG.mk kullanmak BOARD_SEPOLICY_* değişkenleri. Bkz README içinde system/sepolicy bu ayarlama konusunda ayrıntılı bilgi için.
  10. initi inceleyin. device .Rc ve fstab. device dosyası ve emin her faydalanmak mount bir düzgün etiketlenmiş dosya sistemine ya da karşılık gelir context= mount belirtilen seçeneği.
  11. Her reddetmeyi gözden geçirin ve her birini uygun şekilde işlemek için SELinux politikası oluşturun. Örneklere bakın Özelleştirme .

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ımların bazılarını daha yakından bakmak için bkz Yazma SELinux'un Politikası'nı .

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:

Symlinks - symlinks dosyaları olarak göründüğünden, genellikle patlatır yol açabilir dosyaları olarak okunur. Örneğin, gibi bazı ayrıcalıklı bileşenler, init , aşırı açık olmak bazen bazı dosyaların izinlerini değiştirin.

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ı - Sistem sunucusu tarafından sadece modifiye edilmelidir sistem dosyalarının sınıfı düşünün. Yine de, çünkü netd , init ve vold root olarak çalıştırmak, onlar bu sistem dosyalara erişebilir. Yani eğer netd zarar gelmesinin, bu o dosyaları ve potansiyel olarak sistem sunucusu kendisi 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. Bile netd zarar gelmesinin, bu sistem sunucu etki alanına etki geçemedi ve kök olarak çalışır halde bu sistem dosyalarına erişir.

Uygulama verileri - Başka bir örnek root olarak çalıştırmak gerekir, ancak erişim uygulama verileri almak olmamalı fonksiyonların sınıftı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 - gibi komutlar için chmod ve chown , ilişkilendirilmiş alanı gerçekleştirebilirsiniz dosyaları kümesini tanımlamak olabilir setattr . Bunun dışındaki herhangi bir şey, kök tarafından bile bu değişikliklerden yasaklanabilir. Bir uygulama aday olabileceğini Yani chmod ve chown işaretlenmiş olanlar karşı app_data_files ancak shell_data_files veya system_data_files .