Google, Siyah topluluklar için ırksal eşitliği ilerletmeye kararlıdır. Nasıl olduğunu gör.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Tedarikçi Init

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.te ve sistem vendor_init.te sisteminde vendor_init.te veya vendor_init.te kuralları üzerinden izin verilmeyen izinler vendor_init.te , yeni etikete aygıta özgü vendor_init.te izinleri 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.

Satıcı için SEPolicy init, sistem / sepolicy'deki özel ( sistem / sepolicy / private / vendor_init.te ) ve genel ( system / sepolicy / public / vendor_init.te ) dizinler arasında bölünür.