Tedarikçi Firma Başlatma

Başlatma sürecinde neredeyse sınırsız izinlere sahip olan bu işlem, sistemi başlatmak için hem sistem hem de satıcı bölümlendirmeleri bahsedeceğim. Bu erişim, Treble sisteminde/tedarikçi firma kısmında büyük bir deliğe neden olur. tedarikçi firma komut dosyaları, kontrol komut dosyalarından init alanına Bu, kararlı sistem-tedarikçi uygulaması ikili arayüzünün (ABI) bir parçasıdır.

Tedarikçi firma başlatması, bu deliği ayrı bir çalıştırılması için güvenlik açısından geliştirilmiş Linux (SELinux) alan adı vendor_init komutlarının sayısı /vendor içinde tedarikçiye özel izinlere sahip.

Mekanizma

Tedarikçi firma başlatma aşamasının başlarında, SELinux bağlamı u:r:vendor_init:s0. Bu SELinux bağlamı varsayılan başlangıç bağlamına göre çok daha az sayıda izne sahip. Bunlar tedarikçiye özgü veya tedarikçi firmaya özgü dosyalar, mülkler vb. ile sınırlı ABI'yi kullanabilirsiniz.

Init, yüklediği her bir komut dosyasını kontrol ederek yolunun /vendor ve etiketleniyorsa komutlarının tedarikçi firma başlangıç bağlamında çalıştırılmalıdır. Her init yerleşiki komutun, tedarikçi firma başlangıcında çalıştırılması gerekip gerekmediğini belirten boole alt işlem:

  • Dosya sistemine erişen çoğu komut, tedarikçi firmada çalışacak şekilde kodlanmıştır. Bu nedenle, tedarikçi firma init SEPolicy'ye tabi olur.
  • Dahili başlatma durumunu etkileyen çoğu komut (ör. başlatma ve durdurma) hizmetleri) normal başlatma sürecinde çalışır. Bu komutlar bir tedarikçi komut dosyasının kendi SELinux dışı işlemlerini yapmak için çağrıda bulunduğunu izinlerin nasıl işlediğini.

Başlatma işleminin ana işleme döngüsü, bir komutun ek açıklama kaynak kodlu bir tedarikçi firma komut dosyasından kaynaklandığı ve komutu, tedarikçi firmanın initüsüne işlem arası iletişim (IPC) aracılığıyla gönderilir komutu çalıştırarak sonucu yeniden inişe gönderir.

Vendor Init'i Kullanma

Tedarikçi firma başlatma özelliği varsayılan olarak etkindir ve kısıtlamaları tüm başlatma komut dosyaları için geçerlidir. /vendor bölümünde mevcut. Tedarikçi ilkesi şeffaf olmalıdır. komut dosyaları halihazırda yalnızca sistem dosyalarına erişmeyen özellikler vb.

Ancak belirli bir tedarikçi firma komut dosyasındaki komutlar, tedarikçi firma ilkesini ihlal ediyorsa komutlar başarısız olur. Başarısız komutların çekirdekte bir satırı var log (dmesg ile görünür) hatasını gösterir. SELinux denetimi SELinux politikası nedeniyle başarısız olan tüm başarısız komutlara eşlik eder. Örnek aşağıdaki adımları izleyin:

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, kasıtlı bir kısıtlama (örneğin, komutu bir sistem dosyasına veya mülküne erişim sağlıyorsa) komutun Tiz dostu bir şekilde yeniden uygulanır ve yalnızca kararlı arayüzlerden geçer. "Hiçbir zaman izin verme" kuralları, Bu, kararlı sistem tedarikçisi ABI'nın bir parçasıdır.
  • SELinux etiketi yeniyse ve sistem vendor_init.te veya hiçbir zaman izin verme aracılığıyla izinleri hariç tuttu yeni etikete, cihaza özgü vendor_init.te

Android 9'dan önce başlatılan cihazlarda izin vermeme kuralları, data_between_core_and_vendor_violators type özelliğini şunun içine ekleyerek: cihaza özel vendor_init.te dosyası.

Kod Konumları

IPC'yi sağlayan tedarikçi firmanın mantığının büyük kısmı system/core/init/subcontext.cpp içindedir.

Komut tablosu, system/core/init/builtins.cpp konumundaki BuiltinFunctionMap sınıfındadır. ve komutun tedarikçi firma üzerinde çalışması gerekip gerekmediğini belirten unutmayın.

Tedarikçi firma başlatmaya ilişkin SEPolicy, gizli (system/sepolicy/private/vendor_init.te) genelinde bölünür ve herkese açık (system/sepolicy/public/vendor_init.te) dizinleri de içerir.