Lista de entidades permitidas de permisos con privilegios

Las apps con privilegios son apps del sistema que se encuentran en un directorio priv-app en una partición de imagen del sistema. Las particiones que se usan para las versiones de Android son las siguientes:

  • Android 9 y versiones posteriores: /system, /product, /vendor
  • Android 8.1 y versiones anteriores: /system

Históricamente, los fabricantes de dispositivos tenían poco control sobre los permisos de firma | privilegio que se podían otorgar a las apps con privilegios. A partir de Android 8.0, los fabricantes pueden otorgar permisos de privilegio de forma explícita en los archivos en formato XML de configuración del sistema en el directorio /etc/permissions. A partir de Android 9, los implementadores pueden otorgar o denegar de forma explícita todos los permisos de privilegio. Si no se otorgan permisos de privilegio, el dispositivo no se iniciará.

El archivo privapp-permissions.xml solo puede otorgar o denegar permisos para apps con privilegios en la misma partición. Por ejemplo, si una app en la partición /product solicita permisos de privilegio, la solicitud solo se puede otorgar o rechazar con un archivo privapp-permissions.xml en /product.

Agrega una lista de entidades permitidas

Las listas de entidades permitidas de permisos para apps se pueden enumerar en un solo archivo en formato XML o en varios archivos en formato XML ubicados en el directorio frameworks/base/etc/permissions:

  • /etc/permissions/privapp-permissions-OEM_NAME.xml
  • /etc/permissions/privapp-permissions-DEVICE_NAME.xml

No se aplica ninguna regla estricta a la organización del contenido. Los implementadores de dispositivos pueden determinar la estructura del contenido, siempre y cuando todas las apps de /system/priv-app estén incluidas en la lista de entidades permitidas. Por ejemplo, Google desarrolló una sola lista de entidades permitidas para todas las apps con privilegios. Te recomendamos la siguiente organización:

  • Los permisos de las apps que ya se incluyen en el árbol del Proyecto de código abierto de Android (AOSP) se enumeran en /etc/permissions/privapp-permissions-platform.xml.
  • Para otras apps, usa archivos del formato /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

Personaliza una lista de entidades permitidas

El AOSP incluye una implementación de lista de entidades permitidas que se puede personalizar según sea necesario.

Si se debe denegar un permiso, edita el archivo XML para usar una etiqueta deny-permission en lugar de una etiqueta permission. Por 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>
    ...

Cómo encontrar los permisos faltantes

Para encontrar los permisos faltantes cuando inicias un dispositivo nuevo, habilita el modo de registro de transición:

ro.control_privapp_permissions=log

Los incumplimientos se informan en el archivo de registro. Se otorgan permisos sin privilegios. De esta manera, se garantiza que el dispositivo permanezca en un estado de funcionamiento y, al mismo tiempo, se proporciona la lista de incumplimientos. El formato del mensaje de error es el siguiente:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist

Para abordar todos los incumplimientos, debes agregar los permisos faltantes a las listas de entidades permitidas correspondientes. Ten en cuenta lo siguiente:

  • En Android 9 y versiones posteriores, los incumplimientos de los permisos con privilegios impiden que el dispositivo se inicie. En su lugar, debes permitir o denegar explícitamente todos los permisos con privilegios.
  • En Android 8.0 y versiones anteriores, no se otorgan los permisos faltantes a las apps afectadas, a pesar de que se encuentran en la ruta de acceso priv-app.

Cómo aplicar una lista de entidades permitidas

Después de crear tus listas de entidades permitidas, habilita la aplicación forzosa del tiempo de ejecución configurando la propiedad de compilación ro.control_privapp_permissions=enforce.

La lista de entidades permitidas solo es necesaria para los permisos que declaran las apps con package="android". El estado de la propiedad ro.control_privapp_permissions debe cumplir con la sección 9.1 Permisos del documento de definición de compatibilidad (CDD).