特権権限の許可リスト

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

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

これまでデバイス メーカーは、特権アプリにどの署名 | 特権の権限を付与するかをほとんど制御できませんでした。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 は、すべての特権アプリを登録する許可リストを 1 つ作成し、以下のように整理することを推奨しています。

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

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

AOSP には、必要に応じてカスタマイズできる許可リスト実装が用意されています。

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

許可リストを強制的に適用する

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

許可リストへの登録は、package="android" を持つアプリで宣言された権限に対してのみ必要です。ro.control_privapp_permissions プロパティの状態は、互換性定義ドキュメント(CDD)の第 9.1 節の権限に準拠している必要があります。