Las aplicaciones privilegiadas son aplicaciones del sistema que se encuentran en un directorio priv-app
en una de las particiones de imagen del sistema. Las particiones utilizadas para las versiones de Android son
- Android 8.1 y versiones anteriores -
/system
- Android 9 y superior:
/system, /product, /vendor
A lo largo de esta página, /etc/permissions/priv-app
se resuelve en la partition /etc/permissions/priv-app
.
Históricamente, los fabricantes de dispositivos tenían poco control sobre qué firmas (permisos privilegiados ) se podían otorgar a las aplicaciones privilegiadas. A partir de Android 8.0, los fabricantes deben otorgar explícitamente permisos privilegiados en los archivos XML de configuración del sistema en el directorio /etc/permissions
. A partir de Android 9, los implementadores deben otorgar o denegar explícitamente todos los permisos privilegiados o el dispositivo no se iniciará.
El archivo privapp-permissions.xml
solo puede otorgar o denegar permisos para aplicaciones privilegiadas en la misma partición. Por ejemplo, si una aplicación en la partición /product
solicita permisos privilegiados, la solicitud solo puede ser otorgada o denegada por un archivo privapp-permissions.xml
que también está en /product
.
Agregar listas de permitidos
Las listas de permisos permitidos para las aplicaciones se pueden enumerar en un solo XML o en varios archivos XML ubicados en el directorio frameworks/base/etc/permissions
de la siguiente manera:
-
/etc/permissions/privapp-permissions- OEM_NAME .xml
-
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
No existe una regla estricta para organizar el contenido. Los implementadores de dispositivos pueden determinar la estructura del contenido siempre que todas las aplicaciones de /system/priv-app
estén en la lista de permitidos. Por ejemplo, Google tiene una única lista blanca para todas las aplicaciones privilegiadas desarrolladas por Google y recomienda la siguiente organización:
- Los permisos para las aplicaciones que ya están incluidas en el árbol del Proyecto de código abierto de Android (AOSP) se enumeran en
/etc/permissions/privapp-permissions-platform.xml
. - Los permisos para las aplicaciones de Google se enumeran en
/etc/permissions/privapp-permissions-google.xml
. - Para otras aplicaciones, use archivos con el formato:
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
.
Generación de listas de permitidos
Para generar automáticamente una lista de permitidos para todas las aplicaciones disponibles en la imagen del sistema, use la herramienta de línea de comando AOSP en development/tools/privapp_permissions/privapp_permissions.py
. Para generar una versión inicial de privapp-permissions.xml
específico del dispositivo:
- Cree una imagen del sistema:
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
- Ejecute el script
privapp_permissions.py
para generar un archivoprivapp-permissions.xml
que enumere todos los permisos privilegiados de firma necesarios para estar en la lista de permitidos:development/tools/privapp_permissions/privapp_permissions.py
Esta herramienta imprime contenido XML que puede usarse como un solo archivo o dividirse en varios archivos en la ruta del directorio/etc/permissions
. Si el dispositivo ya incluye listas de permitidos en los directorios/etc/permissions
, la herramienta solo imprime las diferencias (como la firma faltante|permisos privilegiados que necesita agregar a la lista de permitidos). Esto también es útil para fines de auditoría: cuando se agrega una nueva versión de la aplicación, la herramienta detecta los permisos adicionales necesarios. - Copie los archivos generados en el directorio
/etc/permissions
apropiado, donde el sistema lee los archivos durante el arranque.
Personalización de listas de permitidos
AOSP incluye una implementación de lista de permitidos que se puede personalizar según sea necesario. Los permisos para las aplicaciones incluidas en AOSP ya están en la lista de permitidos en /etc/permissions/privapp-permissions-platform.xml
.
De manera predeterminada, el script privapp_permissions.py
genera una salida que otorga automáticamente cualquier permiso solicitado por una aplicación privilegiada. Si hay permisos que se deben denegar, edite el XML para usar una etiqueta de "denegación de permiso" en lugar de una etiqueta de "permiso". Ejemplo:
<!-- 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> ...
Encontrar permisos faltantes
Para encontrar los permisos que faltan al abrir un nuevo dispositivo, habilite el modo de registro de transición:
ro.control_privapp_permissions=log
Las violaciones se informan en el archivo de registro, pero aún se otorgan permisos sin privilegios. Esto mantiene el dispositivo en un estado de funcionamiento mientras proporciona la lista de infracciones. Este es el formato del mensaje de error:
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist
Todas las infracciones deben abordarse agregando los permisos que faltan a las listas permitidas correspondientes.
- En Android 8.0 y versiones anteriores, las aplicaciones afectadas no obtienen los permisos que faltan, incluso si están en la ruta
priv-app
privada. - En Android 9 y superior, las violaciones (de permisos privilegiados ) significan que el dispositivo no arranca . Debe permitir o denegar explícitamente todos los permisos privilegiados
Hacer cumplir las listas de permitidos
Una vez que las listas de permitidos estén en su lugar, habilite la aplicación del tiempo de ejecución configurando la propiedad de compilación ro.control_privapp_permissions=enforce
.