Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Vendor Init

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

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

Mekanisme

Vendor init memecah subproses init pada 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 sistem-vendor yang stabil.

Init memeriksa setiap skrip yang dimuatnya untuk melihat apakah pathnya dimulai dengan /vendor dan jika demikian, beri tag dengan indikasi bahwa perintahnya harus dijalankan dalam konteks init vendor. Setiap init builtin dianotasi dengan boolean yang menentukan apakah perintah harus dijalankan di subproses init vendor:

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

Loop pemrosesan utama init berisi cek bahwa jika suatu perintah dianotasi untuk berjalan di dalam 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 pembatasannya berlaku untuk semua skrip init yang ada di partisi /vendor . Vendor init harus transparan untuk vendor yang skripnya sudah tidak mengakses hanya file sistem, properti, dll.

Namun, jika perintah dalam skrip vendor yang diberikan melanggar batasan init vendor, perintah tersebut akan gagal. Perintah yang gagal memiliki baris di log kernel (terlihat dengan dmesg) dari init yang mengindikasikan kegagalan. Audit SELinux menyertai setiap perintah yang 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 batasan 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 adalah baru dan belum diberikan izin dalam sistem vendor_init.te atau izin yang dikecualikan melalui aturan Neverallow, label baru dapat diberikan izin di vendor_init.te khusus vendor_init.te .

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

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 di direktori private ( system / sepolicy / private / vendor_init.te ) dan publik ( system / sepolicy / public / vendor_init.te ) di system / sepolicy.