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, başlatma işleminin başlarında SELinux bağlamı u:r:vendor_init:s0
ile bir alt başlatma işlemi başlatır. 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ı kontrol ederek yolunun /vendor
ile başlayıp başlamadığını belirler. Bu durumda, komutlarının tedarikçi firma başlangıç bağlamında çalıştırılması gerektiğini belirten bir uyarıyla etiketler. Her bir init yerleşik, komutun tedarikçi firma init alt işleminde çalıştırılıp çalıştırılmayacağını belirten bir boole açıklamasıyla gösterilir:
- 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 başlatma durumunu etkileyen çoğu komut (ör. hizmetleri başlatma ve durdurma) normal başlatma işlemi içinde çalışır. Bu komutlara, bir tedarikçi komut dosyasının kendi SELinux dışı izinlerini yönetmek için onları çağırdığının bilgisi verilir.
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 firma başlatma belgesini kullan
Tedarikçi firma başlatma varsayılan olarak etkindir ve kısıtlamaları /vendor
bölümünde bulunan tüm başlatma komut dosyaları için geçerlidir. Tedarikçi firma başlatma işlemi, komut dosyaları yalnızca sistem dosyalarına, özelliklerine vb. erişmeyen tedarikçilere karşı ş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 başarısız komutlara SELinux denetimi eşlik eder. 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, amaçlanan bir kısıtlama nedeniyle başarısız oluyorsa (komutun bir sistem dosyasına veya özelliğine erişmek gibi) yalnızca kararlı arayüzlerden geçerek Tiz uyumlu bir şekilde yeniden uygulanması gerekir. "Hiçbir zaman izin verme" kuralları, kararlı sistem tedarikçisi ABI'sının parçası olmayan sistem dosyalarına erişim izni eklenmesini engeller.
- SELinux etiketi yeniyse ve sistem
vendor_init.te
'te izin verilmemişse veya neverallow kurallarıyla izinler hariç tutulmamışsa yeni etikete cihaza özgüvendor_init.te
'te izin verilebilir.
Android 9'dan önce kullanıma sunulan cihazlarda, cihaza özel vendor_init.te
dosyasına data_between_core_and_vendor_violators
type özelliği eklenerek hiçbir zaman izin verilmez 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 ayrılmıştır.