Aplikasi istimewa adalah aplikasi sistem yang terletak di direktori priv-app
pribadi di salah satu partisi citra sistem. Partisi yang digunakan untuk rilis Android adalah
- Android 8.1 dan lebih rendah -
/system
- Android 9 dan lebih tinggi -
/system, /product, /vendor
Sepanjang halaman ini, /etc/permissions/priv-app
memutuskan untuk partition /etc/permissions/priv-app
.
Secara historis, produsen perangkat memiliki sedikit kendali atas tanda tangan|izin istimewa mana yang dapat diberikan ke aplikasi istimewa. Mulai Android 8.0, produsen harus secara eksplisit memberikan izin istimewa dalam file XML konfigurasi sistem di direktori /etc/permissions
. Mulai Android 9, pelaksana harus secara eksplisit memberikan atau menolak semua izin istimewa atau perangkat tidak bisa boot.
File privapp-permissions.xml
hanya dapat memberikan atau menolak izin untuk aplikasi istimewa di partisi yang sama. Misalnya, jika aplikasi di partisi /product
meminta izin istimewa, permintaan tersebut hanya dapat diberikan atau ditolak oleh file privapp-permissions.xml
yang juga ada di /product
.
Menambahkan daftar yang diizinkan
Daftar izin yang diizinkan untuk aplikasi dapat dicantumkan dalam satu XML atau dalam beberapa file XML yang terletak di direktori frameworks/base/etc/permissions
sebagai berikut:
-
/etc/permissions/privapp-permissions- OEM_NAME .xml
-
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
Tidak ada aturan ketat untuk mengatur konten. Pelaksana perangkat dapat menentukan struktur konten selama semua aplikasi dari /system/priv-app
diizinkan. Misalnya, Google memiliki satu daftar yang diizinkan untuk semua aplikasi istimewa yang dikembangkan oleh Google, dan merekomendasikan organisasi berikut:
- Izin untuk aplikasi yang sudah disertakan dalam pohon Android Open Source Project (AOSP) tercantum di
/etc/permissions/privapp-permissions-platform.xml
. - Izin untuk aplikasi Google tercantum di
/etc/permissions/privapp-permissions-google.xml
. - Untuk aplikasi lain, gunakan file dalam bentuk:
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
.
Membuat daftar yang diizinkan
Untuk membuat daftar yang diizinkan secara otomatis untuk semua aplikasi yang tersedia di citra sistem, gunakan alat baris perintah AOSP di development/tools/privapp_permissions/privapp_permissions.py
. Untuk membuat versi awal privapp-permissions.xml
khusus perangkat :
- Membangun citra sistem:
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
- Jalankan skrip
privapp_permissions.py
untuk menghasilkan fileprivapp-permissions.xml
yang mencantumkan semua tanda tangan|izin istimewa yang diperlukan untuk diizinkan: l10ndevelopment/tools/privapp_permissions/privapp_permissions.py
Alat ini mencetak konten XML yang dapat digunakan sebagai satu file, atau dipecah menjadi beberapa file di jalur direktori/etc/permissions
. Jika perangkat sudah menyertakan daftar yang diizinkan di direktori/etc/permissions
, alat ini hanya mencetak perbedaan (seperti tanda tangan yang hilang|izin istimewa yang perlu Anda tambahkan ke daftar yang diizinkan). Ini juga berguna untuk tujuan audit: Saat versi baru aplikasi ditambahkan, alat mendeteksi izin tambahan yang diperlukan. - Salin file yang dihasilkan ke direktori
/etc/permissions
yang sesuai, tempat sistem membaca file saat boot.
Menyesuaikan daftar yang diizinkan
AOSP menyertakan implementasi daftar yang diizinkan yang dapat disesuaikan sesuai kebutuhan. Izin untuk aplikasi yang disertakan dalam AOSP sudah diizinkan di /etc/permissions/privapp-permissions-platform.xml
.
Secara default, skrip privapp_permissions.py
menghasilkan keluaran yang secara otomatis memberikan izin apa pun yang diminta oleh aplikasi istimewa. Jika ada izin yang harus ditolak, edit XML untuk menggunakan tag "deny-permission" alih-alih tag "permission". Contoh:
<!-- This XML file declares which signature|privileged permissions to grant to privileged apps that come with the platform --> <permissions> <privapp-permissions package="com.android.backupconfirm"> <permission name="android.permission.BACKUP"/> <permission name="android.permission.CRYPT_KEEPER"/> </privapp-permissions> <privapp-permissions package="com.android.cellbroadcastreceiver"> <!-- Don't allow the application to interact across users --> <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MODIFY_PHONE_STATE"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/> </privapp-permissions> ...
Menemukan izin yang hilang
Untuk menemukan izin yang hilang saat membuka perangkat baru, aktifkan mode log transisi:
ro.control_privapp_permissions=log
Pelanggaran dilaporkan dalam file log, tetapi izin nonprivileged masih diberikan. Ini membuat perangkat dalam keadaan bekerja sambil memberikan daftar pelanggaran. Ini adalah format pesan kesalahan:
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist
Semua pelanggaran harus diatasi dengan menambahkan izin yang hilang ke daftar yang diizinkan.
- Di Android 8.0 dan yang lebih rendah, aplikasi yang terpengaruh tidak diberikan izin yang hilang meskipun berada di jalur
priv-app
pribadi. - Di Android 9 dan lebih tinggi, pelanggaran (izin istimewa ) berarti perangkat tidak bisa boot . Anda harus secara eksplisit mengizinkan atau menolak semua izin istimewa
Menegakkan daftar yang diizinkan
Setelah daftar yang diizinkan diterapkan, aktifkan penegakan waktu proses dengan menyetel properti build ro.control_privapp_permissions=enforce
.