Inisit Vendor

Proses init memiliki izin yang hampir tidak dibatasi dan menggunakan skrip input dari baik partisi sistem dan vendor untuk menginisialisasi sistem selama booting {i>checkout<i}. Akses ini menyebabkan lubang besar dalam sistem/vendor Treble, karena skrip vendor dapat menginstruksikan init untuk mengakses file, properti, dll. yang tidak merupakan bagian dari antarmuka biner aplikasi (ABI) dari vendor sistem stabil.

Init vendor dirancang untuk menutup lubang ini dengan menggunakan domain Linux (SELinux) vendor_init yang ditingkatkan keamanannya untuk dijalankan yang ditemukan di /vendor dengan izin khusus vendor.

Mekanisme

Init vendor membuat subproses init di awal proses booting dengan Konteks SELinux u:r:vendor_init:s0. Konteks SELinux ini memiliki izin akses jauh lebih sedikit dibandingkan konteks init {i>default<i} dan aksesnya terbatas pada file, properti, dll. yang merupakan vendor tertentu atau bagian dari ABI vendor sistem yang stabil.

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

  • Sebagian besar perintah yang mengakses sistem file dianotasi untuk dijalankan di vendor init subproses dan karenanya 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 dibuat menyadari bahwa skrip vendor memanggil mereka untuk melakukan operasi non-SELinux mereka sendiri penanganan izin akses.

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

Menggunakan Init Vendor

Init vendor diaktifkan secara default dan pembatasannya berlaku untuk semua skrip init yang ada di partisi /vendor. Init vendor harus transparan ke vendor yang skripnya sudah tidak mengakses file hanya sistem, properti, dll.

Namun, jika perintah dalam skrip vendor tertentu melanggar inisialisasi vendor pembatasan, perintah akan gagal. Perintah yang gagal memiliki garis di kernel log (terlihat dengan dmesg) dari init yang menunjukkan kegagalan. Audit SELinux menyertai perintah yang gagal yang gagal karena kebijakan SELinux. Contoh terjadinya 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 mengakses file sistem atau properti), perintahnya harus diterapkan kembali dengan cara yang ramah Treble, hanya melalui antarmuka yang stabil. Aturan tak pernah mencegah penambahan izin untuk mengakses file sistem yang tidak dari ABI vendor sistem stabil.
  • Jika label SELinux masih baru dan belum diberi izin di vendor_init.te sistem atau izin yang dikecualikan melalui peraturan tidak diizinkan aturan, label baru dapat diberi izin di aturan khusus perangkat vendor_init.te.

Untuk perangkat yang diluncurkan sebelum Android 9, aturan Neverallows dapat diabaikan oleh menambahkan atribut jenis data_between_core_and_vendor_violators ke file vendor_init.te khusus perangkat.

Lokasi Kode

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

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

SEPolicy untuk init vendor dibagi menjadi pribadi (system/sepolicy/private/vendor_init.te) dan publik (system/sepolicy/public/vendor_init.te) direktori dalam {i>system/sepolicy<i}.