Artikel ini membahas bagaimana kebijakan SELinux dibuat. Kebijakan SELinux dibangun dari kombinasi kebijakan AOSP inti (platform) dan kebijakan khusus perangkat (vendor). Alur pembuatan kebijakan SELinux untuk Android 4.4 hingga Android 7.0 menggabungkan semua fragmen sepolicy kemudian menghasilkan file monolitik di direktori root. Ini berarti bahwa 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 lebih tinggi, platform dan kebijakan vendor dibuat secara terpisah. SOC dan OEM dapat memperbarui bagian kebijakan mereka, membuat image (seperti, vendor.img
dan boot.img
), lalu memperbarui image tersebut terlepas dari pembaruan platform.
Namun, karena file kebijakan SELinux termodulasi disimpan di partisi /vendor
, proses init
harus me-mount sistem dan partisi vendor lebih awal sehingga dapat membaca file SELinux dari partisi tersebut dan menggabungkannya dengan file inti SELinux di direktori sistem (sebelum memuatnya ke inti).
File sumber
Logika untuk membangun SELinux ada di file-file ini:
-
external/selinux
: Proyek SELinux eksternal, digunakan untuk membangun utilitas baris perintah HOST untuk mengkompilasi kebijakan dan label SELinux.-
external/selinux/libselinux
: Android hanya menggunakan subset dari proyeklibselinux
eksternal bersama dengan beberapa penyesuaian khusus Android. Untuk detailnya, lihatexternal/selinux/README.android
. -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: SELinux policy compiler (host yang dapat dieksekusi:checkpolicy
,checkmodule
, dandispol
). Tergantung padalibsepol
.
-
-
system/sepolicy
: Konfigurasi kebijakan inti Android SELinux, termasuk konteks dan file kebijakan. Logika pembangunan sepolicy utama juga ada di sini (system/sepolicy/Android.mk
).
Untuk detail lebih lanjut tentang file di system/sepolicy
Implementing SELinux .
Android 7.0 dan sebelumnya
Bagian ini membahas bagaimana kebijakan SELinux dibuat di Android 7.x dan yang lebih lama.
Membangun kebijakan SELinux
Kebijakan SELinux dibuat dengan menggabungkan kebijakan inti AOSP dengan penyesuaian khusus perangkat. Kebijakan gabungan kemudian diteruskan ke penyusun kebijakan dan berbagai pemeriksa. Kustomisasi 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 pencarian file kebijakan tambahan.
Misalnya, vendor SoC dan ODM masing-masing dapat menambahkan direktori, satu untuk pengaturan khusus SoC dan satu lagi untuk pengaturan khusus perangkat, untuk menghasilkan konfigurasi SELinux akhir untuk perangkat tertentu:
-
BOARD_SEPOLICY_DIRS += device/ SOC /common/sepolicy
-
BOARD_SEPOLICY_DIRS += device/ SoC / DEVICE /sepolicy
Konten file file_contexts di system/sepolicy
dan BOARD_SEPOLICY_DIRS
digabungkan untuk menghasilkan file_contexts.bin
pada perangkat:
![Gambar ini menunjukkan logika build SELinux untuk Android 7.x.](https://source.android.com/static/security/selinux/images/n-selinux-build-logic.png?authuser=7&hl=id)
File sepolicy
terdiri dari beberapa file sumber:
-
policy.conf
teks biasa dihasilkan dengan menggabungkansecurity_classes
,initial_sids
,*.te
files,genfs_contexts
, danport_contexts
dalam urutan itu. - Untuk setiap file (seperti
security_classes
), isinya adalah gabungan dari file dengan nama yang sama di bawahsystem/sepolicy/
danBOARDS_SEPOLICY_DIRS
. -
policy.conf
dikirim ke compiler SELinux untuk pemeriksaan sintaks dan dikompilasi ke dalam format biner sebagaisepolicy
pada perangkat.Gambar 2 . File kebijakan SELinux
file SELinux
Setelah dikompilasi, perangkat Android yang menjalankan 7.x dan sebelumnya biasanya berisi file terkait SELinux berikut:
-
selinux_version
- sepolicy: keluaran biner setelah menggabungkan file kebijakan (seperti,
security_classes
,initial_sids
, dan*.te
) -
file_contexts
-
property_contexts
-
seapp_contexts
-
service_contexts
-
system/etc/mac_permissions.xml
Untuk detail lebih lanjut, lihat Menerapkan SELinux .
inisialisasi SELinux
Saat sistem boot, SELinux dalam mode permisif (dan tidak dalam mode penegakan). Proses init melakukan tugas-tugas berikut:
- Memuat file
sepolicy
dari ramdisk ke kernel melalui/sys/fs/selinux/load
. - Mengalihkan SELinux ke mode penegakan.
- Menjalankan
re-exec()
untuk menerapkan aturan domain SELinux ke dirinya sendiri.
Untuk mempersingkat waktu boot, lakukan re-exec()
pada proses init
sesegera mungkin.
Android 8.0 dan lebih tinggi
Di Android 8.0, kebijakan SELinux dibagi menjadi komponen platform dan vendor untuk memungkinkan pembaruan kebijakan platform/vendor independen sambil mempertahankan kompatibilitas.
Kebijakan platform selanjutnya dibagi menjadi platform pribadi dan bagian 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 tipe/atribut publik platform sebelumnya dapat dijamin untuk beberapa versi menggunakan file pemetaan platform.
Kebijakan publik platform
Sepolicy publik platform mencakup semua yang didefinisikan di bawah system/sepolicy/public
. Platform dapat menganggap jenis dan atribut yang ditentukan berdasarkan kebijakan publik adalah API yang stabil untuk versi platform tertentu. Ini merupakan bagian dari kebijakan yang diekspor oleh platform tempat pengembang kebijakan vendor (yaitu perangkat) dapat menulis kebijakan khusus perangkat tambahan.
Jenis diversi menurut versi kebijakan yang menjadi dasar penulisan file vendor, yang ditentukan oleh variabel build PLATFORM_SEPOLICY_VERSION
. Kebijakan publik berversi kemudian disertakan dengan kebijakan vendor dan (dalam bentuk aslinya) dalam kebijakan platform. Dengan demikian, kebijakan akhir mencakup kebijakan platform pribadi, kebijakan publik platform saat ini, kebijakan khusus perangkat, dan kebijakan publik berversi yang sesuai dengan versi platform yang menjadi dasar penulisan kebijakan perangkat.
Kebijakan pribadi platform
Platform private sepolicy mencakup semua yang didefinisikan di bawah /system/sepolicy/private
. Bagian dari kebijakan ini membentuk jenis, izin, dan atribut khusus platform yang diperlukan untuk fungsionalitas platform. Ini tidak diekspor ke pembuat kebijakan vendor/device
. Penulis kebijakan non-platform tidak boleh menulis ekstensi kebijakan mereka berdasarkan jenis/atribut/aturan yang ditentukan dalam sepolicy pribadi platform. Selain itu, aturan ini diizinkan untuk dimodifikasi atau mungkin hilang sebagai bagian dari pembaruan kerangka saja.
Pemetaan pribadi platform
Pemetaan pribadi platform mencakup pernyataan kebijakan yang memetakan atribut yang diekspos dalam kebijakan publik platform dari versi platform sebelumnya ke tipe konkret yang digunakan dalam kebijakan publik platform saat ini. Ini memastikan kebijakan vendor yang ditulis berdasarkan atribut publik platform dari versi kebijakan publik platform sebelumnya terus berfungsi. Pembuatan versi didasarkan pada variabel build PLATFORM_SEPOLICY_VERSION
yang ditetapkan dalam AOSP untuk versi platform tertentu. Ada file pemetaan terpisah untuk setiap versi platform sebelumnya yang diharapkan dapat menerima kebijakan vendor dari platform ini. Untuk detail selengkapnya, lihat Kompatibilitas .
Android 11 dan lebih tinggi
system_ext dan kebijakan produk
Di Android 11, kebijakan system_ext dan kebijakan produk ditambahkan. Seperti kebijakan platform, kebijakan system_ext dan kebijakan produk dibagi menjadi kebijakan publik dan kebijakan pribadi.
Kebijakan publik diekspor ke vendor. Jenis dan atribut menjadi API yang stabil, dan kebijakan vendor dapat merujuk ke jenis dan atribut dalam kebijakan publik. Jenis diversi menurut PLATFORM_SEPOLICY_VERSION
, dan kebijakan berversi disertakan ke kebijakan vendor. Kebijakan asli disertakan ke masing-masing system_ext dan partisi produk.
Kebijakan pribadi berisi tipe, izin, dan atribut system_ext-only dan product-only yang diperlukan untuk fungsionalitas system_ext dan partisi produk. Kebijakan pribadi tidak terlihat oleh vendor, menyiratkan bahwa aturan ini bersifat internal dan diizinkan untuk dimodifikasi.
system_ext dan pemetaan produk
system_ext dan produk diizinkan untuk mengekspor tipe publik yang ditentukan ke vendor. Namun, tanggung jawab untuk menjaga kompatibilitas ada pada masing-masing pasangan. Untuk kompatibilitas, mitra dapat menyediakan file pemetaan mereka sendiri yang memetakan atribut berversi dari versi sebelumnya ke tipe konkret yang digunakan dalam kebijakan 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}.cil
kePRODUCT_PACKAGES
. - Untuk memasang file pemetaan produk, tempatkan file cil yang berisi informasi pemetaan yang diinginkan ke
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, lalu tambahkanproduct_{ver}.cil
kePRODUCT_PACKAGES
. Lihat contoh yang menambahkan file pemetaan partisi produk perangkat redbull. - Mengonversi kebijakan ke format SELinux Common Intermediate Language (CIL), khususnya:
- kebijakan platform publik (sistem + system_ext + produk)
- gabungan kebijakan pribadi + publik
- publik + vendor dan kebijakan
BOARD_SEPOLICY_DIRS
- Membuat versi kebijakan yang disediakan oleh publik sebagai bagian dari kebijakan vendor. Dilakukan dengan menggunakan kebijakan CIL publik yang dihasilkan untuk menginformasikan kebijakan publik + vendor +
BOARD_SEPOLICY_DIRS
untuk bagian mana yang harus diubah menjadi atribut yang akan ditautkan ke kebijakan platform. - Membuat file pemetaan yang menghubungkan platform dan bagian vendor. Awalnya, ini hanya menautkan tipe dari kebijakan publik dengan atribut yang sesuai dalam kebijakan vendor; nanti juga akan memberikan dasar untuk file yang dipelihara di versi platform mendatang, memungkinkan kompatibilitas dengan kebijakan vendor yang menargetkan versi platform ini.
- Menggabungkan file kebijakan (jelaskan solusi pada perangkat dan yang telah dikompilasi sebelumnya).
- Gabungkan pemetaan, platform, dan kebijakan vendor.
- Kompilasi file kebijakan biner keluaran.
- Baik
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
dan/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
ada dan identik. - Baik
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256
dan/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256
tidak ada. Atau keduanya ada dan identik. - Baik
/product/etc/selinux/product_sepolicy_and_mapping.sha256
dan/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256
tidak ada. Atau keduanya ada dan identik.
Membangun kebijakan SELinux
Kebijakan SELinux di Android 8.0 dibuat dengan menggabungkan potongan dari /system
dan /vendor
. Logika untuk mengatur ini dengan tepat ada di /platform/system/sepolicy/Android.mk
.
Kebijakan ada di lokasi berikut:
Lokasi | Mengandung |
---|---|
system/sepolicy/public | API kebijakan platform |
system/sepolicy/private | Detail implementasi platform (vendor dapat mengabaikan) |
system/sepolicy/vendor | File kebijakan dan konteks yang dapat digunakan vendor (vendor dapat mengabaikan jika diinginkan) |
BOARD_SEPOLICY_DIRS | kebijakan vendor |
BOARD_ODM_SEPOLICY_DIRS (Android 9 dan lebih tinggi) | Kebijakan aneh |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 dan lebih tinggi) | API kebijakan System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 dan lebih tinggi) | Detail implementasi System_ext (vendor dapat mengabaikan) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 dan lebih tinggi) | API kebijakan produk |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 dan lebih tinggi) | Detail penerapan produk (vendor dapat mengabaikan) |
Sistem build mengambil kebijakan ini dan menghasilkan komponen kebijakan sistem, system_ext, produk, vendor, dan odm pada partisi yang sesuai. Langkah-langkahnya meliputi:
Kebijakan SELinux yang telah dikompilasi sebelumnya
Sebelum init
mengaktifkan SELinux, init
mengumpulkan semua file CIL dari partisi ( system
, system_ext
, product
, vendor
dan odm
) dan mengkompilasinya ke dalam kebijakan biner, format yang dapat dimuat ke kernel. Karena kompilasi membutuhkan waktu (biasanya 1-2 detik), file CIL sudah dikompilasi sebelumnya pada waktu pembuatan dan ditempatkan di /vendor/etc/selinux/precompiled_sepolicy
atau /odm/etc/selinux/precompiled_sepolicy
, bersama dengan hash sha256 dari file CIL masukan. Saat runtime, init
memeriksa apakah ada file kebijakan yang telah diperbarui dengan membandingkan hash. Jika tidak ada yang berubah, init
memuat kebijakan yang telah dikompilasi sebelumnya. Jika tidak, init
mengkompilasi dengan cepat dan menggunakannya sebagai ganti yang telah dikompilasi sebelumnya.
Lebih khusus lagi, kebijakan yang telah dikompilasi digunakan jika semua kondisi berikut terpenuhi. Di sini, {partition}
mewakili partisi tempat kebijakan yang telah dikompilasi ada: vendor
atau odm
.
Jika salah satu dari mereka berbeda, init
kembali ke jalur kompilasi di perangkat. Lihat system/core/init/selinux.cpp
untuk lebih jelasnya.