Tedarikçi firma init

init 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 tedarikçi bölümlerindeki giriş komut dosyalarını kullanır. Tedarikçi firma komut dosyaları, init'e kararlı sistem tedarikçi firma uygulama ikili program arayüzünün (ABI) bir parçası olmayan dosyalara, özelliklere vb. erişmesini talimat verebileceğinden bu erişim, Treble sistem/tedarikçi firma bölmesindeki büyük bir boşluğa neden olur.

Tedarikçi firma init, /vendor'da bulunan komutları tedarikçi firmaya özgü izinlerle çalıştırmak için ayrı bir güvenlik artırılmış Linux (SELinux) alanı vendor_init kullanarak bu açığı kapatmak üzere tasarlanmıştır.

Mekanizma

Tedarikçi firma init, SELinux bağlamı u:r:vendor_init:s0 ile başlatma sürecinin başlarında init alt sürecini çatallar. Bu SELinux bağlamının, varsayılan init bağlamına kıyasla çok daha az izni vardır ve erişimi, tedarikçiye özel veya kararlı sistem tedarikçisi ABI'sinin bir parçası olan dosyalarla, mülklerle vb. sınırlıdır.

Init, yüklediği her komut dosyasının yolunun /vendor ile başlayıp başlamadığını kontrol eder. Başlıyorsa komutlarının tedarikçi firma init bağlamında çalıştırılması gerektiğini belirten bir işaretle etiketler. Her yerleşik init, komutun tedarikçi firma init alt sürecinde çalıştırılıp çalıştırılmayacağını belirten bir boole değeriyle ek açıklamaya sahiptir:

  • Dosya sistemine erişen komutların çoğu, tedarikçi firmanın init alt işleminde çalışacak şekilde ek açıklamayla belirtilir ve bu nedenle tedarikçi firmanın init SEPolicy'sine tabidir.
  • Dahili ilk başlatma durumunu etkileyen çoğu komut (ör. hizmetleri başlatma ve durdurma), normal ilk başlatma işlemi içinde çalıştırılır. Bu komutlara, bir tedarikçi komut dosyasının kendi SELinux dışı izinlerini yönetmek için onları çağırdığı bildirilir.

init'in ana işlem döngüsü, bir komutun tedarikçi alt sürecinde çalışacak şekilde eklendiği ve bir tedarikçi komut dosyasından geldiği durumlarda, bu komutun işlemler arası iletişim (IPC) aracılığıyla tedarikçi init alt sürecine gönderilmesini ve bu sürecin komutu çalıştırıp sonucu init'e geri göndermesini sağlayan bir kontrol içerir.

Tedarikçi firmanın başlatma işlevini kullanma

Tedarikçi firma ilklendirmesi varsayılan olarak etkindir ve kısıtlamaları /vendor bölümündeki tüm ilklendirme komut dosyaları için geçerlidir. Tedarikçi firmanın başlatma işlemi, komut dosyaları zaten yalnızca sistem dosyalarına, mülklerine vb. erişmeyen tedarikçiler için şeffaf olmalıdır.

Ancak belirli bir tedarikçi firma komut dosyasında tedarikçi firma başlatma kısıtlamalarını ihlal eden komutlar varsa komutlar başarısız olur. Başarısız komutlar, init'ten gelen ve hatayı belirten bir satırla çekirdek günlüğünde (dmesg ile görülebilir) yer alır. SELinux politikası nedeniyle başarısız olan tüm komutlar SELinux denetimiyle birlikte gönderilir. SELinux denetimi içeren bir hatanın ö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, istenen bir kısıtlama nedeniyle başarısız oluyorsa (ör. komut bir sistem dosyasına veya mülküne erişiyorsa) komut, yalnızca kararlı arayüzler üzerinden Treble'a uygun bir şekilde yeniden uygulanmalıdır. Asla izin verme kuralları, kararlı sistem tedarikçisi ABI'sinin parçası olmayan sistem dosyalarına erişme izinlerinin eklenmesini engeller.
  • SELinux etiketi yeniyse ve sistem vendor_init.te içinde izin verilmemişse veya neverallow kuralları aracılığıyla izinler hariç tutulmamışsa yeni etikete cihaza özgü vendor_init.te içinde izin verilebilir.

Android 9'dan önce kullanıma sunulan cihazlarda, cihaza özel vendor_init.te dosyasına data_between_core_and_vendor_violators türü özelliği eklenerek neverallows kuralları atlanabilir.

Kod konumları

Tedarikçi firmanın ilk başlatma 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ında BuiltinFunctionMap sınıfında bulunur ve komutun tedarikçi firma init alt sürecinde çalışıp çalışmaması gerektiğini belirten ek açıklamalar içerir.

Tedarikçi firma init için SEPolicy, system/sepolicy içindeki özel (system/sepolicy/private/vendor_init.te) ve herkese açık (system/sepolicy/public/vendor_init.te) dizinlerine bölünür.