特権アプリは、いずれかのシステム イメージ パーティションの 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
ファイルで権限を許可または拒否できるのは、同じパーティション上の特権アプリに対してのみです。たとえば、/vendor
パーティション上のアプリが特権をリクエストする場合、そのリクエストは同じ /vendor
にある 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
の形式のファイルを使用する。
ホワイトリストの生成
システム イメージで使用可能なすべてのアプリのホワイトリストを自動的に生成するには、development/tools/privapp_permissions/privapp_permissions.py
の AOSP コマンドライン ツールを使用します。デバイス固有の privapp-permissions.xml
の初期バージョンを生成する手順は次のとおりです。
- システム イメージをビルドします。
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
privapp_permissions.py
スクリプトを実行してprivapp-permissions.xml
ファイルを生成します。このファイルには、ホワイトリスト登録する必要があるすべての署名 / 特権の権限がリストされます。 このツールは、単一のファイルとして使用できる、またはdevelopment/tools/privapp_permissions/privapp_permissions.py
/etc/permissions
ディレクトリ パスの複数のファイルに分割できる、XML コンテンツを出力します。デバイスに/etc/permissions
ディレクトリのホワイトリストがすでに含まれている場合、ツールは差分のみを出力します(ホワイトリストに追加する必要があるもののうち、不足している署名 / 特権の権限など)。これは監査の観点からも有用です。新しいバージョンのアプリが追加されると、ツールは必要な追加の権限を検出します。- 生成されたファイルを適切な
/etc/permissions
ディレクトリにコピーします。このディレクトリでは、システムが起動時にファイルを読み取ります。
ホワイトリストのカスタマイズ
AOSP には、必要に応じてカスタマイズできるホワイトリスト実装が用意されています。
AOSP に備えられたアプリの権限は、すでに /etc/permissions/privapp-permissions-platform.xml
でホワイトリストに登録されています。
デフォルトでは、privapp_permissions.py
スクリプトは特権アプリがリクエストした権限を自動的に付与する出力を生成します。拒否すべき権限がある場合は、XML を編集して「permission」タグではなく「deny-permission」タグを使用するようにします。例:
<!-- This XML file declares which signature|privileged permissions should be granted 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 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 whitelist
不足している権限を適切なホワイトリストに追加することで、すべての違反に対処する必要があります。
- Android 8.0 以前では、影響を受けるアプリが
priv-app
パスにある場合でも、不足している権限は付与されません。 - Android 9 以降では、(特権の)違反は、デバイスが起動しないことを意味します。すべての特権を明示的に許可または拒否する必要があります。
ホワイトリストの適用
ホワイトリストを設定したら、ビルド プロパティ ro.control_privapp_permissions=enforce
を設定してランタイムの適用を有効にします。