Membangun Kebijakan SELinux

Artikel ini membahas bagaimana kebijakan SELinux dibuat. Kebijakan SELinux dibangun dari kombinasi kebijakan inti AOSP (platform) dan kebijakan khusus perangkat (vendor). Alur pembuatan kebijakan SELinux untuk Android 4.4 hingga Android 7.0 menggabungkan semua fragmen sepolicy lalu menghasilkan file monolitik di direktori root. Ini berarti 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, 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 independen dari pembaruan platform.

Namun, karena file kebijakan SELinux yang termodulasi disimpan di partisi /vendor , proses init harus memasang partisi sistem dan vendor lebih awal sehingga dapat membaca file SELinux dari partisi tersebut dan menggabungkannya dengan file inti SELinux di direktori sistem (sebelum memuatnya ke dalam kernelnya).

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.
  • system/sepolicy : Konfigurasi kebijakan inti Android SELinux, termasuk konteks dan file kebijakan. Logika pembuatan sepolicy utama juga ada di sini ( system/sepolicy/Android.mk ).

Untuk detail lebih lanjut tentang file di system/sepolicy Implementasi SELinux .

Android 7.0 dan versi lebih lama

Bagian ini membahas bagaimana kebijakan SELinux dibuat di Android 7.x dan versi 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 mungkin 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 di perangkat:

Gambar ini menunjukkan logika build SELinux untuk Android 7.x.
Gambar 1 . Logika pembuatan SELinux

File sepolicy terdiri dari beberapa file sumber:

  • policy.conf teks biasa dihasilkan dengan menggabungkan file security_classes , initial_sids , *.te , genfs_contexts , dan port_contexts dalam urutan itu.
  • Untuk setiap file (seperti security_classes ), isinya adalah gabungan file dengan nama yang sama di bawah system/sepolicy/ dan BOARDS_SEPOLICY_DIRS .
  • policy.conf dikirim ke kompiler SELinux untuk pemeriksaan sintaksis dan dikompilasi ke dalam format biner sebagai sepolicy pada perangkat.
    Gambar ini menunjukkan file yang menghasilkan file kebijakan SELinux untuk Android 7.x.
    Gambar 2 . File kebijakan SELinux

file SELinux

Setelah kompilasi, perangkat Android yang menjalankan 7.x dan versi lebih lama 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 lebih jelasnya, lihat Menerapkan SELinux .

Inisialisasi SELinux

Saat sistem boot, SELinux berada dalam mode permisif (dan bukan 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.
  • Jalankan re-exec() untuk menerapkan aturan domain SELinux pada dirinya sendiri.

Untuk mempersingkat waktu booting, lakukan re-exec() pada proses init secepatnya.

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 dengan tetap menjaga kompatibilitas.

Kebijakan platform selanjutnya dibagi menjadi bagian platform pribadi dan platform publik untuk mengekspor jenis dan atribut tertentu ke penulis kebijakan vendor. Tipe/atribut publik platform dijamin 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

Platform public sepolicy mencakup semua yang didefinisikan dalam 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 sepolicy yang diekspor oleh platform tempat pengembang kebijakan vendor (yaitu perangkat) dapat menulis kebijakan tambahan khusus perangkat.

Jenis dibuat berdasarkan versi kebijakan yang digunakan untuk menulis file vendor, yang ditentukan oleh variabel build PLATFORM_SEPOLICY_VERSION . Kebijakan publik yang telah diversi 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 sesuai dengan versi platform yang digunakan untuk menulis kebijakan perangkat.

Kebijakan pribadi platform

Sepolicy privat platform mencakup semua yang ditentukan di bawah /system/sepolicy/private . Bagian kebijakan ini membentuk tipe, izin, dan atribut khusus platform yang diperlukan untuk fungsionalitas platform. Ini tidak diekspor ke vendor/device . Penulis kebijakan non-platform tidak boleh menulis ekstensi kebijakan mereka berdasarkan jenis/atribut/aturan yang ditentukan dalam kebijakan privat platform. Selain itu, aturan-aturan ini diperbolehkan untuk diubah atau mungkin hilang sebagai bagian dari pembaruan kerangka kerja saja.

Pemetaan pribadi platform

Pemetaan privat 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. Hal 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 diatur dalam AOSP untuk versi platform tertentu. File pemetaan terpisah tersedia untuk setiap versi platform sebelumnya yang diharapkan dapat menerima kebijakan vendor dari platform ini. Untuk detail lebih lanjut, lihat Kompatibilitas .

Android 11 dan lebih tinggi

system_ext dan kebijakan produk

Di Android 11, kebijakan system_ext dan kebijakan produk ditambahkan. Seperti kebijakan seplatform, kebijakan system_ext dan kebijakan produk dibagi menjadi kebijakan publik dan kebijakan swasta.

Kebijakan publik diekspor ke vendor. Tipe dan atribut menjadi API yang stabil, dan kebijakan vendor dapat merujuk pada tipe dan atribut dalam kebijakan publik. Jenis dibuat berdasarkan PLATFORM_SEPOLICY_VERSION , dan kebijakan versi disertakan dalam kebijakan vendor. Kebijakan asli disertakan pada setiap partisi system_ext dan produk.

Kebijakan privat 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, yang menyiratkan bahwa aturan ini bersifat internal dan boleh diubah.

system_ext dan pemetaan produk

system_ext dan product diizinkan mengekspor tipe publik yang ditunjuk ke vendor. Namun, tanggung jawab untuk menjaga kecocokan 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 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 tambahkan system_ext_{ver}.cil ke PRODUCT_PACKAGES .
  • Untuk menginstal file pemetaan untuk produk, tempatkan file cil yang berisi informasi pemetaan yang diinginkan ke {PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil , lalu tambahkan product_{ver}.cil ke PRODUCT_PACKAGES .
  • Lihat contoh yang menambahkan file pemetaan partisi produk perangkat redbull.

    Membangun kebijakan SELinux

    Kebijakan SELinux di Android 8.0 dibuat dengan menggabungkan bagian dari /system dan /vendor . Logika untuk menyiapkan ini dengan tepat ada di /platform/system/sepolicy/Android.mk .

    Kebijakan ada di lokasi berikut:

    Lokasi Mengandung
    system/sepolicy/public API sepolicy platform
    system/sepolicy/private Detail implementasi platform (vendor dapat mengabaikannya)
    system/sepolicy/vendor File kebijakan dan konteks yang dapat digunakan vendor (vendor dapat mengabaikannya 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 sepolicy System_ext
    SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 dan lebih tinggi) Detail implementasi System_ext (vendor dapat mengabaikannya)
    PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 dan lebih tinggi) API sepolicy produk
    PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 dan lebih tinggi) Detail implementasi produk (vendor dapat mengabaikannya)

    Sistem build mengambil kebijakan ini dan menghasilkan komponen kebijakan sistem, system_ext, produk, vendor, dan odm pada partisi yang sesuai. Langkah-langkahnya meliputi:

    1. Mengonversi kebijakan ke format SELinux Common Intermediate Language (CIL), khususnya:
      1. kebijakan platform publik (sistem + system_ext + produk)
      2. gabungan kebijakan swasta + publik
      3. kebijakan publik + vendor dan BOARD_SEPOLICY_DIRS
    2. Membuat versi kebijakan yang disediakan oleh publik sebagai bagian dari kebijakan vendor. Dilakukan dengan menggunakan kebijakan CIL publik yang dihasilkan untuk menginformasikan gabungan kebijakan publik + vendor + BOARD_SEPOLICY_DIRS mengenai bagian mana yang harus diubah menjadi atribut yang akan dihubungkan ke kebijakan platform.
    3. Membuat file pemetaan yang menghubungkan platform dan bagian vendor. Awalnya, ini hanya menghubungkan tipe dari kebijakan publik dengan atribut terkait dalam kebijakan vendor; nantinya hal ini juga akan memberikan dasar untuk file yang dikelola di versi platform mendatang, sehingga memungkinkan kompatibilitas dengan kebijakan vendor yang menargetkan versi platform ini.
    4. Menggabungkan file kebijakan (menjelaskan solusi pada perangkat dan solusi yang telah dikompilasi sebelumnya).
      1. Gabungkan pemetaan, platform, dan kebijakan vendor.
      2. Kompilasi file kebijakan biner keluaran.

    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 mengompilasinya ke dalam kebijakan biner, format yang dapat dimuat ke kernel. Karena kompilasi membutuhkan waktu (biasanya 1-2 detik), file CIL dikompilasi terlebih dahulu 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 akan dikompilasi dengan cepat dan menggunakannya sebagai pengganti yang sudah dikompilasi sebelumnya.

    Lebih khusus lagi, kebijakan yang telah dikompilasi sebelumnya digunakan jika semua kondisi berikut terpenuhi. Di sini, {partition} mewakili partisi tempat kebijakan yang telah dikompilasi ada: vendor atau odm .

    • 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.

    Jika ada yang berbeda, init kembali ke jalur kompilasi pada perangkat. Lihat system/core/init/selinux.cpp untuk lebih jelasnya.