Satıcı Başlatma

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 sistem/satıcı ayrımında büyük bir boşluğa neden olur, çünkü satıcı komut dosyaları, kararlı sistem-satıcı uygulama ikili arayüzünün (ABI) bir parçasını oluşturmayan dosyalara, özelliklere vb. erişmesi için talimat verebilir.

Vendor init, /vendor bulunan komutları satıcıya özel izinlerle çalıştırmak için ayrı bir güvenliği geliştirilmiş Linux (SELinux) etki alanı vendor_init kullanarak bu açığı kapatmak üzere tasarlanmıştır.

Mekanizma

Satıcı init, SELinux bağlamı u:r:vendor_init:s0 ile önyükleme sürecinin başlarında init'in bir alt sürecini ç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 kararlı sistem satıcısı ABI'nin parçası olan dosyalar, özellikler vb. ile sınırlıdır.

Init, yüklediği her betiği, yolunun /vendor ile başlayıp başlamadığını görmek için kontrol eder ve eğer öyleyse, onu, komutlarının satıcı init bağlamında çalıştırılması gerektiğine dair bir göstergeyle etiketler. Her init yerleşikine, komutun satıcı init alt sürecinde çalıştırılması gerekip gerekmediğini belirten bir boolean açıklaması eklenir:

  • Dosya sistemine erişen komutların çoğu, satıcı init alt sürecinde çalıştırılacak şekilde açıklanmıştır ve bu nedenle satıcı init SEPolicy'ye tabidir.
  • Dahili başlatma durumunu etkileyen komutların çoğu (örneğin, hizmetlerin başlatılması ve durdurulması) normal başlatma süreci içinde çalıştırılır. Bu komutlar, bir satıcı betiğinin onları kendi SELinux dışı izin işlemlerini yapmaya çağırdığı konusunda bilgilendirilir.

İnit'in ana işlem döngüsü, bir komutun satıcı alt işleminde çalıştırılacak şekilde açıklanması ve bir satıcı komut dosyasından kaynaklanması durumunda, bu komutun, komutu çalıştıran satıcı init alt işlemine süreçler arası iletişim (IPC) yoluyla gönderilip gönderilmediğine dair bir kontrol içerir. ve sonucu init'e geri gönderir.

Vendor Init'i kullanma

Vendor init varsayılan olarak etkindir ve kısıtlamaları /vendor bölümünde bulunan tüm init komut dosyalarına uygulanır. Vendor init, komut dosyaları zaten yalnızca sistem dosyalarına, özelliklerine 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 olan komutlar, çekirdek günlüğünde (dmesg ile görünür) init'ten başarısızlığı belirten bir satıra sahiptir. SELinux ilkesi nedeniyle başarısız olan herhangi bir başarısız komuta bir SELinux denetimi eşlik eder. SELinux denetimini içeren bir 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 oluyorsa (örneğin, komutun bir sistem dosyasına veya özelliğine erişmesi gibi), komutun yalnızca kararlı arayüzlerden geçerek Tiz dostu bir şekilde yeniden uygulanması gerekir. Neverallow kuralları, kararlı sistem sağlayıcısı ABI'nin parçası olmayan sistem dosyalarına erişim izinlerinin eklenmesini engeller.
  • SELinux etiketi yeniyse ve vendor_init.te sisteminde halihazırda izinler verilmemişse veya Neverallow kuralları aracılığıyla izinler hariç tutulmamışsa, yeni etikete cihaza özgü vendor_init.te dosyasında izinler verilebilir.

Android 9'dan önce başlatılan cihazlar için, cihaza özel vendor_init.te dosyasına data_between_core_and_vendor_violators type özelliğinin eklenmesiyle asla izin verme kuralları atlanabilir.

Kod Konumları

Satıcı init IPC'sinin mantığının büyük kısmı system/core/init/subcontext.cpp dosyasındadır.

Komut tablosu system/core/init/builtins.cpp dosyasındaki BuiltinFunctionMap sınıfındadır ve komutun satıcı init alt sürecinde çalıştırılması gerekip gerekmediğini belirten ek açıklamalar içerir.

Satıcı başlatma için SEPolicy, system/sepolicy'deki özel ( system/sepolicy/private/vendor_init.te ) ve genel ( system/sepolicy/public/vendor_init.te ) dizinlerine bölünmüştür.