Lista de entidades permitidas de permisos con privilegios

Las apps privilegiadas son apps del sistema ubicadas 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 | privilegiados que se podían otorgar a las apps privilegiadas. A partir de Android 8.0, los fabricantes pueden otorgar explícitamente permisos con privilegios en los archivos XML de configuración del sistema en el directorio /etc/permissions. A partir de Android 9, los implementadores pueden otorgar o denegar explícitamente todos los permisos privilegiados. Si no se otorgan los permisos con privilegios, 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 privilegiados, la solicitud solo se puede otorgar o rechazar con un archivo privapp-permissions.xml en /product.

Cómo agregar una lista de entidades permitidas

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

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

No se aplica ninguna regla estricta sobre cómo se organiza el contenido. Los implementadores de dispositivos pueden determinar la estructura del contenido, siempre y cuando todas las apps de /system/priv-app estén 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 para 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 con el siguiente formato: /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

Cómo personalizar 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 rechazar un permiso, edita el 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 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 registran en el archivo de registro. Se otorgan permisos sin privilegios. De esta manera, se garantiza que el dispositivo siga funcionando 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

Todas las infracciones se deben solucionar agregando 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 se inicie el dispositivo. En cambio, debes permitir o rechazar explícitamente todos los permisos privilegiados.
  • En Android 8.0 y versiones anteriores, los permisos faltantes no se otorgan a las apps afectadas a pesar de estar 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 del tiempo de ejecución configurando la propiedad de compilación ro.control_privapp_permissions=enforce.

La inclusión en la lista de entidades permitidas solo es obligatoria para los permisos declarados por 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).