特権アプリは、いずれかのシステム イメージ パーティションの priv-app
ディレクトリにあるシステムアプリです。Android リリースで使用されるパーティションは次のとおりです。
- Android 8.1 以前 -
/system
- Android 9 以降 -
/system, /product, /vendor
このページ全体を通して、/etc/permissions/priv-app
は partition/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
を設定してランタイムの適用を有効にします。