Membangun Kebijakan SELinux

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.
  • 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.
Gambar 1 . SELinux membangun logika

File sepolicy terdiri dari beberapa file sumber:

  • policy.conf teks biasa dihasilkan dengan menggabungkan security_classes , initial_sids , *.te files, genfs_contexts , dan port_contexts dalam urutan itu.
  • Untuk setiap file (seperti security_classes ), isinya adalah gabungan dari file dengan nama yang sama di bawah system/sepolicy/ dan BOARDS_SEPOLICY_DIRS .
  • policy.conf dikirim ke compiler SELinux untuk pemeriksaan sintaks 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 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 tambahkan system_ext_{ver}.cil ke PRODUCT_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 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 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:

    1. Mengonversi kebijakan ke format SELinux Common Intermediate Language (CIL), khususnya:
      1. kebijakan platform publik (sistem + system_ext + produk)
      2. gabungan kebijakan pribadi + publik
      3. publik + vendor dan kebijakan 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 kebijakan publik + vendor + BOARD_SEPOLICY_DIRS untuk bagian mana yang harus diubah menjadi atribut yang akan ditautkan ke kebijakan platform.
    3. 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.
    4. Menggabungkan file kebijakan (jelaskan solusi pada perangkat dan 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 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 .

    • 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 salah satu dari mereka berbeda, init kembali ke jalur kompilasi di perangkat. Lihat system/core/init/selinux.cpp untuk lebih jelasnya.