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 perangkatvendor_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}.