特権を許可リストに登録する

特権アプリは、いずれかのシステム イメージ パーティションの priv-app ディレクトリにあるシステムアプリです。Android リリースで使用されるパーティションは次のとおりです。

  • Android 8.1 以前 - /system
  • Android 9 以降 - /system, /product, /vendor

このページ全体を通して、/etc/permissions/priv-apppartition/etc/permissions/priv-app に解決されます。

これまでデバイス メーカーは、特権アプリにどの署名 / 特権の権限を付与するかをほとんど制御できませんでした。Android 8.0 以降、メーカーは /etc/permissions ディレクトリのシステム構成 XML ファイルで、明示的に特権を付与する必要があります。Android 9 以降、実装者はすべての特権を明示的に許可または拒否する必要があります。そうしないとデバイスが起動しません。

privapp-permissions.xml ファイルで権限を許可または拒否できるのは、同じパーティション上の特権アプリに対してのみです。たとえば、/product パーティション上のアプリが特権をリクエストする場合、そのリクエストは同じ /product にある privapp-permissions.xml ファイルによってのみ、許可または拒否できます。

許可リストを追加する

アプリの権限許可リストは、次のように frameworks/base/etc/permissions ディレクトリにある単一の XML ファイルまたは複数の XML ファイルにリストできます。

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

コンテンツの整理について厳格なルールはありません。/system/priv-app のアプリがすべて許可リストに登録されている限り、デバイス実装者はコンテンツ構造を決定できます。たとえば Google には、Google が開発したすべての特権アプリの許可リストが 1 つあり、次のように整理することをおすすめしています。

  • すでに Android オープンソース プロジェクト(AOSP)ツリーに含まれているアプリの権限は、/etc/permissions/privapp-permissions-platform.xml にリストする。
  • Google アプリの権限は、/etc/permissions/privapp-permissions-google.xml にリストする。
  • 他のアプリの場合は、/etc/permissions/privapp-permissions-DEVICE_NAME.xml の形式のファイルを使用する。

許可リストをカスタマイズする

AOSP には、必要に応じてカスタマイズできる許可リスト実装が用意されています。 AOSP に備えられたアプリの権限は、すでに /etc/permissions/privapp-permissions-platform.xml で許可リストに登録されています。

拒否すべき権限がある場合は、XML を編集して「permission」タグではなく「deny-permission」タグを使用するようにします。例:

<!-- 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>
    ...

不足している権限を特定する

新しいデバイスを起動するときに不足している権限を特定するには、移行ログモードを有効にします。

ro.control_privapp_permissions=log

違反はログファイルに記録されますが、特権以外の権限は引き続き付与されます。 これにより、デバイスの動作状態を維持しながら、違反のリストが提供されます。エラー メッセージの形式は次のとおりです。

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

不足している権限を適切な許可リストに追加することで、すべての違反に対処する必要があります。

  • Android 8.0 以前では、影響を受けるアプリが priv-app パスにある場合でも、不足している権限は付与されません。
  • Android 9 以降では、(特権の)違反は、デバイスが起動しないことを意味します。すべての特権を明示的に許可または拒否する必要があります。

許可リストを適用する

許可リストを設定したら、ビルド プロパティ ro.control_privapp_permissions=enforce を設定してランタイムの適用を有効にします。