Aplicaciones privilegiadas son aplicaciones del sistema que se encuentran en un priv-app
del directorio en una de las imágenes parciales del sistema. Las particiones utilizadas para las versiones de Android son
- Android 8.1 y menor -
/system
- Android 9 o superior - Los
/system, /product, /vendor
A través de esta página, /etc/permissions/priv-app
resuelve a partition /etc/permissions/priv-app
.
Históricamente, los fabricantes de dispositivos tenían poco control sobre lo que la firma | permisos privilegiados podían concederse a aplicaciones privilegiadas. A partir de Android 8.0, los fabricantes deben conceder explícitamente permisos privilegiados en los archivos XML de configuración del sistema en el /etc/permissions
directorio. A partir de Android 9, los implementadores deben otorgar o denegar explícitamente todos los permisos privilegiados o el dispositivo no arrancará.
El privapp-permissions.xml
archivo sólo puede conceder o denegar permisos para aplicaciones privilegiadas en la misma partición. Por ejemplo, si una aplicación en la /product
partición solicita permisos privilegiados, la solicitud sólo puede ser concedido o denegado por un privapp-permissions.xml
archivo que también está en /product
.
Agregar listas de permisos
Allowlists de permisos para aplicaciones se pueden enumerar en una sola XML o en varios archivos XML ubicados en el frameworks/base/etc/permissions
directorio 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. Ejecutores de dispositivos pueden determinar la estructura del contenido, siempre que todas las aplicaciones de /system/priv-app
se allowlisted. Por ejemplo, Google tiene una única lista de permisos para todas las aplicaciones privilegiadas desarrolladas por Google y recomienda la siguiente organización:
- Los permisos para aplicaciones que ya están incluidos en el árbol de Android Open Source Project (AOSP) se enumeran en
/etc/permissions/privapp-permissions-platform.xml
. - Los permisos para aplicaciones de Google se enumeran en
/etc/permissions/privapp-permissions-google.xml
. - Para otras aplicaciones, archivos de uso de la forma:
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
.
Generando listas de permitidos
Para generar automáticamente un AllowList para todas las aplicaciones disponibles en la imagen del sistema, utilice la herramienta de línea de comandos PSE al development/tools/privapp_permissions/privapp_permissions.py
. Para generar una versión inicial de específica del dispositivo privapp-permissions.xml
:
- Construir una imagen del sistema:
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
- Ejecutar el
privapp_permissions.py
script para generar unprivapp-permissions.xml
archivo que muestra todas firma | permisos privilegiados requiere para ser allowlisted:development/tools/privapp_permissions/privapp_permissions.py
Este contenido XML impresiones herramienta que se puede utilizar ya sea como un solo archivo, o dividido en varios archivos en el/etc/permissions
ruta del directorio. Si el dispositivo ya incluye allowlists en los/etc/permissions
directorios, la herramienta sólo imprime las diferencias (como la falta de firma | permisos privilegiados que hay que añadir a la AllowList). 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. - Copiar los archivos generados con la apropiada
/etc/permissions
de directorio, donde el sistema lee los archivos durante el arranque.
Personalizar listas de permisos
AOSP incluye una implementación de lista de permisos que se puede personalizar según sea necesario. Los permisos para aplicaciones incluidas en AOSP ya están en allowlisted /etc/permissions/privapp-permissions-platform.xml
.
Por defecto, el privapp_permissions.py
script genera de salida que automáticamente concede ningún tipo de permiso solicitado por una aplicación privilegiada. Si hay permisos que deben denegarse, edite el XML para usar una etiqueta "denegar-permiso" en lugar de una etiqueta "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 infracciones se informan en el archivo de registro, pero aún se otorgan permisos sin privilegios. Esto mantiene el dispositivo en un estado de funcionamiento al tiempo que 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 de permisos correspondientes.
- En Android 8.0 y más bajo, las aplicaciones afectadas no se conceden los permisos que faltan, incluso si están en el
priv-app
camino. - En Android 9 y superiores, violaciónes (de permisos privilegiados) significa que el dispositivo no arranca. Debe explícitamente permitir o denegar todos los permisos privilegiados
Hacer cumplir las listas de permisos
Después allowlists están en su lugar, permitir la aplicación de tiempo de ejecución mediante el establecimiento de las característica de la estructura ro.control_privapp_permissions=enforce
.