Inisi Penjual

Proses init memiliki izin yang hampir tidak terbatas dan menggunakan skrip input dari sistem dan partisi vendor untuk menginisialisasi sistem selama proses boot. Akses ini menyebabkan lubang besar dalam sistem Treble/pemisahan vendor, karena skrip vendor mungkin menginstruksikan init untuk mengakses file, properti, dll. yang bukan merupakan bagian dari antarmuka biner aplikasi sistem-vendor (ABI) yang stabil.

Vendor init dirancang untuk menutup lubang ini dengan menggunakan vendor_init domain Linux (SELinux) yang ditingkatkan keamanannya untuk menjalankan perintah yang ditemukan di /vendor dengan izin khusus vendor.

Mekanisme

Vendor init memotong subproses init di awal proses boot dengan konteks SELinux u:r:vendor_init:s0 . Konteks SELinux ini memiliki izin yang jauh lebih sedikit daripada konteks init default dan aksesnya terbatas pada file, properti, dll. yang khusus untuk vendor atau bagian dari ABI vendor sistem yang stabil.

Init memeriksa setiap skrip yang dimuat untuk melihat apakah jalurnya dimulai dengan /vendor dan jika demikian, menandainya dengan indikasi bahwa perintahnya harus dijalankan dalam konteks init vendor. Setiap init bawaan dianotasi dengan boolean yang menentukan apakah perintah harus dijalankan di subproses init vendor atau tidak:

  • Sebagian besar perintah yang mengakses sistem file dijelaskan untuk dijalankan di subproses init vendor dan oleh karena itu tunduk pada SEPolicy init vendor.
  • Sebagian besar perintah yang memengaruhi status init internal (misalnya, memulai dan menghentikan layanan) dijalankan dalam proses init normal. Perintah-perintah ini disadarkan bahwa skrip vendor memanggil mereka untuk melakukan penanganan izin non-SELinux mereka sendiri.

Loop pemrosesan utama init berisi pemeriksaan bahwa jika sebuah perintah dianotasi untuk dijalankan di subproses vendor dan berasal dari skrip vendor, perintah itu dikirim melalui komunikasi antar-proses (IPC) ke subproses init vendor, yang menjalankan perintah dan mengirimkan hasilnya kembali ke init.

Menggunakan Vendor Init

Vendor init diaktifkan secara default dan batasannya berlaku untuk semua skrip init yang ada di partisi /vendor . Vendor init harus transparan kepada vendor yang skripnya sudah tidak mengakses file sistem saja, properti, dll.

Namun, jika perintah dalam skrip vendor tertentu melanggar batasan init vendor, perintah tersebut akan gagal. Perintah yang gagal memiliki baris di log kernel (terlihat dengan dmesg) dari init yang menunjukkan kegagalan. Audit SELinux menyertai setiap perintah gagal yang gagal karena kebijakan SELinux. Contoh kegagalan termasuk audit SELinux:

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

Jika perintah gagal, ada dua opsi:

  • Jika perintah gagal karena pembatasan yang dimaksudkan (seperti jika perintah mengakses file sistem atau properti), perintah harus diimplementasikan kembali dengan cara yang ramah Treble, hanya melalui antarmuka yang stabil. Aturan Neverallow mencegah penambahan izin untuk mengakses file sistem yang bukan bagian dari ABI vendor sistem yang stabil.
  • Jika label SELinux baru dan belum diberikan izin di sistem vendor_init.te atau dikecualikan izin melalui aturan neverallow, label baru dapat diberikan izin di vendor_init.te khusus perangkat.

Untuk perangkat yang diluncurkan sebelum Android 9, aturan neverallows dapat dilewati dengan menambahkan data_between_core_and_vendor_violators ke file vendor_init.te khusus perangkat.

Lokasi Kode

Sebagian besar logika untuk vendor init IPC ada di system/core/init/subcontext.cpp .

Tabel perintah ada di kelas BuiltinFunctionMap di system/core/init/builtins.cpp dan menyertakan anotasi yang menunjukkan apakah perintah harus dijalankan di subproses init vendor.

SEPolicy untuk vendor init dibagi menjadi direktori private (system/sepolicy/private/vendor_init.te ) dan public ( system/sepolicy/public/vendor_init.te ) di system/sepolicy.