Başlatma işlemi neredeyse sınırsız izinlere sahiptir ve önyükleme işlemi sırasında sistemi başlatmak için hem sistem hem de satıcı bölümlerinden gelen giriş komut dosyalarını kullanır. Bu erişim, Tiz sistemi / satıcı bölünmesinde büyük bir deliğe neden olur; çünkü satıcı komut dosyaları, kararlı sistem satıcısı uygulama ikili arabiriminin (ABI) bir parçasını oluşturmayan dosyalara, özelliklere vb. Erişmeye komut verebilir.
Satıcı init , satıcıya özgü izinlerle
/vendor bulunan komutları çalıştırmak için ayrı bir güvenliği geliştirilmiş Linux (SELinux) etki alanı
vendor_init kullanarak bu deliği kapatmak üzere tasarlanmıştır.
mekanizma
Satıcı init, önyükleme işleminin başlangıcında SELinux bağlamı
u:r:vendor_init:s0 olan bir init alt işlemini çatallar. Bu SELinux bağlamı, varsayılan init bağlamından önemli ölçüde daha az izne sahiptir ve erişimi satıcıya özgü veya sabit sistem satıcısı ABI'nın bir parçası olan dosyalar, özellikler vb. İle sınırlıdır.
Init, yolunun
/vendor ile başlayıp başlamadığını görmek için yüklediği her komut dosyasını kontrol eder ve eğer öyleyse, komutlarını satıcı init bağlamında çalıştırılması gerektiğini gösteren bir işaretle etiketler. Her init yerleşiği, komutun satıcı init alt işleminde çalıştırılıp çalıştırılmayacağını belirten bir boole ile açıklanır:
- Dosya sistemine erişen komutların çoğu satıcı init alt işleminde çalıştırılacak şekilde açıklanır ve bu nedenle satıcı init SEPolicy'ye tabi tutulur.
- Dahili başlatma durumunu etkileyen çoğu komut (örneğin, hizmetleri başlatma ve durdurma) normal başlatma işlemi içinde çalıştırılır. Bu komutlar, bir satıcı komut dosyasının kendi SELinux dışı izin işlemlerini yapmaya çağırdığını bildirir.
İnit'in ana işleme döngüsü, bir komutun satıcı alt işleminde çalıştırılacağı açıklanırsa ve bir satıcı komut dosyasından kaynaklanırsa, bu komutun, komutları çalıştıran satıcı init alt işlemine süreçler arası iletişim (IPC) aracılığıyla gönderildiğini kontrol eder. ve sonucu tekrar init'e gönderir.
Satıcı İlkesini Kullanma
Satıcı init varsayılan olarak etkindir ve kısıtlamaları
/vendor bölümünde bulunan tüm init komut dosyaları için geçerlidir. Satıcı init'i, komut dosyaları zaten yalnızca sistemlere, özelliklere vb. Erişmeyen satıcılar için şeffaf olmalıdır.
Ancak, belirli bir satıcı komut dosyasındaki komutlar satıcı başlatma kısıtlamalarını ihlal ederse, komutlar başarısız olur. Başarısız komutlar, çekirdek günlüğünde (dmesg ile görünür) init'ten başarısızlığı gösteren bir satır içerir. SELinux denetimi, SELinux ilkesi nedeniyle başarısız olan tüm başarısız komutlara eşlik eder. SELinux denetimi dahil hata örneği:
type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0 init: Command 'write /data/nfc/bad_file_access 1234' action=boot (/vendor/etc/init/hw/init.walleye.rc:422) took 2ms and failed: Unable to write to file '/data/nfc/bad_file_access': open() failed: Permission denied
Bir komut başarısız olursa, iki seçenek vardır:
- Komut, amaçlanan bir kısıtlama nedeniyle başarısız olursa (komut bir sistem dosyasına veya özelliğe erişiyorsa), komutun yalnızca Tiz dostu bir şekilde, yalnızca kararlı arabirimlerden geçerek yeniden uygulanması gerekir. Neverallow kuralları, kararlı sistem sağlayıcısı ABI'nın bir parçası olmayan sistem dosyalarına erişmek için izin eklenmesini önler.
- SELinux etiketi
vendor_init.teve sistem
vendor_init.tesisteminde
vendor_init.teveya
vendor_init.tekuralları üzerinden izin verilmeyen izinler
vendor_init.te, yeni etikete aygıta özgü
vendor_init.teizinleri
vendor_init.te.
Android 9'dan önce başlatılan cihazlar için, aygıta özgü
vendor_init.te dosyasına
data_between_core_and_vendor_violators typeat özniteliği eklenerek
data_between_core_and_vendor_violators kuralları atlanabilir.
Kod Konumları
Satıcı init IPC mantığının büyük kısmı system / core / init / subcontext.cpp dosyasındadır .
Komutlar tablosu system / core / init / builtins.cpp içindeki
BuiltinFunctionMap sınıfındadır ve komutun satıcı init alt
BuiltinFunctionMap çalıştırılması gerekip gerekmediğini gösteren ek açıklamalar içerir.