Halaman ini membahas cara membangun kebijakan SELinux. Kebijakan SELinux dibuat dari
kombinasi kebijakan AOSP inti (platform) dan kebijakan khusus perangkat
(vendor). Alur build kebijakan SELinux untuk Android 4.4 hingga Android 7.0 menggabungkan semua fragmen sepolicy, lalu membuat file monolitik di direktori root. Artinya, vendor SoC dan produsen ODM memodifikasi
boot.img
(untuk perangkat non-A/B) atau system.img (untuk perangkat A/B) setiap kali kebijakan
diubah.
Di Android 8.0 dan yang lebih baru, kebijakan platform dan vendor dibuat secara terpisah.
SoC dan OEM dapat memperbarui bagian kebijakan mereka, membuat image mereka (seperti vendor.img dan boot.img), lalu memperbarui image tersebut secara terpisah dari update platform.
Namun, karena file kebijakan SELinux yang dimodularisasi disimpan di partisi /vendor, proses init harus memasang partisi system dan vendor lebih awal sehingga dapat membaca file SELinux dari partisi tersebut dan menggabungkannya dengan file SELinux inti di direktori system (sebelum memuatnya ke kernel).
File sumber
Logika untuk membangun SELinux ada di file berikut:
-
external/selinux: Project SELinux eksternal, digunakan untuk membangun utilitas command line HOST untuk mengompilasi kebijakan dan label SELinux.-
external/selinux/libselinux: Android hanya menggunakan subset projectlibselinuxeksternal bersama dengan beberapa penyesuaian khusus Android. Untuk mengetahui detailnya, lihatexternal/selinux/README.android. -
external/selinux/libsepol: -
external/selinux/checkpolicy: Compiler kebijakan SELinux (dapat dieksekusi host:checkpolicy,checkmodule, dandispol). Bergantung padalibsepol.
-
-
system/sepolicy: Konfigurasi kebijakan SELinux Android inti, termasuk file kebijakan dan konteks. Logika build sepolicy utama juga ada di sini (system/sepolicy/Android.mk).
Untuk mengetahui detail selengkapnya tentang file di system/sepolicy, lihat
File utama.
Android 7.x dan yang lebih lama
Bagian ini membahas cara kebijakan SELinux dibuat di Android 7.x dan yang lebih rendah.
Proses build untuk Android 7.x dan yang lebih lama
Kebijakan SELinux dibuat dengan menggabungkan kebijakan AOSP inti dengan penyesuaian khusus perangkat. Kebijakan gabungan kemudian diteruskan ke compiler kebijakan dan berbagai pemeriksa. Penyesuaian khusus perangkat dilakukan melalui
variabel BOARD_SEPOLICY_DIRS yang ditentukan dalam file
Boardconfig.mk khusus perangkat. Variabel build global ini berisi daftar direktori yang menentukan urutan penelusuran file kebijakan tambahan.
Misalnya, vendor SoC dan ODM masing-masing dapat menambahkan direktori, satu untuk setelan khusus SoC dan satu lagi untuk setelan khusus perangkat, guna membuat konfigurasi SELinux akhir untuk perangkat tertentu:
BOARD_SEPOLICY_DIRS += device/SoC/common/sepolicyBOARD_SEPOLICY_DIRS += device/SoC/DEVICE/sepolicy
Konten file file_contexts di system/sepolicy dan
BOARD_SEPOLICY_DIRS digabungkan untuk menghasilkan
file_contexts.bin di perangkat:

Gambar 1. Logika build SELinux.
File sepolicy terdiri dari beberapa file sumber:
- Teks biasa
policy.confdibuat dengan menggabungkansecurity_classes,initial_sids,*.tefile,genfs_contexts, danport_contextsdalam urutan tersebut. - Untuk setiap file (seperti
security_classes), kontennya adalah gabungan file dengan nama yang sama disystem/sepolicy/danBOARDS_SEPOLICY_DIRS. policy.confdikirim ke compiler SELinux untuk pemeriksaan sintaksis dan dikompilasi ke dalam format biner sebagaisepolicydi perangkat.
Gambar 2. File kebijakan SELinux.
File SELinux
Setelah dikompilasi, perangkat Android yang menjalankan 7.x dan yang lebih lama biasanya berisi file terkait SELinux berikut:
selinux_versionsepolicy: Output biner setelah menggabungkan file kebijakan (sepertisecurity_classes,initial_sids, dan*.te)file_contextsproperty_contextsseapp_contextsservice_contextssystem/etc/mac_permissions.xml
Untuk mengetahui detail selengkapnya, lihat Menerapkan SELinux.
Inisialisasi SELinux
Saat sistem melakukan booting, SELinux berada dalam mode permisif (dan bukan dalam mode pemberlakuan). Proses init melakukan tugas berikut:
- Memuat file
sepolicydari ramdisk ke kernel melalui/sys/fs/selinux/load. - Mengalihkan SELinux ke mode pemberlakuan.
- Menjalankan
re-exec()untuk menerapkan aturan domain SELinux ke dirinya sendiri.
Untuk mempersingkat waktu booting, lakukan re-exec() pada proses
init sesegera mungkin.
Android 8.0 dan yang lebih tinggi
Di Android 8.0, kebijakan SELinux dibagi menjadi komponen platform dan vendor untuk memungkinkan update kebijakan platform dan vendor yang independen sekaligus mempertahankan kompatibilitas.
Kebijakan keamanan platform dibagi lagi menjadi bagian pribadi platform dan publik platform untuk mengekspor jenis dan atribut tertentu ke penulis kebijakan vendor. Jenis/atribut publik platform dijamin akan dipertahankan sebagai API stabil untuk versi platform tertentu. Kompatibilitas dengan jenis/atribut publik platform sebelumnya dapat dijamin untuk beberapa versi menggunakan file pemetaan platform.
Proses build untuk Android 8.0
Kebijakan SELinux di Android 8.0 dibuat dengan menggabungkan bagian dari
/system dan /vendor. Logika untuk menyiapkannya
dengan tepat ada di
/platform/system/sepolicy/Android.bp.
Kebijakan ini ada di lokasi berikut:
| Lokasi | Berisi |
|---|---|
system/sepolicy/public |
Platform sepolicy API |
system/sepolicy/private |
Detail penerapan platform (dapat diabaikan vendor) |
system/sepolicy/vendor |
File kebijakan dan konteks yang dapat digunakan vendor (vendor dapat mengabaikannya) |
BOARD_SEPOLICY_DIRS |
Kebijakan keamanan vendor |
BOARD_ODM_SEPOLICY_DIRS (Android 9 dan yang lebih tinggi) |
Kebijakan keamanan ODM |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
system_ext sepolicy API |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
Detail penerapan system_ext (vendor dapat mengabaikan) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
Product sepolicy API |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
Detail penerapan produk (vendor dapat mengabaikan) |
Sistem build mengambil kebijakan ini dan menghasilkan komponen kebijakan system, system_ext, product, vendor, dan odm di partisi yang sesuai. Langkah-langkahnya meliputi:
- Mengonversi kebijakan ke format SELinux Common Intermediate Language (CIL), khususnya:
- Kebijakan platform publik (
system,system_ext,product) - Kebijakan gabungan pribadi dan publik
- Kebijakan publik, vendor, dan
BOARD_SEPOLICY_DIRS
- Kebijakan platform publik (
- Memberi versi kebijakan yang disediakan oleh publik sebagai bagian dari kebijakan vendor.
Gunakan kebijakan CIL publik yang dihasilkan untuk menentukan bagian mana dari kebijakan
BOARD_SEPOLICY_DIRSgabungan publik dan vendor yang harus diubah menjadi atribut yang ditautkan ke kebijakan platform. - Buat file pemetaan yang menghubungkan bagian platform dan vendor. Awalnya, hal ini hanya menautkan jenis dari kebijakan publik dengan atribut yang sesuai dalam kebijakan vendor; selanjutnya, hal ini juga memberikan dasar untuk file yang dipertahankan dalam versi platform mendatang, sehingga memungkinkan kompatibilitas dengan penargetan kebijakan vendor pada versi platform ini.
- Gabungkan file kebijakan (jelaskan solusi dalam perangkat dan yang telah dikompilasi).
- Menggabungkan kebijakan pemetaan, platform, dan vendor.
- Kompilasi file kebijakan biner output.
Kebijakan keamanan publik platform
Kebijakan keamanan publik platform mencakup semua yang ditentukan di bagian
system/sepolicy/public. Platform dapat mengasumsikan bahwa jenis dan atribut yang ditentukan dalam kebijakan publik adalah API yang stabil untuk versi platform tertentu. Bagian ini membentuk bagian sepolicy yang diekspor oleh platform tempat developer kebijakan vendor (yaitu, perangkat) dapat menulis kebijakan tambahan spesifik per perangkat.
Jenis diberi versi sesuai dengan versi kebijakan yang digunakan untuk menulis file vendor, yang ditentukan oleh variabel build PLATFORM_SEPOLICY_VERSION. Kebijakan publik yang diberi versi kemudian disertakan dengan kebijakan vendor dan (dalam bentuk aslinya) dalam kebijakan platform. Dengan demikian,
kebijakan akhir mencakup kebijakan platform pribadi, kebijakan sepolicy publik
platform saat ini, kebijakan khusus perangkat, dan kebijakan publik versi
yang sesuai dengan versi platform yang menjadi dasar penulisan kebijakan
perangkat.
Kebijakan keamanan pribadi platform
Kebijakan keamanan pribadi platform mencakup semua yang ditentukan di bagian
/system/sepolicy/private. Bagian kebijakan ini membentuk jenis, izin, dan atribut khusus platform yang diperlukan untuk fungsi platform. Nilai ini tidak diekspor ke penulis kebijakan perangkat dan vendor. Penulis kebijakan non-platform tidak boleh menulis ekstensi kebijakan berdasarkan jenis, atribut, dan aturan yang ditentukan dalam sepolicy pribadi platform. Selain itu,
aturan ini dapat diubah atau mungkin hilang sebagai bagian dari update khusus framework.
Pemetaan pribadi platform
Pemetaan pribadi platform mencakup pernyataan kebijakan yang memetakan atribut yang diekspos dalam kebijakan publik platform versi platform sebelumnya ke jenis konkret yang digunakan dalam kebijakan keamanan publik platform saat ini. Hal ini memastikan kebijakan vendor yang ditulis berdasarkan atribut publik platform dari versi sepolicy publik platform sebelumnya akan terus berfungsi. Pembuatan versi didasarkan pada variabel build PLATFORM_SEPOLICY_VERSION yang ditetapkan di AOSP untuk versi platform tertentu. File pemetaan terpisah ada untuk
setiap versi platform sebelumnya yang diharapkan dapat menerima
kebijakan vendor dari platform ini. Untuk mengetahui detail selengkapnya, lihat
Kompatibilitas kebijakan.
Android 11 dan yang lebih baru
Bagian ini membahas cara kebijakan SELinux dibuat di Android 11 dan yang lebih tinggi.
sepolicy system_ext dan product
Di Android 11, kebijakan system_ext dan kebijakan product ditambahkan. Seperti
kebijakan sepolicy platform, kebijakan system_ext dan kebijakan product dibagi menjadi
kebijakan publik dan kebijakan pribadi.
Kebijakan publik diekspor ke vendor. Jenis dan atribut menjadi API stabil, dan
kebijakan vendor dapat merujuk ke jenis dan atribut dalam kebijakan publik. Jenis diberi versi sesuai dengan PLATFORM_SEPOLICY_VERSION, dan kebijakan yang diberi versi disertakan dalam kebijakan vendor. Kebijakan asli disertakan ke setiap partisi system_ext dan product.
Kebijakan privasi berisi jenis, izin, dan atribut khusus system_ext dan khusus product yang diperlukan untuk fungsi partisi system_ext dan product.
Kebijakan pribadi tidak terlihat oleh vendor, yang berarti bahwa aturan ini bersifat internal dan diizinkan untuk diubah.
Pemetaan system_ext dan produk
system_ext dan product diizinkan mengekspor jenis publik yang ditetapkan ke vendor. Namun, setiap partner memiliki tanggung jawab untuk menjaga
kompatibilitas. Untuk kompatibilitas, partner dapat menyediakan file pemetaan mereka sendiri yang memetakan atribut berversi dari versi sebelumnya ke jenis konkret yang digunakan dalam sepolicy publik saat ini:
- Untuk menginstal file pemetaan untuk
system_ext, tempatkan file CIL yang berisi informasi pemetaan yang diinginkan ke{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil, lalu tambahkansystem_ext_{ver}.cilkePRODUCT_PACKAGES. - Untuk menginstal file pemetaan untuk
product, tempatkan file CIL yang berisi informasi pemetaan yang diinginkan ke{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil, lalu tambahkanproduct_{ver}.cilkePRODUCT_PACKAGES.
Lihat
contoh
yang menambahkan file pemetaan partisi product perangkat Redbull.
Kebijakan SELinux yang telah dikompilasi sebelumnya
Sebelum mengaktifkan SELinux, init mengumpulkan semua file CIL dari partisi (system, system_ext, product, vendor, dan odm) lalu mengompilasinya menjadi kebijakan biner, yaitu format yang dapat dimuat ke kernel.init Karena
kompilasi memerlukan waktu (biasanya 1-2 detik), file CIL dikompilasi sebelumnya pada waktu build dan
ditempatkan di /vendor/etc/selinux/precompiled_sepolicy atau
/odm/etc/selinux/precompiled_sepolicy, bersama dengan hash sha256 dari file CIL
input. Saat runtime, init memeriksa apakah ada file kebijakan yang telah diperbarui dengan membandingkan hash. Jika tidak ada yang berubah, init akan memuat kebijakan yang telah dikompilasi sebelumnya. Jika tidak,
init akan mengompilasi secara langsung dan menggunakannya, bukan yang telah dikompilasi sebelumnya.
Lebih khusus lagi, kebijakan yang telah dikompilasi sebelumnya digunakan jika semua kondisi berikut terpenuhi. Di sini,
{partition} merepresentasikan partisi tempat kebijakan yang telah dikompilasi sebelumnya berada: vendor atau odm.
/system/etc/selinux/plat_sepolicy_and_mapping.sha256dan/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256ada dan identik./system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256dan/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256tidak ada. Atau keduanya ada dan identik./product/etc/selinux/product_sepolicy_and_mapping.sha256dan/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256tidak ada. Atau keduanya ada dan identik.
Jika ada yang berbeda, init akan kembali ke jalur kompilasi di perangkat. Lihat
system/core/init/selinux.cpp untuk mengetahui detail selengkapnya.